Git 合并提交到一个分支中
我是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
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
到您想要的位置。我一直在这里假设commitC
,我一直假设它比名为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