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/