Git:使用还原或 checkout 来撤消推送的更改?

标签 git git-checkout git-revert

Git 是一个非凡的工具,但我还没有想出撤消推送更改的最佳方法。情况是这样的。

我在一个分支上,并已将多个提交推送到 GitHub。从那以后我就决定我在兔子洞里走得太远了,我们需要废弃我已经完成的几个提交,然后重新开始。本质上,我需要撤销所有推送的提交,回到之前的提交。这是我认为合适的两个命令

git revert  # - creates a new commit that "undoes" the changes of one specific commit
git checkout 'commit SHA' # - sets the head to that specific commit, wherein I will re-push to the repo, undoing my changes... I think

那么,我说得对吗?我需要对要返回的特定提交执行 git checkout 吗?或者在这个复杂的过程中有什么我不理解的地方?

谢谢。

最佳答案

根据你推送的状态,有两种情况:

  • 还没有人将推送的分支用于任何事情。在这种情况下,您可以使用 git reset强制本地分支进行特定提交 - 然后你可以 git push带有 --force 的分支参数。

  • 但是,如果有人将他的工作建立在您不小心推送的分支上,那么您就无法真正重置它,因为他随后将根据处于不确定状态的分支进行更改。这是git revert的地方发挥作用。它将记录一个反向补丁,有效地撤消早期的更改。这里的好处是其他人可以轻松地在分支上进行工作。

方法的选择取决于您的存储库的情况以及意外补丁在那里的时间。如果开发人员少,沟通和一个reset大概就是答案。但是如果这个东西已经存在了很长时间,最好恢复原状 - 除非你想重写整个历史!

另一种看待它的方式是:git revert是持久的,而 git reset / git push --force是对历史的破坏性改写。两者都有适当的时间。

最后,当我跟随 Alice 深入 Rabbit hole 并调查后面的内容时,我通常会在本地创建的分支上进行。然后,如果我喜欢这些更改,我通常会将它们 merge 到一个测试分支中,让它们在测试分支上稍微搅拌一下,然后再将它们 merge 到 master 中。 .这样你就可以避免很多时候的问题。简而言之,我通常有 20-30 个本地分支机构,每个分支机构负责我正在处理的每个功能。他们倾向于首先进行单独测试。偶尔,我会创建一个新分支 test并将所有内容 merge 到该分支并一起进行所有测试。为了跟踪跨分支的冲突,我使用 git rerere .优点是我可以决定什么时候功能足够稳定可以推送给其他人。

关于Git:使用还原或 checkout 来撤消推送的更改?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4818455/

相关文章:

git : revert to old version for particular file with checkout command and commit

git - 如何撤消git中的最后一次提交

git - 修复 GIT 存储库上的历史记录

git - 在 Git 中恢复一系列推送的 merge 和提交(不重写历史)

svn - 为有经验的 git 用户学习 svn?

git - Jenkins 每个分支部署

git 记录文件的一部分

git - 我真的需要在 .gitattributes 中指定所有二进制文件吗

Git 恢复、 checkout 和重置傻瓜式教程

Git stash then checkout 每次