Cherry将git提交回父分支
我的git repo在源服务器(GitHub)上有一个Cherry将git提交回父分支,git,github,merge,Git,Github,Merge,我的git repo在源服务器(GitHub)上有一个主机和一个开发分支。我从development中删除了一个功能分支,并对其进行了太多的提交,剩下的是我希望合并/添加回development,还有一大堆我不希望添加回的提交 这有可能吗?也就是说,如果您在一个功能分支上有50次提交,并且只想将其中8次添加回父分支,那么您可以挑选这8次(如果您知道它们的提交SHA)并将其添加进去吗?若否,原因为何?如果是这样的话,那么git命令的神奇之处是什么呢?有多种方法可以满足您的要求。即使这个问题模棱两可
主机
和一个开发
分支。我从development
中删除了一个功能分支,并对其进行了太多的提交,剩下的是我希望合并/添加回development
,还有一大堆我不希望添加回的提交
这有可能吗?也就是说,如果您在一个功能分支上有50次提交,并且只想将其中8次添加回父分支,那么您可以挑选这8次(如果您知道它们的提交SHA)并将其添加进去吗?若否,原因为何?如果是这样的话,那么git命令的神奇之处是什么呢?有多种方法可以满足您的要求。即使这个问题模棱两可,我也可以这样说;碰巧有很多不同的方法,这取决于你想要的结果。其中一种方法是
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)
其中AB
有一个包含foo/a
和foo/B
的树;而CDEFG
有一个树
包含foo/a
,foo/B
,foo/C
,foo/D
,foo/E
,foo/F
,以及foo/G
;等等
很多人认为提交是一组更改,即将提交的父级树
转换为提交的树
的补丁。尽管git作为一个整体不是这样工作的,rebase
确实以这种方式处理提交。如果你这么想,也许你想
x -- o -- x -- Z <--(master)
\
B' -- G' -- J' <--(branch)
说起来更简单
git rebase -i master branch
仍将在正确的提交集上运行;区别在于后一个命令将使第一个“new”提交的父级Z
,而不是o
无论发出哪个命令,都会出现一个文本编辑器,其中包含一个TODO列表,其中包含从a
到J
的每个提交的条目。默认情况下,每个条目都以命令pick
开始。我们将更改其中一些命令
如果您想要像AB
、CDEFG
和HIJ
这样的提交,那么您将使用命令squash
。这意味着将提交的补丁与提交之前的补丁结合起来。因此,您需要更改B
(将B
与A
组合以产生AB
)、d
、E
、F
和G
(以获得CDEFG
),以及I
和J
另一方面,如果您只需要B'
、G'
和J'
,那么您可以使用drop
命令(或者从TODO
列表中删除不需要的提交)。您可以更改A
、C
、D
、E
、F
、H
和I
的行
正如我所指出的,这只是几种方法之一。git的核心是一个内容存储系统,它非常适合(甚至专门化)存储项目历史。它在允许您修改内容的方式上非常灵活,尽管它确实试图防止任何潜在的意外内容丢失。阅读。
git rebase -i `git merge-base master branch` branch
git rebase -i master branch