2017-09-26 102 views
0

夥計, 我有以下提交推送到遠程主人。git恢復選擇性更改

commit fba0f87 
commit 1025716 
commit 0f2d03c 
commit 6449799 
commit 4854bf7 

所以現在我的腦袋壞了,我想恢復原狀。我想刪除提交1025716和6449799,但保留其餘的。我怎樣才能做到這一點? 如何創建只有fba0f87,0f2d03c和4854bf7發生更改的新提交,並推送該提交以使主服務器恢復正常。

+0

承諾是永久的,不可改變的:你不能從中間刪除一個。你可以簡單地*停止使用*到最後,但如果你需要在中間撤銷某些東西,那麼最好的辦法是通常應用一個新的提交(Git稱之爲「還原」)先前的提交。應用前一個提交的Git命令拼寫爲'git revert'。 – torek

+0

唯一可行的解​​決方案是使用'git revert'。 –

+0

你可以使用[git rebase](https://git-scm.com/book/en/v2/Git-Tools-Rewriting-History)重寫你的歷史記錄,雖然如果你共享你的存儲庫,這被認爲是不好的形式和其他人。 – larsks

回答

1

由於您已經將這些提交推送到遠程存儲庫,因此不應使用任何重寫歷史記錄的命令(例如git rebase),因爲這會導致其他任何人從此存儲庫中提取更改時出現問題。

你剩下的選擇是使用git revert擺脫你不希望提交的:

git revert 6449799 
git revert 1025716 

git revert每個實例將創建一個新的承諾,消除由指定提交所做的更改。

一旦您運行了這些命令(包括根據需要修復任何合併衝突),您可以推送這兩個新提交來有效地移除您不再需要的原始提交。

1

避免這種情況在未來

一,審議通過以下,以避免再次遇到了這樣的情況:

  1. 做在一個單獨的分支正在發生的變化,直到你有一些測試和工作的變化準備合併到master。然後,您可以合併或重新整理一個清潔歷史記錄到master
  2. 在進行小的更改時,請勿經常按下遙控器。只需在本地提交,那麼在完成所有測試和工作之後,您可以通過單次提交進行遠程合併。

這使您可以在遇到像這樣的問題時重寫本地歷史記錄,如果您想要的話,那麼當您推入歷史記錄時將會變得乾淨。


最好的答案是...

git revert將努力增加新的承諾將撤銷在您需要撤消提交,每安迪的回答變化。

而這在大多數情況下都是最好的答案 - 實際上不需要有完全清晰的歷史記錄 - 當您創建缺陷時,只需修復它並完成修復即可。

但是,如果你真的想知道如何清理歷史了,接着往下看。


清理的master

如果您使用此遠程唯一一個歷史,只需重寫歷史就沒有問題。有很多不同的方法可以做到這一點 - 改版,櫻桃選擇等。例如,您可以:

  1. 結賬4854bf7
  2. 創建一個新的分支(也許稱之爲fix?)
  3. 摘櫻桃0f2d03c
    • 弄不好如果作出新的承諾這裏的任何合併衝突
    • 如果您想保留提交,您可以在此處提交,保留原始提交消息或創建新提交消息
  4. 櫻桃採摘fba0f87
    • 解決任何合併衝突
    • 做最後的提交(再次,只是重新使用原來的提交信息,添加到它,或做一個新的)
a - b - c - d - e <-- master currently here 
\            
    c' - e'   <-- fix currently here    
  • 在這一點上,如果要移動master分公司在這一新分支,並有效地刪除原來的master
    • 結賬master
    • 重置主分支fix
    • 刪除fix分支
  • 如果按照#5,你最終得到:

    a - c' - e'    <-- master 
    \ 
        [b] - [c] - [d] - [e] <-- will be garbage collected eventually 
    

    這可能需要一個力量推到了推動這些新變化的遙控器,當然,只應做,如果沒有其他人已經擁有了這些改變,或者如果你已經協調此修復程序與大家可以擁有它。

    請注意,您也可以使用上述策略與fix以您想要的方式獲得一切,然後從fix合併到master。這與回覆相同,但如果這些提交中的更改很大並且/或者很複雜,那麼您可能希望在單獨的分支中處理重新集成,該分支更容易處理,然後嘗試跟蹤進程中的撤銷。

    0

    結賬提交4854bf7(最後一次良好提交)並挑選您想要保留的其他提交。然後強制推送以掌握覆蓋提交歷史記錄。

    警告:確保是否有任何其他提交需要在合併之前合併這些提交,因爲這會覆蓋master中的歷史記錄。此外,包含原始歷史記錄的任何存儲庫在推送之前都需要強制從主服務器拉出,這意味着它們可能會丟失本地更改。

    git checkout 4854bf7 
    git cherry-pick 0f2d03c 
    git cherry-pick fba0f87 
    

    現在,你目前的HEAD是fba0f87和日誌僅包含你想保留的提交。您可以使用git log進行檢查。現在

    ,確保你還在跟蹤你的遠程主,並已執行上面的警告中提到的檢查:

    git push -f