2013-10-21 18 views
2

之間我的樹是這個樣子:還原幾個錯誤提交,但保持了良好犯

A --> B --> C --> D --> E 

一個好提交, B,d,E是錯誤的合併, Ç是一個很好的承諾。

所以我需要保持A和C,並擺脫其他。 有沒有一個很好的方法來做到這一點? 在此先感謝所有Git-ninjas。

+0

'git checkout -B master A;如果你還沒有按下,請選擇「git cherry-pick C」。 – jthill

+0

@jthill我有。 –

回答

0

您可以使用git cherry-pick

1

在Git中,還原一個承諾只是承諾,不完整的系列,導致其撤銷,所以你只需要:

git revert E 
git revert D 
git revert B 

現在我注意到你指定這些提交了合併,所以你「會需要指定要保留父,所以使用-m parentNumber標誌:

# revert the E commit, keeping the state of the first parent 
git revert -m 1 E 
# (and similar for the others...) 

即。看看下面的圖表承諾:

-------R--S--M 
-P--Q-------/ 

在這裏,我們有兩個「分支」這得到了在M合併。如果你告訴git回覆M,它不知道你是否想讓代碼保持在提交狀態S或者提交狀態Q,所以你需要告訴git你想要哪個父合併。因爲有壞提交

1)儘可能多就回到:

git commit -m 1 M # will leave you in commit S 
git commit -m 2 M # will leave you in commit Q 
+0

這給了我一個信息'B是一個合併,但沒有-m選項被給出。' –

+0

@Mighter見編輯請 –

+0

如果我這樣做,我應該再次合併一切嗎?因爲另一個人正在合併所有...... –

0

如果提交的 「推」(公開),您應恢復做任何的

git revert E 
git revert D 
git revert B 

2)你可以通過這樣做提交單個回覆:

git checkout B -b temp 
    git rebase -i A 

編輯文件以僅保留要恢復和壓扁的提交成爲一個單一的提交。

git revert <that single commit> 

    git checkout E 
    git cherry-pick <revert from that single commit> 

然後您需要編輯提交消息,以便它在您的原始E分支中有意義。

但是,如果提交是本地的並且從未發佈過,則應該將其刪除,而不是更乾淨的樹。

git checkout B -b temp 
    git rebase -i A 

編輯文件以僅保留您想要的提交。

相關問題