Cherry将git提交回父分支

Cherry将git提交回父分支,git,github,merge,Git,Github,Merge,我的git repo在源服务器(GitHub)上有一个主机和一个开发分支。我从development中删除了一个功能分支,并对其进行了太多的提交,剩下的是我希望合并/添加回development,还有一大堆我不希望添加回的提交 这有可能吗?也就是说,如果您在一个功能分支上有50次提交,并且只想将其中8次添加回父分支,那么您可以挑选这8次(如果您知道它们的提交SHA)并将其添加进去吗?若否,原因为何?如果是这样的话,那么git命令的神奇之处是什么呢?有多种方法可以满足您的要求。即使这个问题模棱两可

我的git repo在源服务器(GitHub)上有一个
主机
和一个
开发
分支。我从
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