我刚刚花了几个小时来解决将big-feature-branch-B
合并到big-feature-branch-A
时产生的合并冲突。我终于完成了,我的所有解决方案都已准备就绪,可以提交了。但是,我的工作流程是:
1.从big-feature-branch-A
创建一个分支(我将此分支命名为AB-merge-branch
)
1.将big-feature-branch-B
合并为AB-merge-branch
1.为创建PR以将AB-merge-branch
合并到big-feature-branch-A
中,以便解决方案可以通过代码评审。
在我解决合并冲突的大部分过程中,我意识到我是在big-feature-branch-A
而不是合并分支中解决它们的。
我的问题是,如何在提交更改之前安全地更改分支?
我确信答案很简单,通常我只会隐藏我的修改,切换分支,然后弹出我的修改。然而,我从来没有在合并过程中这样做过,在这种情况下,我对“尝试一下”感到非常不安,因为我不想冒险再次解决所有这些冲突。我对我的git-fu也不是很有信心,我也读过像this这样的恐怖故事(但也许我的情况不同,因为我已经解决了所有冲突,所有更改都是分阶段进行的?),也不想在这个案子上做实验谢谢!
3条答案
按热度按时间qyyhg6bp1#
简短的回答是,你不能(切换分支...嗯,算是吧,虽然你可以,算是吧,但这并不明智--这涉及到直接篡改Git的内部):
您的索引处于这种特殊的“合并”状态,因此您也不能隐藏它。幸运的是,没有必要这样做。(如果您解决了所有问题,然后运行
git checkout -b newbr
并提交,您将得到一个非合并提交。您可以使用这个方法,但不要那样做。)您应该做的是继续并完成合并:这会给你想要的merge result。然后你可以在想要的 * 分支 * 中重新开始merge,并获取你刚刚提交的结果作为想要的 result,* 如果有必要的话 *。然后你完全放弃原来的merge提交(如果有必要的话)。(如果你不小心用一个成功的
git checkout -b
破坏了merge,这也是你需要做的。在某些情况下,包括你的情况,原始合并的父链接就是你想要的,这只是一个重新标记合并的问题。
我会先展示食谱,然后解释 * 为什么 * 它有效:
为什么这是一个答案(有多种方法,因此我不会说出 the 答案)
让我们按照您第一次开始合并时的状态绘制您的设置:
也就是说,正如
git status
所说的,“在分支big-feature-branch-A上”,一切都很好。每个o
代表一个提交(我用星号标记了合并的合并基)。然后你 * 打算 * 运行
git checkout -b AB-merge-branch
。如果你 * 已经 * 这样做了,画面会是这样的:您运行了
git merge
,但由于冲突而失败。您解决了(大部分)冲突(必须在继续之前解决所有冲突)。当您最终提交时,您将获得一个新的合并提交,这将移动 current 分支(HEAD
记住的分支):这里没有显示(因为太难显示)的是新合并
M
的 * 第一个 * 父节点是最右边(最近)的上一行提交,而第二个是下一行提交(如果有的话,当有人想要跟随“主”分支与“被合并的边功能”时,第一个与第二个东西稍后才重要:根据定义,主分支总是第一父分支)。您忘记创建一个新分支 name,因此现在发生的情况如下:
第一个父提交仍然是最上面和最右边的提交,第二个父提交仍然是最下面的提交。新的合并提交
M
是完全相同的,只是移动的标签指向新的合并提交M
,是big-feature-branch-A
(HEAD),而不是不存在的AB-merge-branch
(显然不是HEAD)。现在你要做的就是 * 创建 * 你想要的标签,任何使新分支名称
AB-merge-branch
指向M
的东西都可以满足这个部分,你可以使用git checkout -b AB-merge-branch
或git branch AB-merge-branch
来完成。如果你使用了
git checkout -b
,你现在必须 back 到big-feature-branch-A
,用git reset
来修复它(你可以使用其他命令,但是我坚持使用reset
).如果你用git branch
来创建新的分支,你的 current 分支是不受影响的:你还在big-feature-branch-A
上。在任何情况下,您都希望这个
big-feature-branch-A
分支名称后退一步,回到M
的第一个父分支,就好像它从一开始就没有前进到M
一样。(或停留在)这个分支上。一旦你在这个分支上,你可以使用git reset --hard HEAD^
来实现这种后退一步。HEAD^
意味着“找到HEAD
的第一个父节点“,如果HEAD
名称提交M
(it does)-表示最右上方的行提交,这是您希望分支指向的位置。git reset
命令执行分支的重定向,并且重置你的索引和工作树(以便在新的提交中一切都是干净的)。dm7nw8vv2#
首先,完成合并并提交,这样就不会丢失任何东西。
这是本地行动不会被其他人看到的。
从这个提交中,你可以创建分支AB-merge-branch
你也可以将之前的
big-feature-branch-A
重置为它的第一个父提交。p8h8hvxi3#
稍微更正/补充一下@torek的回答,我发现如果我切换分支,在一个新分支上用
git checkout -b AB-merge-branch
提交冲突解决的合并,分支更改成功,但是作为分支更改的副作用,我也会丢失合并状态。当我提交时,我没有收到合并驱动提交消息建议,并且最终提交只有一个父提交。
为了从这个“意外创建了一个新的独立提交”状态到达我想要的位置,当然不需要重新解决我已经解决的冲突,假设我在
AB-merge-branch
上创建了这个“非合并提交”,我发现我需要做如下的事情:一般来说,最简单的建议是 * 在开始合并之前创建新分支 *,完全按照工作流程的规定。
如果你 * 还没有切换分支 *,那么@torek上面的建议是正确的/最简单的。