Git 合并提交到一个分支中

Git 合并提交到一个分支中,git,git-cherry-pick,Git,Git Cherry Pick,我是Git的新手 我已经创建了一个新分支new\u branch。我已在不同的分支中完成所有更改和提交旧分支。现在我想通过git cherry pick从分支old\u分支到new\u分支选择一些提交。为此,我首先需要知道哪些提交在该分支中,然后选择它们并与new\u分支合并 我该怎么做 git checkout new_branch git log old_branch 日志将显示old_分支中的每个提交,在提交消息的正上方有一个长字符串,如“cf5e845a13866239eb87f259

我是Git的新手

我已经创建了一个新分支
new\u branch
。我已在不同的分支中完成所有更改和提交
旧分支
。现在我想通过
git cherry pick
从分支
old\u分支
new\u分支
选择一些提交。为此,我首先需要知道哪些提交在该分支中,然后选择它们并与
new\u分支合并

我该怎么做

git checkout new_branch
git log old_branch
日志将显示old_分支中的每个提交,在提交消息的正上方有一个长字符串,如“cf5e845a13866239eb87f2593d6edc6e273decc5”。这是提交散列。然后你就可以做了

git cherry-pick <commit hash>
git樱桃采摘

对于您想要的每个提交。我建议按时间顺序执行这些操作(从底部向上操作日志)。

有很多方法可以实现这一点,下面是提交列表的几个方法:

git log --cherry new_branch..old_branch --oneline
将显示
旧分支
中无法从
旧分支
访问的所有提交

或者另一种方式:

git checkout old_branch
git cherry new_branch --abbrev=6 -v
这将显示您在
旧分支
中提交(没有引入相同更改的提交),并将标记提交以指示它们是否已
-
,或者尚未“+”被选入
新分支
,例如:

+2bdcd1 1st commit     (Has not been cherry picked)
-8de6cc 2nd Commit     (Has been cherry picked)
+8ac1ee 3nd Commit     (Has not been cherry picked)
在这两种情况下,您都可以使用

git cherry-pick <commit>
git樱桃采摘

尽管您希望在第二种情况下签出“new_branch”。

由@naomi给出的方法可以很好地工作,但有一种更简单的方法。您的
old_分支
分支从其他分支上的某个提交开始,如下所示:

A --- B --- C --- D      <-- devel (let's say it's branch devel, anyway)
        \
          E - F - G - H  <-- old_branch
这样做的目的是制作从E到H的“副本”,在“D”之后添加每个副本。然后,它剥离标签
old_branch
(用于命名commit H)并将其粘贴到H的副本上,给出以下内容:

A --- B --- C --- D                    <-- devel
       \           \
        \           E' - F' - G' - H'  <-- old_branch
         \
          E - F - G - H                    [abandoned, see footnote]
现在,
new\u branch
old\u branch
在内容上是相同的,但名称不同

现在,您可以简单地
rebase-i
(交互式,让您选择)
new\u branch
到您想要的位置。我一直在这里假设commit
C
,我一直假设它比名为
devel
的分支提示后退了一步,所以我将使用它运行:

$ git rebase -i --onto devel~1 devel new_branch
在您选择了
rebase-i
允许的方式(并解决了删除某些提交和
git rebase--continue
在解决后继续的冲突)之后,您将得到类似的结果,具体取决于您采取的提交和删除的提交。我假设您删除了F,但保留了其余部分:

A --- B --- C --- D                    <-- devel
       \      \
        \       E' - G' - H'           <-- new_branch
         \
          E - F - G - H                <-- old_branch
这里的结果与之前几乎相同,只是现在提交E'从D中删除,而不是从C中删除:

A --- B --- C --- D                    <-- devel
       \           \
        \            E' - G' - H'      <-- new_branch
         \
          E - F - G - H                <-- old_branch

A--B--C--D是否要将所有提交从旧分支挑选到新分支?如果是这样,只需执行“git checkout new_branch;git merge old_branch”不,我不想选择所有提交,只想选择其中的一部分。我不会说这更简单,但对于像我们这样精通git的人来说更令人满意。对于一个git初学者来说,阅读和理解它所涉及的概念需要一到几个小时,所以naomi的一本实际上更容易
A --- B --- C --- D                    <-- devel
       \      \
        \       E' - G' - H'           <-- new_branch
         \
          E - F - G - H                <-- old_branch
$ git branch new_branch old_branch
$ git rebase -i devel new_branch
A --- B --- C --- D                    <-- devel
       \           \
        \            E' - G' - H'      <-- new_branch
         \
          E - F - G - H                <-- old_branch