2015-09-28 25 views
8

Il mio tipico flusso di lavoro git è quello di creare un ramo di funzione fuori dal ramo principale, effettuare piccoli commit, mentre periodicamente si unisce dal master lungo la strada per tenere il passo.Rebase interattivo dopo l'unione/altro commit interleaving mine

Quindi apro una richiesta pull su github e quando viene accettato eliminerò il ramo. Mi piacerebbe rebase in modo interattivo di più, ma quando lo farò incontrerò commit di unione e commit di altre persone interconnessi con il mio. Non sono sicuro di come/se riuscirò a schiacciare quei commit o il gruppo/schiacciare il mio da solo?

Per esempio, il mio git log per il mio ramo potrebbe apparire come questo, quando arriva il momento di rebase:

merge commit 
someone else's commit 
one of my commits 
another one of my commits 
another merge commit 
another person's commit 
one of my commits, the first one after branching 

Ho problemi con ciò che è possibile e cosa non lo è quando si fa un rebase interattivo e schiacciamento e il riordino si impegna. Dato il flusso di lavoro sopra, cosa consiglieresti?

+1

c'è un motivo che si sta utilizzando rebase? – ilj

+0

@ilj Gli altri membri del team amano mantenere una cronologia pulita il più possibile, quindi è necessario mantenere la cronologia del commit ragionevole. Personalmente non mi interessa una storia ragionevolmente loquace (non completamente fuori linea) – jkj2000

+0

nella mia esperienza crea più problemi che soluzioni. – ilj

risposta

3

Il processo che utilizziamo nel mio ufficio consiste nel rifondare al ramo master (o in qualsiasi altro ramo in cui ci si aspetta che si uniscano) prima di unire la richiesta di pull. Ciò assicura che i commit sono ordinate in cima a tutte le altre impegna attualmente in master, che elimina la suddivisione delle vostre impegna con gli altri:

> git fetch upstream master 
> git rebase upstream/master 
+1

Vedo, grazie. Quindi mi ricollego periodicamente dal master, piuttosto che unirlo. – jkj2000

2

io non sono sicuro di come/se posso schiacciare quei commit o gruppo/schiacciare il mio da solo?

Squash solo i tuoi commit non altri !!

Recentemente, ho affrontato lo stesso problema, ho avuto 41 commit sulle mie richieste di pull, il mio ramo ha avuto un conflitto di fusione e la mia richiesta di pull era vecchia. Ho dovuto affrontare alcuni dei problemi che stai affrontando ora. Toccerò solo qualcosa che ho implementato.

one of my commits 
another one of my commits 
one of my commits, the first one after branching 

suggerisco di squash solo i commit (tutti di loro se si desidera).

Ad esempio, se si dispone di 3 commit, è possibile schiacciarli e trasformarli in uno utilizzando il rebase interattivo. Vedi sotto comando:

$ git rebase -i HEAD~n 

Per esempio, si vuole schiacciare 3 commit:

$ git rebase -i HEAD~3 

Ora, si vede un'interfaccia rebase interattivo, in cui è possibile scrivere riformulare/prendersela primo commit e squash su resto di loro. Si prega di vedere questo video per una migliore comprensione.

Squashing commits

merge commit 
someone else's commit 
another merge commit 
another person's commit 

Rebase ad altri (qualcun altro) commette

Questo è il problema comune tutti volti quando si utilizza git. Immagina di lavorare sul tuo repository locale. Dopo aver lavorato per un po ', hai fatto qualche commit, ora vuoi spingerli al repository remoto originale. Fantastico, hai fatto questo git push che dice il problema merge commit.

Sapete che qualcun altro potrebbe aver commesso lo stesso repo remoto che viene aggiornato ora. Dal momento che il repository locale non è aggiornato a quello remoto, c'è merge commit problem. Ora, se eliminiamo questo problema? Possiamo aggiornare il repository della nostra macchina locale al telecomando originale? È possibile?

Sì, è possibile, è possibile farlo ridiscutendo. Come?

Quando si esegue:

git pull --rebase 

cosa sta succedendo qui? Git riavvolgerà (annulla) tutti i tuoi commit locali, abbatterà i commit remoti e poi ripeterà i tuoi commit locali in aggiunta ai commit remoti appena estratti. Se sorgono conflitti che Git non è in grado di gestire, ti verrà data l'opportunità di unire manualmente i commit, quindi esegui semplicemente git rebase --continue per continuare a riprodurre i tuoi commit locali.

Vai a questa blog post per maggiori dettagli

Se si desidera unire la vostra filiale a padroneggiare?

Best (and safest) way to merge a git branch into master

Problemi correlati