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?或者在这个错综复杂的过程中有什么东西我不理解?
感谢。
答案 0 :(得分:5)
根据您推送的状态,有两种情况:
目前还没有人使用推出的分支。在这种情况下,您可以使用git reset
强制本地分支进行特定提交 - 然后您可以使用git push
参数--force
分支。
但是,如果有人将你的工作基于你不小心推动的分支,那么你就无法真正重置它,因为他将把他的变化从一个分支机构中移除。这是git revert
发挥作用的地方。它将记录一个有效撤消先前更改的反补丁。这里的优点是其他人可以轻松地将他们的工作建立在分支机构上。
方法的选择取决于您的存储库的方式以及意外补丁在那里停留的时间。如果开发人员很少,那么通信和reset
可能就是答案。但是,如果事情存在了很长时间,那么恢复可能会更好 - 除非你想重写整个历史!
另一种看待它的方法是:git revert
是持久性的,而git reset / git push --force
是对历史的破坏性重写。两者都有适当的时间。
最后,当我深入研究爱丽丝沿着兔子洞走出去并研究其他什么时,我通常会在本地创建的分支上进行。然后,如果我喜欢这些更改,我通常会将它们合并到一个测试分支中,让它们在测试分支上稍微搅拌一下,然后再将它们合并到master
。这样你就可以在很多时候避免这个问题。简而言之,我经常有20-30个本地分支,每个分支对应我正在处理的每个功能。它们倾向于首先单独测试。有时候,我会创建一个新的分支test
并将所有内容合并到该分支中并一起完成所有测试。要跟踪分支之间的冲突,我使用git rerere
。优点是我可以决定某个功能何时足够稳定以推送给其他人。
答案 1 :(得分:-1)
正如Horia指出的那样,你需要git reset。
Git checkout意味着您切换到另一个分支或使用checkout -b您可以创建一个新分支并立即切换到它。
答案 2 :(得分:-3)
试试git reset
:http://git-scm.com/docs/git-reset