git - 将其他分支暂时合并到我的当前分支

19

我有一个情况。假设有两个开发者正在分别处理两个不同的分支AB

 -- master --
|            |
A     <--    B  

分支B依赖于对A的更改。但是A的更改尚未合并到master中。我想在我的功能(分支B)中使用对A的更改,然后在完成测试时将其丢弃。有什么推荐的方法?


3
不太清楚你的意思,但我认为你想创建一个基于B的新分支C,将A合并到C中,然后在C上工作。完成后,删除C。 - chepner
是的。在我测试了C中的更改后,如何放弃合并A? - Conans
只需删除C (git branch -D C),您仍将拥有A和B。 Git分支是轻量级的,意味着可以经常创建/删除。或者保留C进行测试,在B上工作,并将其他更改从B合并到C以进行测试(尽量避免在C上进行任何非合并提交,在A或B上完成所有工作,仅将其合并到C进行测试)。 - Jonathan Wakely
1
从你的ASCII图中,很难弄清楚你的repo处于什么状态。请看这里,以获取更清晰的ASCII提交图示例:https://dev59.com/XoLba4cB1Zd3GeqPjcte#25490288 - jub0bs
3个回答

8
假设分支B当前在提交abc1234上。对于你的问题,最直接的答案是:
git checkout B
git merge A
# run your tests
git reset --hard abc1234

但是正如其他人所提到的,这是一个非常奇怪的工作流程。如果B依赖于A,为什么要首先取消合并分支?也许您需要第三个“集成”分支?


我发现这是一个奇怪的工作流程。我将B合并到A中,并开始在A上工作。感谢您的回复。 - Conans
1
我看到这样的情况,如果每个分支代表不同的功能,那么后面需要找出一个分支对另一个分支的依赖关系。但是在将它们合并之前,您需要进行代码审查和任何开发端验证,否则只会创建一个大混乱。 - swcraft

2

有两种有效的方法来处理这个问题:

  1. 你可以进行完整的正常合并。这是最简单的方法,Git不在乎你反复合并的次数,它可以解决。这种方法最诚实:你的更改取决于其他分支中做了什么,因此记录历史反映了这一点。

    唯一的问题是那些想要在master上保留线性历史记录的人(可能具有SVN或类似背景),或包含官方开发历史记录的SVN存储库。

  2. 你可以将你的工作变基到其他分支上。有些人喜欢这种方法,因为它保留了线性历史记录,并且使与上游SVN存储库的交互更容易。缺点是,你在篡改历史记录(请参见我的答案以获取有关为什么存在问题的更多详细信息)。因此,如果你选择变基,应确保至少编译测试新提交。

    这种方法的另一个缺点是,每次需要借助其他分支(包括主分支)的更改时,你都需要变基你的所有工作以保持线性历史记录。并且要重复测试新变基创建的所有新提交。

    这就是为什么我强烈推荐合并方法:它允许在任何时候进行合并,而唯一需要测试的新提交是合并提交。所有以前的提交都保持不变,无需重新测试。


1

我使用git cherry-pick命令来完成这个例子,它非常有效。

在分支B上:

git branch B-tmp
git checkout B-tmp
git rebase A
# Do your wanted modifications
git commit

假设您现在位于提交abc1234,您现在可以返回到B分支并“挑选”提交abc1234
git checkout B
git cherry-pick abc1234

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接