GIT:如何从一个分支到另一个分支进行部分合并?

GIT:如何从一个分支到另一个分支进行部分合并?,git,Git,我在一个分支上提交了A-B-C-D 想把A-B-C合并到另一个 我知道您可以一个接一个地执行git cherry pick,我的问题是我是否可以将这些提交组合在一起并希望执行挤压。最好的方法是使用git rebase-I。如果你想保留历史,你可以用一个新的分支来实现。您还可以在现有基础上重新设置基础,并使用交互式会话挤压或跳过提交,然后将其合并,如果您希望它显示为合并而不是直接提交。您可以执行git cherry pick--no commit a B C然后执行提交。不应执行要合并的git签出

我在一个分支上提交了A-B-C-D 想把A-B-C合并到另一个


我知道您可以一个接一个地执行git cherry pick,我的问题是我是否可以将这些提交组合在一起并希望执行挤压。

最好的方法是使用
git rebase-I
。如果你想保留历史,你可以用一个新的分支来实现。您还可以在现有基础上重新设置基础,并使用交互式会话挤压或跳过提交,然后将其合并,如果您希望它显示为合并而不是直接提交。

您可以执行
git cherry pick--no commit a B C
然后执行提交。

不应执行要合并的git签出分支;git merge tag-or-sha1-of-commit-cwork

以下是我所期望的:

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)
init--e--merged就像前面所说的,这可能是您想要的

例如:

假设您有
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\u copy
,因为它不会影响
C

现在,您可以将
Y
快进到
C\u copy
或使用
git merge--no ff
将其合并(如果愿意,请指定
--no commit
编辑您的提交):

最简单的是

git branch featureX C
git checkout branch_to_merge_to
git merge featureX
如果要挤压,可以选择将
--squash
添加到merge命令

这假定A的父级是合并基。如果不是,则不进行合并


希望这能有所帮助。

wnoise的解决方案看起来更好,可以与git rebase结合完成

init -- e --  a -- b -- c (merged)   <- (master)
  \                    /
   \             -----
    \           /   
     a -- b -- c -- d    <- (abcd)
并丢弃不需要的提交

init -- e -- b -- c (merged)   <- (master)

init--e--b--c(merged)如果你能画出你想要的结果,我可以给你一个到那里的命令演练。他想要合并,而不是重新设置任何基础。
cherry pick
不会导致合并。问题是不明确的,尤其是当他提到挤压提交时。如果OP的DAG与您的假设相符,这是可行的。如果在
init
A
之间存在OP不希望“合并”的其他提交,则可能不可取。
init -- e --  a -- b -- c (merged)   <- (master)
  \                    /
   \             -----
    \           /   
     a -- b -- c -- d    <- (abcd)
git rebase -i init
init -- e -- b -- c (merged)   <- (master)