2012-07-30 93 views
13

在合併主分支之前,是否可以將分支上的提交壓縮爲單個提交?我認爲這將是一個相當常見的情況,但也許我沒有使用正確的搜索條件。在一個分支上展開提交

我會更詳細地解釋場景。我經常想在分支變更的同時進行許多本地提交,以確保我有全面的變更歷史記錄。但一旦通過分支中的更改,當我合併到main中時,我想將分支上的提交減少爲單個分支,然後將其合併到main中。我明白在Git中提交的代碼價格低廉,但在某些情況下,我可能更願意這樣做。

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

要做出樣子

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

我是一個新手,當談到與git。如果我錯誤地使用了術語,我會道歉。

回答

12

使用交互式重新綁定。查找提交您的分支從主分歧(可以使用git merge-base;讓我們調用commit <diverge>),然後

git rebase -i <diverge> 

和編輯器會彈出,允許你改寫歷史交互。你會想壓縮提交。

+1

謝謝。在四處尋找更多關於你的提示之後,我發現這個(http://ariejan.net/2011/07/05/git-squash-your-latests-commits-into-one/)帖子以及與例。 – 2012-07-31 14:51:30

2

看看git rebase-i選項可讓您有機會編輯,擠壓(想要的),甚至刪除提交。

例如,我用它通常的方式是:

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

我建議學習使用互動變基,但在情況下,它似乎太複雜的話,你可以簡單地使用

git reset --soft <diverging-commit>

取消所有提交到分叉點不改變指數,並

git commit -s

做出所有更改的單個提交。

10

您還可以使用git merge --squash <branch>將分支合併不執行任何提交:

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

當然,你應該抵制的衝動,這樣做,如果你能幫助它。有關爲什麼討論,請參閱Thou Shalt Not Lie: git rebase, amend, squash, and other lies

+6

關於說謊的文章似乎過分關注「說謊讓你看起來不錯」。這一切都很好,但如何重新組織提交,使審閱者的代碼審查變得更簡單,這是一個光榮的目標。在這種情況下會有多糟糕? – guioconnor 2015-12-15 12:03:01

相關問題