简体   繁体   English

将推送的分支恢复为具体提交

[英]Revert pushed branch to a concrete commit

I have merged a dev branch (with constant, sometimes unstable changes) to our master branch (where we store the released, stable code). 我已将dev分支(具有常量,有时不稳定的更改)合并到我们的主分支(我们存储已发布的稳定代码)。 I want to restore the master branch to the state it was before like the merge with the dev branch had never happened (and that when in the future we merge the dev branch all changes that we will discard now will be merged "again"). 我想将master分支恢复到之前的状态,就像从未发生与dev分支的合并一样(并且在将来我们合并dev分支时,我们现在将丢弃的所有更改将再次“合并”)。

This is the current status of the master branch and I want it to have the 'professional-1.1.2' commit/tag at the HEAD. 这是主分支的当前状态,我希望它在HEAD上具有'professional-1.1.2'提交/标记。

主分支的状态

I tried: 我试过了:

$ git revert -n professional-1.1.2..HEAD
fatal: Commit 9167e846a387c793edbc089c7ab6bd9eb8260456 is a merge but no -m option was given.
$ git revert -n -m 1 professional-1.1.2..HEAD
fatal: Mainline was specified but commit 380169097f35d07466640bc0db1b639278cd25fa is not a merge.
$ git revert -n -m 2 professional-1.1.2..HEAD
fatal: Mainline was specified but commit 380169097f35d07466640bc0db1b639278cd25fa is not a merge.

After a bit of research I think that the better option is do a git reset --hard professional-1.1.2 and git push --force as the answer to Git: How to ignore fast forward and revert origin [branch] to earlier commit? 经过一些研究后,我认为更好的选择是做一个git reset --hard professional-1.1.2git push --force作为Git的答案:如何忽略快进并将原点[branch]恢复到之前的提交? or reverting push'd git commit . 或者还原push'd git commit Other developers are in the same office, and they should never commit anything to master (as neither should I, but... yeah, we don't have permissions per branch), so it's not a big problem to tell them and do any action required. 其他开发人员在同一个办公室,他们永远不应该承诺任何东西(因为我不应该,但是......是的,我们没有每个分支的权限),所以告诉他们并做任何事都不是一个大问题需要采取的行动。

So in the end the question is: git revert something or git reset --hard <TAG> && git push --force ? 所以最后的问题是: git revert somethinggit reset --hard <TAG> && git push --force If git revert , which commandline should I use? 如果git revert ,我应该使用哪个命令行?

The -m number option specifies which of the parents you want to revert to (since a merge has multiple parents). -m number选项指定要还原到哪个父项(因为合并具有多个父项)。

So you want git revert -m 1 HEAD or git revert -m 1 SHA_OF_MERGE_COMMIT (assuming you did git checkout master; git merge devel; ) 所以你想要git revert -m 1 HEADgit revert -m 1 SHA_OF_MERGE_COMMIT (假设你做了git checkout master; git merge devel;

If you just want to make the state of master exactly the same as professional-1.1.2 , while avoiding rewriting history and force-pushing, you can just create a new commit on top of master that represents the same state of the project as professional-1.1.2 . 如果你只是想使master的状态与professional-1.1.2完全相同,同时避免重写历史和强制推送,你可以在master之上创建一个新的提交,代表与professional-1.1.2相同的项目状态professional-1.1.2 You can do that with the following steps: 您可以通过以下步骤执行此操作:

# Check that "git status" is clean, since the steps that follow will throw
# way uncommitted changes:
git status

# Set the index (staging area) to be as it was at professional-1.1.2:
git read-tree professional-1.1.2

# Create a commit based on that index:
git commit -m "Reverting to the state at professional-1.1.2"

# Your working tree will still be as it was when you started, so
# you'll want to reset that to the new commit:
git reset --hard

As an alternative, you can follow the steps suggested in this answer by Charles Bailey , which accomplishes the same thing, but is slightly more confusing, I think (even though the steps I've suggested involve the "plumbing" command git read-tree ). 作为替代方案,你可以按照Charles Bailey这个答案中建议的步骤完成相同的事情,但是我认为(尽管我建议的步骤涉及“plumbing”命令git read-tree )。

If you are a daredevil (recovering from an upstream rebase could be necessary for all other committers) 如果你是一个胆大妄为(从上游的rebase恢复可能是所有其他提交者必需的)

git checkout yourbranch
git reset HEAD <commit-hash>
git push origin yourbranch -f

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM