2012-07-30 16 views
13

E 'possibile condensare i commit su un ramo in un singolo commit prima di fondersi con il main? Ho pensato che sarebbe stato uno scenario abbastanza comune, ma forse non sto usando i termini di ricerca giusti.Flatten si impegna su un ramo

Spiegherò lo scenario in modo più dettagliato. Spesso vorrei fare molti commit locali mentre lavoro su un cambiamento in una filiale per assicurarmi di avere una cronologia completa delle modifiche. Ma una volta passati i cambiamenti nel ramo, quando mi unisco al main, vorrei ridurre i commit sul ramo ad uno solo e poi unirlo al main. Capisco che i commit sono poco costosi in Git, ma in alcune situazioni, preferirei semplicemente farlo.

* merge to main 
|\ 
* | commit 2 on main 
* | commit 1 on main 
| * commit 2 on branch 
| * commit 1 on branch 
|/ 
* branch from main 

da apportare per assomigliare

* merge to main 
|\ 
* | commit 2 on main 
* | commit 1 on main 
| * commit on branch (branch commits flattened to one) 
|/ 
* branch from main 

Sono un novizio quando si tratta di git. Se ho sbagliato nell'uso dei termini, mi scuso.

risposta

12

Utilizzare il ricaricamento interattivo. Trova il commit in cui la filiale è discostato da master (può utilizzare git merge-base; chiamiamolo il commit <diverge>), quindi

git rebase -i <diverge> 

e un editor si aprirà, che consente di riscrivere la storia in modo interattivo. Avrai voglia di schiacciare i commit.

+1

Grazie. Dopo aver cercato in giro per ulteriori informazioni sul tuo suggerimento, ho trovato questo (http://ariejan.net/2011/07/05/git-squash-your-latests-commits-into-one/) post anche che passa attraverso un esempio. –

2

Vedere git rebase. L'opzione -i ti dà la possibilità di modificare, schiacciare (cosa vuoi), o persino rimuovere, commettere.

Per esempio, il modo in cui lo uso in genere è così:

git rebase -i origin/master 
.... 
git push 
17

Suggerirei imparare ad usare il rebase interattivo, ma nel caso in cui sembra troppo complicato per voi, si può semplicemente utilizzare

git reset --soft <diverging-commit>

per annullare tutte impegna fino al punto divergenti senza cambiare l'indice, e

git commit -s

per eseguire un singolo commit di tutte le modifiche.

10

È inoltre possibile utilizzare git merge --squash <branch> per unire un ramo senza eseguire alcun commit:

$ git checkout master 
$ git merge --squash mybranch 
... 
Squash commit -- not updating HEAD 
Automatic merge went well; stopped before committing as requested 
$ git commit 

Naturalmente, si deve resistere alla tentazione di fare questo se si può farne a meno. Vedi Thou Shalt Not Lie: git rebase, amend, squash, and other lies per una discussione sul perché.

+6

L'articolo sulla menzogna sembra eccessivamente preoccupato di "mentire per farti sembrare buono". Va bene, ma come riorganizzare i commit per rendere la revisione del codice più semplice per il revisore, un obiettivo onorevole. Quanto male starebbe in questo contesto? – guioconnor

Problemi correlati