假设我有分支(\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
的顶部,然后切换d
和d
提交的位置,还是另一个办法?此外,它可能会有一些冲突 - 如何在不创建额外提交的情况下解决它们?
答案 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会:
如果有任何冲突,是时候正常解决,然后再做
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?
进行操作