之間我的樹是這個樣子:還原幾個錯誤提交,但保持了良好犯
A --> B --> C --> D --> E
一個好提交, B,d,E是錯誤的合併, Ç是一個很好的承諾。
所以我需要保持A和C,並擺脫其他。 有沒有一個很好的方法來做到這一點? 在此先感謝所有Git-ninjas。
之間我的樹是這個樣子:還原幾個錯誤提交,但保持了良好犯
A --> B --> C --> D --> E
一個好提交, B,d,E是錯誤的合併, Ç是一個很好的承諾。
所以我需要保持A和C,並擺脫其他。 有沒有一個很好的方法來做到這一點? 在此先感謝所有Git-ninjas。
您可以使用git cherry-pick
。
在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
這給了我一個信息'B是一個合併,但沒有-m選項被給出。' –
@Mighter見編輯請 –
如果我這樣做,我應該再次合併一切嗎?因爲另一個人正在合併所有...... –
如果提交的 「推」(公開),您應恢復做任何的
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
編輯文件以僅保留您想要的提交。
'git checkout -B master A;如果你還沒有按下,請選擇「git cherry-pick C」。 – jthill
@jthill我有。 –