使用 reset 和 restore 撤消 Git 中的推送提交

Ankit Raj Goyal 2023年1月30日
  1. 使用 git reset 命令撤消推送的提交
  2. 使用 git revert 命令撤消推送的提交
  3. 使用 git checkout 命令撤消推送的提交
使用 reset 和 restore 撤消 Git 中的推送提交

我們展示了三種方法來撤消從 Git 中的遠端倉庫推送的提交。為此,我們使用 git resetrevertcheckout 命令。

當我們使用 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 命令撤消推送的提交

我們在這裡將四個錯誤的提交推送到遠端倉庫。

4 次錯誤提交推送到遠端

我們可以使用 revert 撤消單個錯誤提交或一系列錯誤提交。

revert 進行新的提交,以反轉不需要的提交。原始提交和反向提交都保留在倉庫歷史記錄中。

使用 revert 撤消單個推送的提交

git revert <SHA of the commit we want to revert>

逆轉舊的錯誤提交的新提交

我們現在將此更改推送到遠端倉庫。請記住使用 -f 標誌來確保不會出現衝突。

git push -f undo-remote

我們的遠端倉庫現在有一個新的提交,可以逆轉錯誤的提交。

遠端倉庫中的新 Revert Commit

使用 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

在沒有錯誤提交的情況下建立並推送一個新分支

遠端倉庫現在有一個新分支,沒有任何錯誤提交。

遠端倉庫有一個沒有錯誤提交的新分支

相關文章 - Git Undo