我怎样才能以一种易于回滚的方式进行git合并?
有很多关于如何在git中“撤销”合并的讨论。简短版本:如果撤消合并提交,它还会告诉git以后不要再合并这些更改 在进行合并时,我可以做些什么来缓解这个问题吗?在很多情况下,撤销合并将非常非常有用,仅在软件开发的正常过程中,更重要的是,在控制发布分支的状态时,需要回滚更改 编辑 我已经看到了解决方案,并没有真的认为它是一个解决方案,更多的是对问题的解释。它需要我怎样才能以一种易于回滚的方式进行git合并?,git,merge,rollback,undo,feature-branch,Git,Merge,Rollback,Undo,Feature Branch,有很多关于如何在git中“撤销”合并的讨论。简短版本:如果撤消合并提交,它还会告诉git以后不要再合并这些更改 在进行合并时,我可以做些什么来缓解这个问题吗?在很多情况下,撤销合并将非常非常有用,仅在软件开发的正常过程中,更重要的是,在控制发布分支的状态时,需要回滚更改 编辑 我已经看到了解决方案,并没有真的认为它是一个解决方案,更多的是对问题的解释。它需要 始终使用--no-ff 记住,当您想要返回依赖于它们的代码时(可能是几小时、几天、几周或几个月以后……),所有未完成的合并都要记住 我想要
(问题的SVN部分已在末尾得到回答) 是的,以下是如何重新引入未合并的功能。考虑下面的历史(假设你已经撤销了一个合并): F是特征分支,M是合并,U是取消合并该特征时的相反值,L是最新提交 以下是您的选择:
——强制执行推压所需的力):
--ff only F'
)(无--force
推送所需):
--无ff F'
--保留新的分支点)(无--推送所需的力):
rebase-i head^
并从列表中删除U(——强制
需要推动):
x---x----x--x---x--M--L
\ /
x--x--x--x-F
rebase--on M^1 L^L
以摆脱合并和取消合并。现在你可以稍后再回忆
L'
/
x---x----x--x---x--M--U--L
\ /
x--x--x--x-F
--squash
修改器。我会让你的想象力来研究这在历史上会是什么样子。我不建议这样做是有原因的。了解功能是如何工作的以及它采取了哪些步骤是有价值的。后续的合并将更容易,因为Git可以检查某个文件看起来像它的历史。将提交挤压在一起会丢失该信息
还有一些额外的缺点,可能会也可能不会影响您利用历史重演的能力
我的建议是,总是在master中标记使用空白合并发布的内容。这是通过与--no ff
选项合并完成的。您永远不会在master上工作,在那里完成的唯一提交是那些合并-没有代码更改提交。在QA分支中,标记commit,标记发布的点。因此,当您执行git merge--no ff rc-12.2时,您将自动生成提交注释“merged rc-12.2”
查看git流
希望这能为您提供更多详细信息。有什么原因您不能使用git reset--硬原版头回滚提交?我的答案需要更多信息吗?urschrei:如果我在服务器上的分支上这样做,那么要推送结果,我必须使用
--force
,对吗?好的,那么我的问题的答案是“你不能这么做”,但是adymitruk对事后的选择做了很好的概述。我真的需要知道你的问题是什么。在git中没有什么是svn做不到的。。。或多或少。这是对我的选择的一个很好的概述,但我的问题是,在最初的合并时,我是否可以做些什么来让事情变得更简单。我刚刚用“我想要什么”部分更新了我的问题。在你的回答中:这是4个不同的选项,对吗?想给他们编号吗?另外,如果所有分支都是远程发布的,那么哪些分支需要--force
?如果您将这些标记为…“假设您已经“取消”了合并”--这是否意味着,git revert
?另外--想在您的答案中做一些注释吗--没有ff?(与它进行合并总是很理想的,使它们更容易恢复,对吗?)git flow看起来很酷,但似乎与未合并和重新合并没有任何关系。我错过什么了吗?
x---x----x--x---x--M--U--L
\ / \
x--x--x--x-x x'--x'--x'--x'--F'
x---x----x--x---x--M--U--L-------------------M2
\ / \ /
x--x--x--x-x x'--x'--x'--x'--F'
x---x----x--x---x--M--L
\ /
x--x--x--x-F
L'
/
x---x----x--x---x--M--U--L
\ /
x--x--x--x-F