2011-09-18 16 views
19

Background:Git: duplicato commette dopo rebase locale, poi tirare

ho una caratteristica ramo Un cioè un commit prima del mio ramo di sviluppo:

3 (develop, origin/develop) 
| 2 (A, origin/A) some feature branch commit 
|/ 
1 some commit 

Poi ho REBASE A su sviluppare (git checkout A, git rebase develop), in modo da ottenere:

2' (A) some feature branch commit 
| 
3 (develop, origin/develop) 
| 2 (origin/A) some feature branch commit 
|/ 
1 some commit 

Ora non può più spingere A-origin come G rifiuterà un commit in avanti non veloce. Mi dice di estrarre prima le modifiche remote.

Quando lo faccio e poi spingere, io alla fine con la seguente storia:

4 (A, origin/A) merged origin/A into A 
|\ 
2'| some feature branch commit 
| | 
3 | (develop, origin/develop) 
| 2 (origin/A) some feature branch commit 
|/ 
1 some commit 

io alla fine con una storia che contiene il 2 commettere due volte - tecnicamente diversi commit, anche se fanno la stessa cosa.

Domande

  1. Come posso evitare che ciò accada? Come posso eseguire il mirroring della mia operazione di rebase locale sul repository remoto?
  2. Come posso risolvere questa situazione? Quale sarebbe il modo più elegante per ripulire la cronologia e mostrare solo un commit?
+0

Non è possibile rebase sviluppare su A? – Mat

+0

Puoi invece fare una fusione di git? –

+0

possibile duplicato di [I commit Git sono duplicati nello stesso ramo dopo aver eseguito un rebase] (http://stackoverflow.com/questions/9264314/git-commits-are-duplicated-in-the-same-branch-after-doing -a -base) – Whymarrh

risposta

24
  1. Un rebase sta riscrivendo la storia - per evitare guai non rebase le cose che vengono spinti.

  2. È possibile push --force mentre A è stato ritirato. La cronologia origin/A verrà sovrascritta con la tua versione di A. Nota che ciò richiederà in seguito un intervento manuale da parte di altri sviluppatori nei loro repository.

+0

Beh ... se lo metti in questo modo, lo fai sembrare semplice. – avdgaag

+0

Per il repository GitHub di JBoss AS 7, è stato deciso che non vogliono le unioni nella cronologia, quindi tutti i rami vengono reimpostati. Quindi ogni ramo di funzionalità deve essere trattato in questo modo, ei sub-commiter devono sincronizzare (rebase) solo su questo ramo. Può diventare abbastanza complicato. –

4

Come posso impedire che il suo accada? Come posso eseguire il mirroring della mia operazione di rebase locale sul repository remoto?

Come posso risolvere questa situazione? Quale sarebbe il modo più elegante per ripulire la cronologia di uno show solo un commit?

Eliminare il ramo remoto e ripulire il nuovo ramo successivo. Se altri membri della tua squadra potrebbero aver estratto il tuo ramo "A", fai sapere loro di eliminare quel ramo e di ritirare una nuova versione.

+2

... e se (probabilmente) lavorano su quel ramo, dì loro di rebase sul ramo che hai appena ribadito. –