我在一个分支上提交了A-B-C-D 并希望将A-B-C合并到另一个。
我知道你可以一个接一个地执行git cherry-pick,我的问题是我是否可以将这些提交组合在一起并希望能够进行压制。
答案 0 :(得分:9)
就像Autocracy所说,git rebase可能就是你想要的。
一个例子:
假设您有A-B-C-D
并希望将A-B-C
合并到Y
。
创建C
的克隆并将克隆重新绑定到Y
:
git checkout -b C_copy C
git rebase --onto Y A~1 C_copy # <= --onto [target] [source] [what]
检查一切是否顺利,并在必要时解决冲突。
现在C_copy
已Y
,Y-[A_copy]-[B-copy]-C_copy
您可以使用交互式rebase进行编辑,例如压扁它(假设你还在C_copy
):
git rebase -i HEAD~3
如果出现问题,您可以放弃C_copy
,因为它不会影响C
。
现在,您可以快进Y
至C_copy
或使用git merge --no-ff
合并(如果您愿意,请指定--no-commit
编辑您的提交):
git checkout Y
git merge --no-ff [--no-commit] C_copy
答案 1 :(得分:2)
git checkout branch-to-merge-on; git merge tag-or-sha1-of-commit-c
不应该有用吗?
以下是我所期望的:
git init
touch init; git add init; git commit -m 'init'
git checkout -b abcd
touch a; git add a; git commit -m 'a'
touch b; git add b; git commit -m 'b'
touch c; git add c; git commit -m 'c'; git tag commit-c
touch d; git add d; git commit -m 'd'
git checkout master
touch e; git add e; git commit -m 'e'
git merge commit-c
导致
init -- e -- merged <- (master)
\ /
a -- b -- c -- d <- (abcd)
这会在c之前合并所有(在这种情况下直到共同的祖先(init)),但看起来这就是你想要做的。如果没有,那么在其他地方git rebase
a-b-c-d可能是合适的。
答案 2 :(得分:2)
最简单的事情是
git branch featureX C
git checkout branch_to_merge_to
git merge featureX
如果要压缩,可以选择将--squash
添加到合并命令。
这假设A的父级是合并基础。如果不是,那么你就没有合并。
希望这有帮助。
答案 3 :(得分:1)
wnoise的解决方案看起来更好,并且可以与git rebase结合使用以完成。
init -- e -- a -- b -- c (merged) <- (master)
\ /
\ -----
\ /
a -- b -- c -- d <- (abcd)
如果您不想在主人身上使用'a',那么您可以更轻松地使用rebase:
git rebase -i init
并丢弃不需要的提交
init -- e -- b -- c (merged) <- (master)
答案 4 :(得分:0)
最好的方法是使用git rebase -i
。如果您想保留历史记录,可以使用新分支执行此操作。您还可以重新绑定到现有基础并使用交互式会话来压缩或跳过提交,然后合并,如果您希望它显示为合并而不是直接提交。
答案 5 :(得分:0)
您可以git cherry-pick --no-commit A B C
然后执行提交。