Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Git:使用revert或checkout撤消推送的更改?_Git_Git Checkout_Git Revert - Fatal编程技术网

Git:使用revert或checkout撤消推送的更改?

Git:使用revert或checkout撤消推送的更改?,git,git-checkout,git-revert,Git,Git Checkout,Git Revert,Git是一个非凡的工具,但我还没有想到撤销推送的更改的最佳方法。情况是这样的 我在一个分支上,已经向GitHub提交了几个提交。从那以后,我们决定我已经走得太远了,我们需要放弃我所做的一些承诺,重新开始。从本质上讲,我需要将所有推送的提交反转到上一个提交。以下是我认为合适的两个命令 git revert # - creates a new commit that "undoes" the changes of one specific commit git checkout 'commit S

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签出?还是在这个复杂的过程中有什么我不理解的


谢谢。

试试
git reset

正如Horia正确指出的,您需要git reset


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

根据所推的内容的状态,有两种情况:

  • 还没有人用推压的树枝做任何事。在这种情况下,您可以使用
    git reset
    强制本地分支进行特定的提交,然后可以使用
    -force
    参数
    git push
    对分支执行操作

  • 但是,如果有人根据您意外推送的分支进行了工作,那么您无法真正重置它,因为他将根据悬而未决的分支进行更改。这就是
    git revert
    发挥作用的地方。它将记录一个反向补丁,有效地撤消先前的更改。这里的优点是其他人可以轻松地将他们的工作建立在分支上

方法的选择取决于您的存储库是如何的,以及意外补丁在存储库中已经存在了多长时间。如果开发人员很少,那么通信和重置可能就是答案。但是,如果这件事存在很长一段时间,可能最好是恢复——除非你想重写整个历史

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


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

git reset对已经推送到的提交有效吗?正如发问者所建议的那样,这将起到签出的效果,而无需重置本地文件(当然,您可以使用可用的选项做更多令人兴奋的事情)。但是,您对后续提交的历史记录所做的操作的效果将是相同的。这是有效的。遵循本教程-它似乎起到了作用。
git reset
不足以撤消已推送到远程存储库的更改。(实际上,它可能有害于其他开发人员,并会造成混乱。)