将分支的前 n 个提交合并到 master

Merge first n commits of branch to master

我有一个从最近提交到 master 的分支。该分支有两个提交。我想快进合并这些提交的 first 到 master.

我知道我可以做一个 cherry pick,但如果可以的话,我真的不想分散 master 和 branch。

当前状态:

Branch:       +--->B--->C
             /
Master: --->A

樱桃挑选选项:

Branch:       +--->B--->C
             /
Master: --->A--->B'

理想选择:

Branch:            +--->C
                  /
Master: --->A--->B

这可能吗?

请注意,提交已全部推送到远程;但是目前没有其他人可以访问这个特定的回购协议,所以 push -f 就可以了。

我似乎记得在签出分支时可能有一些方法可以合并到 master 上...如果是这样,我可以简单地签出提交 B,然后以这种方式合并?

正如 Raymond Chen 评论的那样,描述 的问题的解决方案是 git merge B

我会暂时搁置这个问题,以防万一有人对 标题 的问题有更笼统的答案,即 n 次提交,而不仅仅是 1 次提交。

更具体地说,您可能需要:

git merge --ff-only <commit-specifier>

它告诉 Git 对当前分支(无论是什么)进行快进非真正合并到指定的提交。这样的操作:

  1. 测试HEAD是否是<commit-specifier>的祖先:如果不是,失败,如果是,继续...
  2. 推进当前分支,使其指向 <commit-specifier> 并将该提交读入索引和工作树(git read-tree,"two tree merge" 情况——注意这也可以失败,如果你有未提交的更改,或目标提交中的未跟踪文件)。

现在,找到 N 的特定散列 "ahead of" 可以在某些目标提交的方向上提交当前提交有点棘手。考虑一下,例如:

...--o--o   <-- master
         \
          \      C--D
           \    /    \
            A--B      G--H   <-- branch
                \    /
                 E--F

branch 的 tip 提交比 master 的 tip 提交早八次提交——或者是吗?我认为每个人都同意 Amaster 提前一次提交,而 B 提前两次。但是 CE,以及 DF 呢? C 领先三位,但 E 也领先三位; DF 均领先四位。但是 G 不是比 master 早五:它似乎比 master 早 。同样,H 又名 branch 似乎比 master 早八。

因此,如果我告诉您向前移动三个提交,您会选择提交 C 还是 E?你会给我一个错误,还是一个选择?为什么?

如果你把事情限制在线性链上,我们可以枚举提交 "between" masterbranch,不包括 master 并包括 branch,与:

git rev-list --reverse master..branch

然后列表中的第 N 次提交是要提供给 git merge --ff-only 的提交哈希。但是如果有分支合并链"between"这两点,整个问题就变得棘手了。