2016-07-25 182 views
1

我有一個關於如何將我的更改從一個分支合併到另一個分支的問題。下面是對事物的計劃:git - 將一系列提交合併爲一個提交

有三個分支:碩士(M),功能(F)和發展(d)

d創建關中號之前F的創建,又出發了M.理想的情況下,d應該已經由F創建,具有層次結構:

 M 
     | 
     | 
     F 
     | 
     | 
     D 

M始終更新至其他提交的更改。

現在在我的D分支上,這些更改包含一系列提交,我想將它們合併爲F作爲一個提交。我怎麼做?這反過來將在稍後合併到M中。

請注意,d和F可以在M.

由於可以分出不同的提交!

回答

7

現在我d分支,這些變化包括一系列提交我想合併到F其中作爲一個犯

git checkout F 
git merge --squash D 
git commit 
+0

當我做一個'git log'時,輸出顯示被壓扁在一起的提交列表。有沒有辦法做到這一點,只有新的提交ID和評論'合併'會顯示? – Maddy

+1

是的,使用'git commit -m '。一個空的'git commit'使用'merge --squash'中的默認值,它是分支提交的連接列表。 – RJFalconer

+0

非常整潔,也可能是最安全的方式,因爲不涉及任何rebase。 –

1

現在在我的D分支上,更改包含一系列提交,我希望將它合併爲F作爲一個提交。我怎麼做?

git checkout D 
git rebase -i F  # pick "squash" for every commit 

git checkout F 
git merge D 

http://gitready.com/advanced/2009/02/10/squashing-commits-with-rebase.html一個很好的例子(但它確實不是很複雜,git help rebase應該足夠爲好)。基本上,您編輯git rebase -i提供給您的文件,並在所有行上輸入「squash」。

這反過來將被合併到M稍後。

git checkout M 
git merge F 
2

您正在尋找git rebase命令。對於簡單的情況下,做

git checkout D 
git rebase F 

或者,做

git rebase D F 

這不會擠進一個提交。要做到這一點,可能是最不容易出錯的選擇將是做一個互動承諾:

git checkout D 
git rebase -i F 

這將顯示在D的提交是將要重建基礎的編輯器。它會是這個樣子:

pick 293a24d Some commit message 
pick a015bbe Some commit message 
pick e19f4fa Some commit message 
pick 40ae959 Some commit message 
pick fba6b72 Some commit message 

# Rebase 419206d..fba6b72 onto de95063 
# 
# Commands: 
# p, pick = use commit 
# r, reword = use commit, but edit the commit message 
# e, edit = use commit, but stop for amending 
# s, squash = use commit, but meld into previous commit 
# f, fixup = like "squash", but discard this commit's log message 
# 
# If you remove a line here THAT COMMIT WILL BE LOST. 
# However, if you remove everything, the rebase will be aborted. 
# 

按照說明和更改所有,但第一行開始與squash,而不是pick。這會讓您選擇在保存並退出編輯器時合併郵件。

或者,您可以將配合pick更改爲reword,其餘配置更改爲fixup。這隻會向您顯示第一個提交消息。如果您想完全丟棄所有舊的提交消息,則此選項更簡單。

最後,如果你感覺很冒險,你可以自動過濾提交列表中,繞過底墊的第一個互動部分:

EDITOR='sed -i -e "2,$s/pick/squash/"' git rebase -i F 

這將自動更改picksquash上開始與所有行第二行是通過sed而不是通常的交互式編輯器來過濾編輯器文件。

+0

衍合是一個強大的工具,可以讓你在一個奇怪的狀態,如果你不小心。如果您不熟悉命令,在繼續操作之前備份您的回購是明智的。 –

+0

-1;這不是OP所要求的。是的,他提到D應該是F而不是M,但這不是他的問題;他想壓縮一個承諾,這不是一個簡單的基金會會做什麼。 – RJFalconer

+0

@JoeChrysler我認爲這是不好的建議。無論源代碼管理如何,Repos都應備份。像這樣的評論會嚇跑人們使用'git'。怎樣才能真正地混淆他的回購?'git rebase --abort'或'git checkout' /'git reset'無法修復? – RJFalconer