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

时间:2015-08-20 11:28:22

标签: git

假设我有分支(\w)=(\w)A

B

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

A

怎么做?

我应A: a b c e d 首先提交cherry-pick,将其置于e的顶部,然后切换dd提交的位置,还是另一个办法?此外,它可能会有一些冲突 - 如何在不创建额外提交的情况下解决它们?

3 个答案:

答案 0 :(得分:2)

您可以在分支d之上挑选提交B。如果您不想修改分支B,请创建分支B的副本作为分支C并在那里进行适当的更改。 不久:

git checkout -b C B // copy branch B to new branch C
git cherry-pick d // we are on C branch, cherry-pick d commit
//resolve conflicts as git is describing

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

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将允许您解决它,并且更改将保存在commit d中(它实际上不会是同一个提交,因为它将拥有新的父级,它将包含冲突解决变化)。命令模式下的git将为您提供有关在采摘时解决冲突的所有必要提示。

如果你真的需要对分支A进行更改(这不应该是必要的),请按照我上面所写并硬重置分支A来分支C

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

答案 1 :(得分:0)

警告:如果已经推送了正在重写的分支,则不应该重写历史记录 换句话说,如果已经推送了提交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会:

  • 结帐 a
  • 按原样使用 b c (此时,它与直接git结帐 c 完全相同)
  • cherry-pick e

如果有任何冲突,是时候正常解决,然后再做

git rebase --continue

整合提交 d

如果您遇到冲突,那么您此时可能会再次发生冲突。 解决它们,然后再次运行

git rebase --continue

完成rebase。

然后你可以做一个git diff HEAD @ {1}来检查差异。

答案 2 :(得分:0)

结帐到分支A并执行以下操作:

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

如果你在挑选时遇到冲突,请按照How do I resolve cherry-pick conflicts using their changes?

进行操作