Revert pushed branch to a concrete commit
我已经将一个dev分支(具有持续的、有时是不稳定的更改)合并到了我们的主分支(我们在这里存储发布的、稳定的代码)。我希望将主分支恢复到以前的状态,就像从未发生过与dev分支的合并一样(并且将来当我们合并dev分支时,我们现在要放弃的所有更改都将"再次"合并)。
这是主分支的当前状态,我希望它的头部有"professional-1.1.2"提交/标记。
。
我尝试过:
1 2 3 4 5 6
| $ 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. |
经过一番研究,我认为更好的选择是把git reset --hard professional-1.1.2和git push --force作为对git的回答:如何忽略快进并将原点(分支)恢复为较早的提交?或者恢复push'd git commit。其他开发人员在同一个办公室,他们不应该向master提交任何内容(我也不应该这样做,但是……是的,我们没有每个分支的权限),所以告诉他们并执行任何需要的操作不是一个大问题。
所以最后的问题是:git revert something还是git reset --hard &git push --force?如果是git revert,我应该使用哪个命令行?
- Jefromi在stackoverflow.com/questions/355650/hellip;中给出的答案可能对您有所帮助。
- @在我的情况下,使用git reset --hard比使用git revert更好?
- 是的,我认为是这样,因为Revert创建了一个新的提交,它取消了最后一次提交。我绝对建议使用重置。
- @CarlosCampderr&243;s唯一的规则是永远不要覆盖公共存储库中的历史记录。如果它是您的私有存储库,您可以做任何您想做的事情。但在公共存储库中,如果重写历史,则会为已经下载了要重写的部分的每个人破坏存储库。
- @让我做是的,我知道。我真的不喜欢这样做,但最后我认为对于我目前的情况是最好的选择,因为环境是受控的,任何人都不应该对主分支中的代码做任何事情。
如果你真的想把EDOCX1的状态变成EDOCX1的状态,那么,当你避免重写历史和力量推进时,你就可以创建一个新的硕士学位委员会,代表项目的同样状况,如EDOCX1〕〔5〕。你可以采取以下步骤:
1 2 3 4 5 6 7 8 9 10 11 12 13
| # 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 |
作为另一种选择,你可以遵循查尔斯·贝利在这一答复中提出的步伐,他完成了同样的事情,但我认为,这一步伐越来越模糊(即使我建议的步伐涉及到"Plumbing"Command git read-tree)。
- 使用这个(以professional-1.1.2的状态进行一个新的提交并推动它),这会允许将来的dev分支合并再次带来现在我"恢复"的更改吗?
- 如果我建议引入的承诺最终以对象名称f414f31结束,我认为您可以在git merge dev之前执行git revert f414f31,从而实现未来的合并。(我认为原理与回复-回复-合并相同。)
- 在阅读完code.google.com/p/git core/source/browse/documentation/howto‌&8203;/…之后,我认为你是对的@marklongair。这更复杂,更容易出错(因为在执行git merge dev之前,我们可能会忘记恢复还原。由于回购是私有的,而且环境是受控的,我想我会选择git reset --hard和git push --force。
- @Carloscampderr&243;s:对-我不清楚分支机构的公共程度。只要你和任何一个可能从这一分支中抽身出来的人谈谈,并向他们解释如何处理重写的历史,就可以采用另一种方法……
你父母想要回复的具体选择
所以你想要EDOCX1或EDOCX1或EDOCX1
- 但我不想只恢复合并提交,而是恢复合并附带的所有提交。btw i dit git checkout master; git pull origin develop。
- @CarlosCampterr&243;s您认为合并提交是什么?是的,这将恢复合并,这意味着:它将删除合并到分支中的所有更改。
- 好吧,我只是把revert语法搞错了(所以当我第一次尝试的时候(正如你在问题中看到的那样),我在使用你的答案时选择了错误的父代。现在。。。如果在2个月内我再次合并dev分支,我要恢复的所有提交都将被合并?还是只合并我现在要还原的合并后所做的更改?
- @CarlosCampterr与243的合并并不关心提交。合并将合并两个(或更多)磁头。历史上的一切完全无关紧要。只有头部的当前状态才是相关的。
- @让我说:事实上,这取决于使用哪种合并策略-Git的基本三向策略考虑两个父母和一个共同的祖先-历史上的承诺被用作共同的祖先会对合并的结果产生很大的影响。
- @marklongair只对自动合并算法。如果手动合并,会有什么区别?
- @让我这样说吧:我看不出有任何迹象表明OP计划在后期的发展阶段做比git merge develop更微妙的事情。
如果你是一个黑暗的人(从上流颠覆中复苏可能是所有其他承诺的必要条件)
ZZU1