2015-10-22 29 views
1

時:再次基於創建一個新的當我犯ammending

git checkout -b branch1 
git commit -m "A" 
git checkout -b branch2 
git commit -m "B" 
-- oups did errors when committed in branch1 
git checkout branch1 
git commit --amend --no-edit 
git checkout branch2 
git rebase branch1 
-- resolve conflicts 
git checkout --theirs file 
git rebase --continue 

現在,我仍然看到第一次提交(A - > A - > B)

什麼是正確的命令來使用,所以我不要沒有那個承諾。

+0

將所有提交添加到單個提交中。 –

回答

2

對於你的問題的回答將會相當長,因爲你給了我們很多命令,並且下面有很多命令。

首先,你從第三個分支開始,我將其稱爲start,因爲缺乏更好的名稱。

git checkout start 
git checkout -b branch1 
git commit -m "A" 
git checkout -b branch2 
git commit -m "B" 

這些命令離開你branch1branch2看起來像這樣:

branch1: M <- A 
branch2: M <- A <- B 

這裏提交M是一個(或多個)將提交從start分支,它是branch1branch2之間的共同祖先的到來。請注意,由於您在branch1上創建了branch2,因此branch2A提交自branch1

git checkout branch1 
git commit --amend --no-edit 

這使得本:

branch1: M <- A' 
branch2: M <- A <- B 

在這裏,我已經標記爲Abranch1與撇號,以表明它是一個不同承諾比以前因爲你修改它。

git checkout branch2 
git rebase branch1 

branch1: M <- A' 
branch2: M <- A' <- A'' <- B 

這裏,A''提交實際上A承諾是(你修改之前),和A'提交是A提交你修改它。

你需要決定你想在這裏做什麼。你可以壓扁兩個A提交到一個,你可以保留只是A',你可以保留只是A'',或者你可以保持兩個。無論如何,我在這裏推薦的工具是交互模式下的git rebase

因此,而不是做一個正常的底墊中,你可以這樣做:

git checkout branch2 
git rebase -i branch1 

這將帶來提交列表,你可以選擇你想每個人做什麼:

pick 9361ckv Some earlier commit M from the start branch 
pick 62eed47 Amended commit A 
pick 39dne92 Original commit A 
pick k3nos9s Commit B 

關鍵字pick意味着每個提交都將被保留。如果仔細檢查提交列表,您會看到它從最早到最新列出了在您的原始rebase之後目前出現在branch2中的提交。這不是你想要的。假設你想刪除原始A的commit(上面標示爲A''),那麼你就刪除包含此犯行,讓你與此列表:

pick 9361ckv Some earlier commit M from the start branch 
pick 62eed47 Amended commit A 
pick k3nos9s Commit B 

現在,當你完成了底墊,你的分支看起來就像這樣:

branch1: M <- A' 
branch2: M <- A' <- B 

這裏branch2只有經修訂A提交從branch1到來。

相關問題