使用 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
远程仓库现在有一个新分支,没有任何错误提交。