夥計, 我有以下提交推送到遠程主人。git恢復選擇性更改
commit fba0f87
commit 1025716
commit 0f2d03c
commit 6449799
commit 4854bf7
所以現在我的腦袋壞了,我想恢復原狀。我想刪除提交1025716和6449799,但保留其餘的。我怎樣才能做到這一點? 如何創建只有fba0f87,0f2d03c和4854bf7發生更改的新提交,並推送該提交以使主服務器恢復正常。
夥計, 我有以下提交推送到遠程主人。git恢復選擇性更改
commit fba0f87
commit 1025716
commit 0f2d03c
commit 6449799
commit 4854bf7
所以現在我的腦袋壞了,我想恢復原狀。我想刪除提交1025716和6449799,但保留其餘的。我怎樣才能做到這一點? 如何創建只有fba0f87,0f2d03c和4854bf7發生更改的新提交,並推送該提交以使主服務器恢復正常。
由於您已經將這些提交推送到遠程存儲庫,因此不應使用任何重寫歷史記錄的命令(例如git rebase
),因爲這會導致其他任何人從此存儲庫中提取更改時出現問題。
你剩下的選擇是使用git revert
擺脫你不希望提交的:
git revert 6449799
git revert 1025716
的git revert
每個實例將創建一個新的承諾,消除由指定提交所做的更改。
一旦您運行了這些命令(包括根據需要修復任何合併衝突),您可以推送這兩個新提交來有效地移除您不再需要的原始提交。
一,審議通過以下,以避免再次遇到了這樣的情況:
master
。然後,您可以合併或重新整理一個清潔歷史記錄到master
。這使您可以在遇到像這樣的問題時重寫本地歷史記錄,如果您想要的話,那麼當您推入歷史記錄時將會變得乾淨。
git revert
將努力增加新的承諾將撤銷在您需要撤消提交,每安迪的回答變化。
而這在大多數情況下都是最好的答案 - 實際上不需要有完全清晰的歷史記錄 - 當您創建缺陷時,只需修復它並完成修復即可。
但是,如果你真的想知道如何清理歷史了,接着往下看。
master
如果您使用此遠程唯一一個歷史,只需重寫歷史就沒有問題。有很多不同的方法可以做到這一點 - 改版,櫻桃選擇等。例如,您可以:
fix
?)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
。這與回覆相同,但如果這些提交中的更改很大並且/或者很複雜,那麼您可能希望在單獨的分支中處理重新集成,該分支更容易處理,然後嘗試跟蹤進程中的撤銷。
結賬提交4854bf7
(最後一次良好提交)並挑選您想要保留的其他提交。然後強制推送以掌握覆蓋提交歷史記錄。
警告:確保是否有任何其他提交需要在合併之前合併這些提交,因爲這會覆蓋master中的歷史記錄。此外,包含原始歷史記錄的任何存儲庫在推送之前都需要強制從主服務器拉出,這意味着它們可能會丟失本地更改。
git checkout 4854bf7
git cherry-pick 0f2d03c
git cherry-pick fba0f87
現在,你目前的HEAD是fba0f87
和日誌僅包含你想保留的提交。您可以使用git log
進行檢查。現在
,確保你還在跟蹤你的遠程主,並已執行上面的警告中提到的檢查:
git push -f
承諾是永久的,不可改變的:你不能從中間刪除一個。你可以簡單地*停止使用*到最後,但如果你需要在中間撤銷某些東西,那麼最好的辦法是通常應用一個新的提交(Git稱之爲「還原」)先前的提交。應用前一個提交的Git命令拼寫爲'git revert'。 – torek
唯一可行的解決方案是使用'git revert'。 –
你可以使用[git rebase](https://git-scm.com/book/en/v2/Git-Tools-Rewriting-History)重寫你的歷史記錄,雖然如果你共享你的存儲庫,這被認爲是不好的形式和其他人。 – larsks