git从另一个分支选择提交并将其置于当前提交下

git从另一个分支选择提交并将其置于当前提交下,git,Git,假设我有分支A和B A: a b c d B: a b c e 我想从分支B获取提交e,并将其置于分支A的提交d下。所以我最终的结果应该是这样的 A: a b c e d 怎么做 我应该先选择cherry pickcommite,将其放在d的顶部,然后切换d和e提交的位置,还是有其他方法?此外,它可能会有一些冲突-如何在不创建额外提交的情况下解决这些冲突?您可以在分支B的顶部选择提交d。如果不想修改分支B,请将分支B的副本创建为分支C,并在那里进行适当的更改。 很快: 您也可以在分支A上选择

假设我有分支
A
B

A: a b c d
B: a b c e
我想从分支
B
获取提交
e
,并将其置于分支
A
的提交
d
下。所以我最终的结果应该是这样的

A: a b c e d
怎么做


我应该先选择
cherry pick
commit
e
,将其放在
d
的顶部,然后切换
d
e
提交的位置,还是有其他方法?此外,它可能会有一些冲突-如何在不创建额外提交的情况下解决这些冲突?

您可以在分支
B
的顶部选择提交
d
。如果不想修改分支
B
,请将分支
B
的副本创建为分支
C
,并在那里进行适当的更改。 很快:

您也可以在分支
A
上选择提交
e
,但您可能会被迫解决两个冲突,而不是一个冲突:

git checkout A
git cherry-pick e //we are on A branch, cherry-pick e
//some conflicts may happen
git rebase -i c // rebase on c commit, this is the last one with proper order
//this will require to edit rebase picks - you can order them as you want
//after leaving editor, you might need to resolve conflicts again
如果发生任何冲突,git将允许您解决冲突,并且更改将保存在提交
d
中(它实际上不是相同的提交,因为它将有新的父级,并且它将包含冲突解决更改)。命令模式下的git将为您提供所有必要的提示,帮助您解决采摘樱桃时的冲突

如果您确实需要更改分支
A
(这应该不是必需的),请按照我上面写的操作,将分支
A
硬重置为分支
C

//Do as in first case
git checkout A
git reset --hard d2 //d2 is d commit on C branch

警告:如果正在重写的分支已被推送,则不应重写历史记录 换句话说,如果已经推送了提交d,那么您就无法在不冒数据丢失风险或产生混乱冲突的情况下执行所需操作。

好吧,假设A没有被推

git rebase是您想要的工具

git checkout A
git rebase -i a
进入交互式模式(在git的配置编辑器中),填写:

pick sha-of-b message-of-b
pick sha-of-c message-of-c
pick sha-of-d message-of-d
只需使用x(exec)命令在正确的位置插入樱桃镐:

pick sha-of-b message-of-b
pick sha-of-c message-of-c
exec git cherry-pick sha-of-e  # <--- here
pick sha-of-d message-of-d
集成提交

如果你在这个时候遇到了冲突,那么你很可能会再次遇到冲突。 解决它们,然后再次运行

git rebase --continue
完成重基


然后,您可以执行git diff HEAD@{1}来检查差异。

签出到分支a并执行以下操作:

git reset --hard HEAD~1
git cherry-pick e
git cherry-pick d
如果你在采摘樱桃时遇到冲突,请遵循以下步骤

git rebase --continue
git reset --hard HEAD~1
git cherry-pick e
git cherry-pick d