2016-01-25 61 views
-1

問題是關於歷史重寫:刪除上次提交 (這個問題相當於如何做到這一點,沒有討論它是壞的還是好的) 因此,想象最後一次提交的SHA是「dd61ab32」。 遠程和本地的同步和我們執行下面的命令來一次撤銷承諾:Git - 刪除上次提交(歷史改寫)

$ git push origin +dd61ab32^:master 
$ git reset HEAD^ --hard 
$ git push -f origin master 

第一個,據我瞭解,將在最後一次刪除遠程提交。 第二個,將本地工作重置爲先前的本地提交,(--hard將完全清除所有更改, - soft將撤消上次提交,但更改將保存爲非暫存) 但是,第三個命令的作用是什麼?我明白它確實很重要,因爲如果沒有它,有些東西就搞砸了。

你能告訴我最後的第三條命令是做什麼的嗎?

UPD:

謝謝你的回答。目前還不清楚。我還有一個額外的問題,第一個命令是不是使當前的HEAD遠離前一個?解釋「它是無效的」。好的,我會盡力解釋,我需要哪個答案。我的意思是,當我首先執行命令時,我可以從視覺上看到發生了什麼。第二個命令也適用同樣的事情。但是第三個命令是不同的,因爲它很重要,但我不明白爲什麼它很重要。它看起來像多餘。你能描述更多的細節嗎?

+0

'-f --force通常,該命令拒絕更新遠程ref,該遠程ref不是用於覆蓋它的本地ref的祖先。另外,當使用--force-with-lease選項時,該命令拒絕更新當前值與預期值不匹配的遠程參考。 此標誌禁用這些檢查,並可能導致遠程存儲庫丟失提交;從手冊頁https://git-scm.com/docs/git-push – bjhaid

+0

謝謝。我將閱讀關於參考。沒有這個,我很難理解這個問題。 –

+0

第三個命令也「刪除」來自遠程的以前的提交。國際海事組織,這是最好的辦法做到這一點,因爲它不需要知道前面提交的SHA散列。 –

回答

3

就像你說的那樣,最後一條命令是多餘的。然而,這並不是完成這項工作的理想方式。 Git的應該永遠是有關使當地的變化,然後將其推到遠程(除非你是拉別人的變化),所以命令的正確順序應該是:

git reset --hard HEAD~1 
git push -f origin master 

這是假定磁頭在指着最後一次提交給master。

+0

有趣。讓我檢查一下這個序列的正確性。其實我在這裏找到了這三個步驟:http://christoph.ruegg.name/blog/git-howto-revert-a-commit-already-pushed-to-a-remote-reposit.html –

0

當您將更改推送到遠程時,只能推送作爲其當前開頭的後代的提交。如果在與遠程同步後在本地刪除或更改提交,則無法推送這些更改。然而,-f標誌git push告訴git推送提交,儘管它通常無效。

git這樣工作的原因是,如果您重寫了git存儲庫的歷史記錄,那麼在重寫歷史記錄後,與舊提交同步的用戶將從遠程執行操作時遇到問題。因此,只有在100%確定沒有其他人拉動提交之前刪除或更改的提交時,才應該這樣做。

+0

謝謝你的回答。第二段很清楚,這個動作的基本原理。但是我有額外的問題,第一個命令是不是使當前的HEAD遠離前一個?目前還不清楚。解釋「它是無效的」。好的,我會盡力解釋,我需要哪個答案。我的意思是,當我首先執行命令時,我可以從視覺上看到發生了什麼。第二個命令也適用同樣的事情。但是第三個命令是不同的,因爲它很重要,但我不明白爲什麼它很重要。它看起來像多餘。你能描述更多的細節嗎? –