2016-07-19 44 views
0

提交我試圖撤消在中間提交,同時保持以下的人不變。我認爲這可能是不可能的,找到這些帖子:Post 1 & Post 2。 (最終目標可能會重複,但我確實沒有工作,我對此表示歉意。)使用'混帳rebase`除去中間

不幸的是,我仍然堅持如何正確使用git rebase -i。我創建了一個樣本回購如下:

commit cc2576365a9716bb9f96e195e599190d3c70fba0 
Author: zzy 
Date: Sun Jul 17 14:30:53 2016 -0400 
commit #3 

commit 11d9f8fdc69be8b4530e4b70c9661b4e34287afe 
Author: zzy 
Date: Sun Jul 17 14:30:36 2016 -0400 
commit #2 

commit 4770e08eb54d0d582bd4b391f2361a328b417cdf 
Author: zzy 
Date: Sun Jul 17 14:29:58 2016 -0400 
commit #1 

,每次提交增加了在一個叫a文件的新線(見下文a的內容):

提交後#1

1 

提交後#2

1 
2 

提交後#3

1 
2 
3 

現在我打算移除提交#2,和a應該是這樣的:

1 
3 

我試着命令git rebase -i 11d9f8fdc69be8^並獲得文本文件:

pick 11d9f8f commit #2 
pick cc25763 commit #3 

我刪除了第一行,只保留了提交#3並退出了文件。但我得到以下錯誤:

error: could not apply cc25763... commit #3 

When you have resolved this problem, run "git rebase --continue". 
If you prefer to skip this patch, run "git rebase --skip" instead. 
To check out the original branch and stop rebasing, run "git rebase --abort". 
Could not apply cc2576365a9716bb9f96e195e599190d3c70fba0... commit #3 

和文件a變爲:

1 
<<<<<<< HEAD 
======= 
2 
3 
>>>>>>> cc25763... commit #3 

我很困惑,爲什麼2還在這裏,爲什麼有衝突。任何人都可以幫助我獲得預期的結果嗎?提前致謝!

+4

您在提交時引入的更改彼此太接近。它們不重疊,但爲了確保沒有丟失,'Git'和任何其他'diff'程序在diff中至少包含兩行上下文(前一個和後一個)。從這個角度來看,您提交引入的更改重疊,這就是發生衝突的原因。再次嘗試使用更大的文件,並注意將更改分開幾行,並按預期工作。 – axiac

+2

除了[什麼axiac提到](http://stackoverflow.com/questions/38468446/use-git-rebase-to-remove-a-commit-in-the-middle#comment64341138_38468446),你可能想設置合併.conflictstyle'設爲'diff3',這樣Git就會向你展示不僅僅是兩個不同的版本,而且也是通用的基礎部分。這對於這個特別簡單的例子並不是很有用,但總的來說,我發現使用'diff3'模式集讀取合併衝突更容易。 – torek

+0

@axiac謝謝soooooooo多!!!!是的,我改變了一個更大的例子,使用完全相同的命令,它的工作原理! – zzy

回答

2

基本上,因爲這兩個承諾#2,#提交3改變了這一切均在同一文件中非常接近其他線路,混帳不知道怎麼和「重播」的修改提交#3,現在提交# 2不再存在,所以你會發生衝突。

在包含衝突的文件,你會看到這一點:

<<<<<<< HEAD 
======= 
2 
3 
>>>>>>> cc25763... commit #3 

<<<<<<< HEAD=======之間的空間顯示了包含在該位置的文件在提交#1日前提交#2或承諾#3被創造。 =======>>>>>>> cc25763... commit #3之間的空格包含在提交#3和提交#3添加後提交#3中該文件的該部分的內容。 Git的希望你使用這些信息來手動決定什麼內容版本提交#3現在應該包含你想重播沒有提交#2。

替換文件與你想要的文件包含後提交#3重播什麼整段。在這種情況下,你會替換:

<<<<<<< HEAD 
======= 
2 
3 
>>>>>>> cc25763... commit #3 

有了:

3 

然後,運行git add a階段性這些變化,並git rebase --continue繼續重訂。

請注意,您只需在遇到衝突時重新綁定時執行此操作。對於改變不相關事物的提交(例如,如果提交#2和#3完全改變完全不同的文件,或者完全改變同一文件的不同部分),git rebase通常可以確定自動進行哪些更改,並且不會遇到衝突。