我的git repo在源服务器(GitHub)上有一个master
和一个development
分支。我从development
剪切了一个功能分支,并以方式提交了太多提交,并留下了一些我想要合并/添加回来的提交development
以及其他一些我不想要重新添加的内容。
这可能吗?也就是说,如果你有一个功能分支上的50个提交,并且只想添加其中的8个到一个父分支,你能不能挑选那些8(如果你知道他们的提交SHA)并将它们添加进去?如果没有,为什么?如果是这样,那么神奇的git命令是什么?
答案 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)
并且您希望仅保留三次提交,这些提交在某种程度上与B
,G
和J
相对应。
现在我说&#34;以某种方式对应&#34;因为有两种方式可以看待&#34;只保留某些提交&#34;。假设在o
您有一些文件,包括包含文件foo
的目录o
。并假设每次提交A
到J
都会将文件添加到foo
; A
添加了foo/A
,B
添加了foo/B
等。
因此,在提交G
时,您的TREE
包含foo/o
,foo/A
,foo/B
,foo/C
,{{1} },foo/D
,foo/E
和foo/F
。
(一般来说,当然,每次提交都可以编辑一个或多个文件;但是我所询问的差异最容易说明,如果每次提交只创建一个单独的文件。原理是相同的,只要你意识到&#34;编辑文件&#34;,对git,意味着&#34;添加一些行,删除一些行,改变一些行&#34;)。
现在从根本上讲,git中的提交是整个内容的快照。所以&#34;保持提交foo/G
,B
和G
可能意味着你想要
J
其中x -- o -- x -- x <--(master)
\
AB -- CDEFG -- HIJ <--(branch)
的树包含AB
和foo/A
; foo/B
有一个CDEFG
,其中包含TREE
,foo/A
,foo/B
,foo/C
,foo/D
,foo/E
,和foo/F
;等
很多人认为提交是一组更改 - 即将提交的父级foo/G
转换为提交的修补程序&# 39; s TREE
。尽管git作为一个整体并不是那样工作的,但TREE
确实以这种方式处理提交。所以如果你这么想,也许你想要
rebase
其中x -- o -- x -- Z <--(master)
\
B' -- G' -- J' <--(branch)
相对于B'
进行与o
相同的更改相对于B
。这意味着A
有B'
TREE
(但不是foo/B
); foo/A
有一个G'
TREE
和foo/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列表的文本编辑器,其中包含从o
到A
的每个提交的条目。默认情况下,每个条目都以命令J
开头。我们将更改其中一些命令。
如果您想要pick
,AB
和CDEFG
等提交,那么您将使用命令HIJ
。这表示将提交的补丁与之前的补丁相结合。因此,您需要更改squash
的命令(合并B
与B
合并A
),AB
,D
,{ {1}}和E
(获取F
),G
和CDEFG
。
另一方面,如果您只想要I
,J
和B'
,那么您将使用G'
命令(或者只删除不需要的提交来自J'
列表)。您可以更改drop
,TODO
,A
,C
,D
,E
和F
的行。< / p>
正如我所指出的,这只是几种方式中的一种。在其核心git是一个内容存储系统,非常适合(甚至专门)存储项目历史。它在如何修改内容方面非常灵活,但它确实试图防止任何可能意外的丢失内容。