對於你的問題的回答將會相當長,因爲你給了我們很多命令,並且下面有很多命令。
首先,你從第三個分支開始,我將其稱爲start
,因爲缺乏更好的名稱。
git checkout start
git checkout -b branch1
git commit -m "A"
git checkout -b branch2
git commit -m "B"
這些命令離開你branch1
和branch2
看起來像這樣:
branch1: M <- A
branch2: M <- A <- B
這裏提交M
是一個(或多個)將提交從start
分支,它是branch1
和branch2
之間的共同祖先的到來。請注意,由於您在branch1
上創建了branch2
,因此branch2
的A
提交自branch1
。
git checkout branch1
git commit --amend --no-edit
這使得本:
branch1: M <- A'
branch2: M <- A <- B
在這裏,我已經標記爲A
犯branch1
與撇號,以表明它是一個不同承諾比以前因爲你修改它。
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
到來。
將所有提交添加到單個提交中。 –