0

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

我知道我可以挑选樱桃,但如果我能帮上忙,我真的不想让 master 和 branch 分道扬镳。

当前状态:

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

樱桃采摘选项:

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

理想的选择:

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

这可能吗?

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

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

4

2 回答 2

1

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

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

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

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

现在,在某个目标提交的方向上找到一个特定的散列,它“在”当前提交“之前”提交N次,这可能有点棘手。例如,考虑:

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

提示提交branch是在提示提交之前的八次提交master——或者是吗?我认为每个人都同意这A是一个提前提交master,并且B提前两个提交。但是CE、 和D以及F呢? C领先三个,但也是E;和DF领先四位。但是G不是5超前master:好像是7超高手。同样,Hakabranch似乎比master.

所以如果我告诉你提前三个提交,你会选择 commitC还是E?你会给我一个错误,还是一个选择?为什么?

如果您将事物限制为线性链,我们可以枚举“介于”master和之间的提交branch,排除master和包括branch,与:

git rev-list --reverse master..branch

然后列表中的第N个提交是要提供给git merge --ff-only. 但是,如果在这两点“之间”存在分支合并链,那么整个问题就会变得棘手。

于 2017-11-28T17:53:48.773 回答
0

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

我将把这个问题留一会儿,以防万一有人对标题为 的问题有更一般的答案,即对于 n 次提交而不仅仅是 1。

于 2017-11-28T17:05:00.840 回答