Cherry采摘git将SHA提交回父分支

时间:2017-11-22 13:26:11

标签: git github merge

我的git repo在源服务器(GitHub)上有一个master和一个development分支。我从development剪切了一个功能分支,并以方式提交了太多提交,并留下了一些我想要合并/添加回来的提交development以及其他一些我不想要重新添加的内容。

可能吗?也就是说,如果你有一个功能分支上的50个提交,并且只想添加其中的8个到一个父分支,你能不能挑选那些8(如果你知道他们的提交SHA)并将它们添加进去?如果没有,为什么?如果是这样,那么神奇的git命令是什么?

1 个答案:

答案 0 :(得分:1)

有多种方法可以做你要求的事情。即使问题含糊不清,我也可以这样说;它恰好发生了不同的多种方式,具体取决于您正在寻找的结果。其中一种方式 - 你用你的问题表达方式诱饵的方式 - 就是cherry-pick命令。但我不推荐它,因为有更简单的方法。

例如,在您的情况下,您可以使用git rebase。您可以将cherry-pick视为rebase的特例,或者您可以将rebase视为(以及其他)自动执行一系列cherry-pick的方法。

在任何情况下,作为一个更小/更容易显示的例子,假设你从

开始
x -- o -- x -- x <--(master)
      \
       A -- B -- C -- D -- E -- F -- G -- H -- I -- J <--(branch)

并且您希望仅保留三次提交,这些提交在某种程度上与BGJ相对应。

现在我说&#34;以某种方式对应&#34;因为有两种方式可以看待&#34;只保留某些提交&#34;。假设在o您有一些文件,包括包含文件foo的目录o。并假设每次提交AJ都会将文件添加到foo; A添加了foo/AB添加了foo/B等。  因此,在提交G时,您的TREE包含foo/ofoo/Afoo/Bfoo/C,{{1} },foo/Dfoo/Efoo/F

(一般来说,当然,每次提交都可以编辑一个或多个文件;但是我所询问的差异最容易说明,如果每次提交只创建一个单独的文件。原理是相同的,只要你意识到&#34;编辑文件&#34;,对git,意味着&#34;添加一些行,删除一些行,改变一些行&#34;)。

现在从根本上讲,git中的提交是整个内容的快照。所以&#34;保持提交foo/GBG可能意味着你想要

J

其中x -- o -- x -- x <--(master) \ AB -- CDEFG -- HIJ <--(branch) 的树包含ABfoo/A; foo/B有一个CDEFG,其中包含TREEfoo/Afoo/Bfoo/Cfoo/Dfoo/E,和foo/F;等

很多人认为提交是一组更改 - 即将提交的父级foo/G转换为提交的修补程序&# 39; s TREE。尽管git作为一个整体并不是那样工作的,但TREE确实以这种方式处理提交。所以如果你这么想,也许你想要

rebase

其中x -- o -- x -- Z <--(master) \ B' -- G' -- J' <--(branch) 相对于B'进行与o相同的更改相对于B。这意味着AB' TREE(但不是foo/B); foo/A有一个G' TREEfoo/B;等

无论哪种方式,交互式rebase都可以完成这项工作。它会创建您想要的新的,更少的提交,并移动foo/G来引用它们;你可以从那里继续。

如果您希望保留基于branch的分支,您可能会执行类似

的操作
o

说起来会更简单

git rebase -i `git merge-base master branch` branch

仍将在正确的提交集上运行;不同的是,后一个命令将使第一个&#34; new&#34;提交父母git rebase -i master branch 而不是Z

您发出的任何命令都会打开一个带有TODO列表的文本编辑器,其中包含从oA的每个提交的条目。默认情况下,每个条目都以命令J开头。我们将更改其中一些命令。

如果您想要pickABCDEFG等提交,那么您将使用命令HIJ。这表示将提交的补丁与之前的补丁相结合。因此,您需要更改squash的命令(合并BB合并A),ABD,{ {1}}和E(获取F),GCDEFG

另一方面,如果您只想要IJB',那么您将使用G'命令(或者只删除不需要的提交来自J'列表)。您可以更改dropTODOACDEF的行。< / p>

正如我所指出的,这只是几种方式中的一种。在其核心git是一个内容存储系统,非常适合(甚至专门)存储项目历史。它在如何修改内容方面非常灵活,但它确实试图防止任何可能意外的丢失内容。