2010-09-12 39 views
310

在Git中,是否有辦法將所有更改從一個分支合併到另一個分支,但同時壓縮爲單個提交?合併來自另一個分支的所有更改作爲單個提交

我經常在一個單獨的分支中使用新功能,並定期提交/推送 - 主要用於備份或將正在處理的內容傳輸到另一臺計算機。主要是那些提交說「特徵xxx WIP」或其他冗餘。

一旦這項工作完成,我想合併WIP分支回到主,我想放棄所有這些中間提交,只是一個簡單的提交。

有沒有簡單的方法來做到這一點?

另外,如果一個命令將一個分支上的所有提交壓縮爲一個命令,那麼它是如何分支的呢?

回答

403

另一種選擇是git merge --squash <feature branch>後來終於做了git commit

Git merge

--squash

--no-squash

生產工作樹和索引狀態,就像一個真正的合併 發生(除合併 信息),但實際上並沒有做 提交或移動HEAD,也不記錄 $GIT_DIR/MERGE_HEAD導致t他接下來 git commit命令創建合併 提交。這允許您在當前的 分支之上創建一個 單個提交,其效果與合併另一分支(或更多 八爪魚的情況下的 )相同。

+0

很酷的功能!我喜歡git。我肯定會在將來使用這個,我仍然建議你去了解一下rebase -i的方法,這是一個很好的技巧,以防萬一你真的想讓它們超過一次提交。 – 2012-02-10 17:21:33

+2

A警告:這是有效的,但默認的提交消息包括來自被合併分支的日誌,問題是它看起來與你通常看到的顯示的整個文本實際上並不是提交消息的一部分的格式類似,但是在所以如果你不想要所有這些,你需要手動從你的提交信息中刪除它,我應該在使用它之前對它進行測試...... – 2014-08-13 01:30:08

+5

這樣,並且被警告分支不會被視爲合併ttp://stackoverflow.com/questions/19308790/git-branch-merged-no-merged-and-squash-option – rxgx 2014-10-03 23:07:15

-5

你可以用「rebase」命令來做到這一點。讓我們把樹枝「主」和「功能」:

git checkout feature 
git rebase main 

底墊命令將重播所有提交的關於「功能」爲一體,具有等於「主」父提交。

如果自從創建「特徵」(或自最近的合併以來)「主」已更改,則可能需要在git rebase main之前運行git merge main。這樣,如果您遇到合併衝突,您仍然擁有完整的歷史記錄。

底墊後,您可以將您的分支合併到主,這將導致一個快進合併:

git checkout main 
git merge feature 

一個很好的概述

+0

這不適合我。我剛剛創建了一個簡單的測試回購,使用WIP分支,並嘗試了上述操作,併發生了合併衝突(儘管我沒有對主數據庫進行任何更改)。 – 2010-09-13 00:14:09

+0

如果功能是從main(git checkout -b feature main)創建的,並且您最近從main進行了合併,那麼您不應該從rebase – NamshubWriter 2010-09-13 00:17:57

+0

OK得到衝突,然後再次嘗試。這次沒有發生衝突,但歷史並沒有受到壓制。 – 2010-09-13 00:23:09

19

上嘗試git rebase -i masterrebase頁的Understanding Git Conceptually您的功能分支。然後,您可以將除「一個」之外的所有內容都更改爲「壓扁」以合併提交。請參閱squashing commits with rebase

最後,您可以從主分支合併。

+5

是的,但我不想要交互式底線的麻煩。自從分支變平以後,我只想要一切。 – 2010-09-13 00:18:02

+2

+1這使得歷史記錄清晰。識別和管理提交作爲單獨的補丁,卡片,故事等更容易。 – rxgx 2014-10-03 22:59:21

165

找到了!合併命令有在這一點上一切--squash選項

git checkout master 
git merge --squash WIP 

合併,可能有衝突,但沒有承諾。所以,我現在可以:

git add . 
git commit -m "Merged WIP" 
+0

'git add .'做什麼? – 2015-12-23 22:01:06

+0

@MichaelPotter它增加了所有的文件和更改 – 2016-01-05 18:34:54

+0

'git add .'在當前目錄中添加了所有不被忽略的文件,我會提防用這種方式拾取非預期的文件。 – 2016-01-07 19:02:56

-1

git merge --squash <feature branch>是一個不錯的選擇。「git commit」告訴你所有的功能分支提交信息與你選擇保留它。

少提交合並。

git merge 做x次--git reset HEAD^--soft 然後git commit。

風險 - 刪除的文件可能會回來。

0

我想將主人的所有提交壓縮成一個。我想這不成功:

$ git checkout --orphan new_master 
$ git merge --squash master 
fatal: Squash commit into empty head not supported yet 

所以我這樣做:

$ tar cf /tmp/git.tar --exclude .git . 
$ git checkout --orphan new_master 
$ tar xf /tmp/git.tar 
$ git commit -m "Initial commit" 

這很好地工作。

相關問題