我有一个情况。假设有两个开发者正在分别处理两个不同的分支A
和B
。
-- master --
| |
A <-- B
分支B
依赖于对A
的更改。但是A的更改尚未合并到master
中。我想在我的功能(分支B
)中使用对A
的更改,然后在完成测试时将其丢弃。有什么推荐的方法?
abc1234
上。对于你的问题,最直接的答案是:git checkout B
git merge A
# run your tests
git reset --hard abc1234
但是正如其他人所提到的,这是一个非常奇怪的工作流程。如果B依赖于A,为什么要首先取消合并分支?也许您需要第三个“集成”分支?
有两种有效的方法来处理这个问题:
你可以进行完整的正常合并。这是最简单的方法,Git不在乎你反复合并的次数,它可以解决。这种方法最诚实:你的更改取决于其他分支中做了什么,因此记录历史反映了这一点。
唯一的问题是那些想要在master
上保留线性历史记录的人(可能具有SVN或类似背景),或包含官方开发历史记录的SVN存储库。
你可以将你的工作变基到其他分支上。有些人喜欢这种方法,因为它保留了线性历史记录,并且使与上游SVN存储库的交互更容易。缺点是,你在篡改历史记录(请参见我的答案以获取有关为什么存在问题的更多详细信息)。因此,如果你选择变基,应确保至少编译测试新提交。
这种方法的另一个缺点是,每次需要借助其他分支(包括主分支)的更改时,你都需要变基你的所有工作以保持线性历史记录。并且要重复测试新变基创建的所有新提交。
这就是为什么我强烈推荐合并方法:它允许在任何时候进行合并,而唯一需要测试的新提交是合并提交。所有以前的提交都保持不变,无需重新测试。
我使用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
git branch -D C
),您仍将拥有A和B。 Git分支是轻量级的,意味着可以经常创建/删除。或者保留C进行测试,在B上工作,并将其他更改从B合并到C以进行测试(尽量避免在C上进行任何非合并提交,在A或B上完成所有工作,仅将其合并到C进行测试)。 - Jonathan Wakely