5

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 吗?还是在这个复杂的过程中有我不理解的东西?

谢谢。

4

3 回答 3

5

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

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

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

方法的选择取决于您的存储库是怎样的,以及意外的补丁已经存在了多长时间。如果开发人员很少,沟通和areset可能就是答案。但是如果事情已经存在了很长时间,最好恢复 - 除非你想重写整个历史!

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

最后,当我跟随爱丽丝深入兔子洞并调查后面的情况时,我通常会在本地创建的分支上进行。然后,如果我喜欢这些更改,我通常会将它们合并到一个测试分支中,并让它们在测试分支上稍微搅拌一下,然后再将它们合并到master. 这样你就可以在很多时候避免这个问题。简而言之,我经常有 20-30 个本地分支,每个分支对应我正在开发的每个功能。他们往往首先单独测试。有时,我会创建一个新分支test并将所有内容合并到该分支中,然后一起进行所有测试。为了跟踪跨分支的冲突,我使用git rerere. 优点是我可以决定一个功能何时足够稳定以推送给其他人。

于 2011-01-27T16:08:28.920 回答
-1

正如霍里亚正确指出的那样,您将需要 git reset 。

Git checkout 意味着您切换到另一个分支或使用 checkout -b 您可以创建一个新分支并立即切换到它。

于 2011-01-27T15:54:05.893 回答
-3

试试git reset: http: //git-scm.com/docs/git-reset

于 2011-01-27T15:52:08.103 回答