使用 reset 和 restore 撤消 Git 中的推送提交
我們展示了三種方法來撤消從 Git 中的遠端倉庫推送的提交。為此,我們使用 git reset
、revert
和 checkout
命令。
當我們使用 git reset
時,我們還會從倉庫歷史記錄中刪除任何不需要的提交的痕跡。但是使用 git revert
,原始提交和撤消提交都保留在歷史記錄中。
如果我們使用 git checkout
,我們會撤消新分支中的更改。
使用 git reset
命令撤消推送的提交
我們建立了一個 undo_pushed_commits_local
倉庫,並用一些健康(良好)的提交填充它。
mkdir undo_pushed_commits_local
git init
然後新增/修改檔案。
git add --all
git commit -m "Make healthy commit"
新增/修改更多檔案。
git add -all
git commit -m "Make another healthy commit"
我們現在將這些提交推送到 GitHub 上的 undo-pushed-commits-remote
倉庫。
git remote add undo-remote git@github.com:danielturidandy/undo-pushed-commits-remote.git
git push undo-remote master
我們的遠端倉庫現在有兩個提交。
現在,讓我們做出錯誤的提交。
echo "This is a bad addition" >> file1.txt
echo "This is a bad addition" >> file2.txt
git add -all
git commit -m "Make a bad commit"
我們將此提交推送到遠端倉庫。
git push undo-remote
我們的遠端有錯誤的提交:
我們現在重置
到本地倉庫中的最後一個良好提交。我們使用 --hard
選項從提交歷史中刪除任何錯誤提交的痕跡。
git log
git reset --hard <SHA of the last good commit>
我們使用 -f 選項將本地推送
到遠端倉庫以強制推送。
git push -f undo-remote
此方法最適用於私有倉庫或小型團隊的倉庫。
如果一些開發人員在我們重置為良好狀態之前推送錯誤提交後將遠端拉到本地環境,大型團隊可能會遇到問題。他們沒有提交歷史記錄,其中包含糾正
其倉庫的錯誤提交資訊。
使用 git revert
命令撤消推送的提交
我們在這裡將四個錯誤的提交推送到遠端倉庫。
我們可以使用 revert
撤消單個錯誤提交或一系列錯誤提交。
revert
進行新的提交,以反轉不需要的提交。原始提交和反向提交都保留在倉庫歷史記錄中。
使用 revert
撤消單個推送的提交
git revert <SHA of the commit we want to revert>
我們現在將此更改推送到遠端倉庫。請記住使用 -f 標誌來確保不會出現衝突。
git push -f undo-remote
我們的遠端倉庫現在有一個新的提交,可以逆轉錯誤的提交。
使用 revert
撤消一系列推送的提交
git revert <SHA of the oldest commit to revert>..<SHA of the newest commit to revert>
這將恢復所提供範圍內的所有提交(不包括最舊的提交,但這也可能取決於你使用的版本/平臺。)
我們現在使用 -f 標誌將更改推送到遠端。
git push -f undo-remote
這種方法非常適合擁有大型團隊的公共倉庫。由於錯誤提交和撤消提交都保留在歷史記錄中,因此開發人員可以使用所有錯誤推送/恢復來更新他們的本地倉庫。
使用 git checkout
命令撤消推送的提交
這種技術是一種快速的 hack,它可以在沒有錯誤提交的情況下建立一個新分支。它非常適合小型程式碼庫並且如果你時間緊迫。
我們首先 checkout
到最後一個好的提交。
git checkout <SHA of last known good commit>
然後,我們在倉庫歷史記錄中最後一次已知的良好提交時達到分離的 HEAD 狀態。
我們現在從這個狀態分叉一個新的分支。
git checkout -b branch_without_badcommits
然後我們將它推入遠端進入一個新的分支。
git push -f undo-remote branch_without_badcommits
遠端倉庫現在有一個新分支,沒有任何錯誤提交。