将分支的前 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 对当前分支(无论是什么)进行快进非真正合并到指定的提交。这样的操作:
- 测试
HEAD
是否是<commit-specifier>
的祖先:如果不是,失败,如果是,继续...
- 推进当前分支,使其指向
<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 提交早八次提交——或者是吗?我认为每个人都同意 A
比 master
提前一次提交,而 B
提前两次。但是 C
和 E
,以及 D
和 F
呢? C
领先三位,但 E
也领先三位; D
和 F
均领先四位。但是 G
不是比 master
早五:它似乎比 master 早 七。同样,H
又名 branch
似乎比 master
早八。
因此,如果我告诉您向前移动三个提交,您会选择提交 C
还是 E
?你会给我一个错误,还是一个选择?为什么?
如果你把事情限制在线性链上,我们可以枚举提交 "between" master
和 branch
,不包括 master
并包括 branch
,与:
git rev-list --reverse master..branch
然后列表中的第 N 次提交是要提供给 git merge --ff-only
的提交哈希。但是如果有分支合并链"between"这两点,整个问题就变得棘手了。
我有一个从最近提交到 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 对当前分支(无论是什么)进行快进非真正合并到指定的提交。这样的操作:
- 测试
HEAD
是否是<commit-specifier>
的祖先:如果不是,失败,如果是,继续... - 推进当前分支,使其指向
<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 提交早八次提交——或者是吗?我认为每个人都同意 A
比 master
提前一次提交,而 B
提前两次。但是 C
和 E
,以及 D
和 F
呢? C
领先三位,但 E
也领先三位; D
和 F
均领先四位。但是 G
不是比 master
早五:它似乎比 master 早 七。同样,H
又名 branch
似乎比 master
早八。
因此,如果我告诉您向前移动三个提交,您会选择提交 C
还是 E
?你会给我一个错误,还是一个选择?为什么?
如果你把事情限制在线性链上,我们可以枚举提交 "between" master
和 branch
,不包括 master
并包括 branch
,与:
git rev-list --reverse master..branch
然后列表中的第 N 次提交是要提供给 git merge --ff-only
的提交哈希。但是如果有分支合并链"between"这两点,整个问题就变得棘手了。