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

git - Temporarily merge others branch into my current branch

我有个情况。假设两个开发人员在两个不同的分支 AB 上工作。

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

分支 B 取决于 A 中的更改。但是,A 中的更改尚未合并到 master 中。我想开始处理我的功能(分支 B),并在 A 中进行更改,然后在完成测试后丢弃它们。推荐的方式是什么?

有两种有效的方法可以解决这个问题:

  1. 你做了一个完整的、正常的合并。这是最简单的做法,git不管你来回合并多少次,它都能整理出来。这种方法是最诚实的方法:您的更改取决于在另一个分支中所做的事情,因此这会反映在记录的历史记录中。

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

  2. 您将您的工作重新定位到另一个分支。有些人喜欢这个,因为它保留了线性历史,并且它使与上游 SVN 存储库的交互更加容易。不利的一面是,您在历史上撒谎(请参阅我对另一个 SO 问题的 answer,以了解有关为什么会出现问题的更多详细信息)。所以,如果你选择变基,你应该确保你至少编译测试你的新提交。

    这种方法的另一个缺点是,每次需要利用另一个分支(包括 master)中的更改以保持线性时,您都需要重新设置 整个 工作的基线历史。并重复测试新 rebase 创建的所有新提交。

    这就是我非常喜欢合并方法的原因:它允许在任何时候合并,并且唯一需要测试的新提交是合并提交。我以前的所有提交都保持不变,不需要重新测试。

假设分支 B 当前正在提交 abc1234。最直接回答你的问题是

git checkout B
git merge A
# run your tests
git reset --hard abc1234

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

我为此使用了 git cherry-pick 命令,该命令非常适用于此示例

在分支 B:

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

假设您现在正在提交 abc1234,您现在可以在 B 分支上 return 并 'pick' 提交 abc1234:

git checkout B
git cherry-pick abc1234