Merging/Cherry-Picking 从分支 A 到分支 B 的一系列提交
Merging/Cherry-Picking a range of Commits from Branch A to Branch B
OS: Windows 10
Git客户端:GitBash(版本:2.28.0.windows.1)
...--A--B--C--D---E--I--M--N--O--P <-- Branch-A
\ \ /
\ F--G--H
\
J--K--L <-- Branch-B (HEAD)
问题陈述:
What I want to do is, Merge/Cherry-Pick commits (I .. P) to the branch (Branch-B)
我试过的:
我已尝试使用以下命令git cherry-pick:
git cherry-pick I..P
但是不是从提交 I 合并到 P。cherry-pick 是从 I 到 A 执行的(即历史倒退)。
有什么解决办法吗?也欢迎 cherry-pick 以外的解决方案。
这毫无意义。如果您希望在 branchB 上应用的第一个修订版是 I
,您需要尝试像 rhis:
git cherry-pick E..P
已更新 - 我一直在看这个,但我看不出您指定的命令如何执行您所说的操作。如果您从 Branch-B
开始签出并说
git cherry-pick I..P
那么你应该得到从 M
到 P
的提交副本添加到 Branch-B
。由于您还想获得 I
,您应该改为说 E..P
,但是 cherry-pick
通过历史“向后”工作的想法没有意义,或者与文档匹配,或者符合我的测试。
我也稍微调整了我的答案。我仍然更喜欢使用 rebase
来表示提交范围,但我最初说这是“最简单”的方法,客观上这是不准确的,因为它需要对分支进行额外的操作。
我复制一系列提交的更改(只要该范围不包括合并)的方法是 git rebase
使用 --onto
选项。这可能看起来像这样:
git rebase --onto Branch-B E P
请注意,您指定 E
,而不是 I
作为“上游”参数。这是因为 rebase 将此参数视为负引用 - 从 E
可到达的所有内容(包括 E
本身)都不会被复制。
另请注意,我将 P
指定为最后一个参数,而不是 branch-A
。那是因为如果你在检出分支的情况下进行变基,分支会随着重写的提交而移动,这听起来不像你想要的那样。结果是您现在处于分离的 HEAD 状态,并且重写的提交当前不在任何分支上。
...--A--B--C--D---E--I--M--N--O--P <-- Branch-A
\ \ /
\ F--G--H
\
J--K--L <-- Branch-B
\
I'--M'--N'--O'--P' <-- (HEAD)
要将这些提交整合到 Branch-B
中,您现在可以
git branch -f Branch-B
git chekcout Branch-B
或
git checkout branch
git merge -
得到
...--A--B--C--D---E--I--M--N--O--P <-- Branch-A
\ \ /
\ F--G--H
\
J--K--L--I'--M'--N'--O'--P' <-- Branch-B (HEAD)
OS: Windows 10
Git客户端:GitBash(版本:2.28.0.windows.1)
...--A--B--C--D---E--I--M--N--O--P <-- Branch-A
\ \ /
\ F--G--H
\
J--K--L <-- Branch-B (HEAD)
问题陈述:
What I want to do is, Merge/Cherry-Pick commits (I .. P) to the branch (Branch-B)
我试过的:
我已尝试使用以下命令git cherry-pick:
git cherry-pick I..P
但是不是从提交 I 合并到 P。cherry-pick 是从 I 到 A 执行的(即历史倒退)。
有什么解决办法吗?也欢迎 cherry-pick 以外的解决方案。
这毫无意义。如果您希望在 branchB 上应用的第一个修订版是 I
,您需要尝试像 rhis:
git cherry-pick E..P
已更新 - 我一直在看这个,但我看不出您指定的命令如何执行您所说的操作。如果您从 Branch-B
开始签出并说
git cherry-pick I..P
那么你应该得到从 M
到 P
的提交副本添加到 Branch-B
。由于您还想获得 I
,您应该改为说 E..P
,但是 cherry-pick
通过历史“向后”工作的想法没有意义,或者与文档匹配,或者符合我的测试。
我也稍微调整了我的答案。我仍然更喜欢使用 rebase
来表示提交范围,但我最初说这是“最简单”的方法,客观上这是不准确的,因为它需要对分支进行额外的操作。
我复制一系列提交的更改(只要该范围不包括合并)的方法是 git rebase
使用 --onto
选项。这可能看起来像这样:
git rebase --onto Branch-B E P
请注意,您指定 E
,而不是 I
作为“上游”参数。这是因为 rebase 将此参数视为负引用 - 从 E
可到达的所有内容(包括 E
本身)都不会被复制。
另请注意,我将 P
指定为最后一个参数,而不是 branch-A
。那是因为如果你在检出分支的情况下进行变基,分支会随着重写的提交而移动,这听起来不像你想要的那样。结果是您现在处于分离的 HEAD 状态,并且重写的提交当前不在任何分支上。
...--A--B--C--D---E--I--M--N--O--P <-- Branch-A
\ \ /
\ F--G--H
\
J--K--L <-- Branch-B
\
I'--M'--N'--O'--P' <-- (HEAD)
要将这些提交整合到 Branch-B
中,您现在可以
git branch -f Branch-B
git chekcout Branch-B
或
git checkout branch
git merge -
得到
...--A--B--C--D---E--I--M--N--O--P <-- Branch-A
\ \ /
\ F--G--H
\
J--K--L--I'--M'--N'--O'--P' <-- Branch-B (HEAD)