git-将一系列提交合并为一个提交

git-将一系列提交合并为一个提交,git,merge,Git,Merge,我有一个关于如何将我的更改从一个分支合并到另一个分支的问题。以下是事情的计划: 有三个分支:主(M)、特征(F)和开发(D) D是在创建F之前从M创建的,同样是从M创建的。理想情况下,D应该是从F创建的,具有以下层次结构: M | | F | | D M总是使用其他提交的更改更新到最新 现在在我的D分支上,这些更改由一系列提交组成,我想将这些提交合并到F作为一个提交。我该怎么做?这反

我有一个关于如何将我的更改从一个分支合并到另一个分支的问题。以下是事情的计划:

有三个分支:主(M)、特征(F)和开发(D)

D是在创建F之前从M创建的,同样是从M创建的。理想情况下,D应该是从F创建的,具有以下层次结构:

        M
        |
        |
        F
        |
        |
        D
M总是使用其他提交的更改更新到最新

现在在我的D分支上,这些更改由一系列提交组成,我想将这些提交合并到F作为一个提交。我该怎么做?这反过来又将在稍后合并到M

请注意,D和F可以从M中的不同提交中分支出来

谢谢

现在在我的D分支上,这些更改由一系列提交组成,我想将这些提交合并到F作为一个提交。我该怎么做

请参阅一个很好的示例(但其实并不十分复杂,
git-help-rebase
也应该足够了)。基本上,您可以编辑git rebase-i提供给您的文件,并在所有行中输入“squash”

这反过来又将在稍后合并到M

现在在我的D分支上,这些更改由一系列提交组成,我想将这些提交合并到F作为一个提交。我该怎么做

请参阅一个很好的示例(但其实并不十分复杂,
git-help-rebase
也应该足够了)。基本上,您可以编辑git rebase-i提供给您的文件,并在所有行中输入“squash”

这反过来又将在稍后合并到M


您正在寻找
git-rebase
命令。对于简单的情况,请执行以下操作:

git checkout D
git rebase F
或者,做

git rebase D F
这不会压缩为一次提交。为此,最不容易出错的选项可能是执行交互式提交:

git checkout D
git rebase -i F
这将显示一个编辑器,其中
D
中的提交将被重定基础。它看起来像这样:

pick 293a24d Some commit message
pick a015bbe Some commit message
pick e19f4fa Some commit message
pick 40ae959 Some commit message
pick fba6b72 Some commit message

# Rebase 419206d..fba6b72 onto de95063
#
# Commands:
#  p, pick = use commit
#  r, reword = use commit, but edit the commit message
#  e, edit = use commit, but stop for amending
#  s, squash = use commit, but meld into previous commit
#  f, fixup = like "squash", but discard this commit's log message
#
# If you remove a line here THAT COMMIT WILL BE LOST.
# However, if you remove everything, the rebase will be aborted.
#
按照说明操作,将除第一行以外的所有行更改为以
squash
开头,而不是以
pick
开头。这将为您提供在保存并退出编辑器后合并消息的选项

或者,您可以将拟合
pick
更改为
reword
,将其余拟合更改为
fixup
。这将仅显示第一条提交消息。如果希望完全丢弃所有旧的提交消息,则此选项更简单

最后,如果您非常喜欢冒险,您可以绕过重基的第一个交互部分,自动过滤提交列表:

EDITOR='sed -i -e "2,$s/pick/squash/"' git rebase -i F

这将自动将从第二行开始的所有行上的
pick
更改为
squash
,方法是通过
sed
而不是通常的交互式编辑器过滤编辑器文件。

您正在查找
git rebase
命令。对于简单的情况,请执行以下操作:

git checkout D
git rebase F
或者,做

git rebase D F
这不会压缩为一次提交。为此,最不容易出错的选项可能是执行交互式提交:

git checkout D
git rebase -i F
这将显示一个编辑器,其中
D
中的提交将被重定基础。它看起来像这样:

pick 293a24d Some commit message
pick a015bbe Some commit message
pick e19f4fa Some commit message
pick 40ae959 Some commit message
pick fba6b72 Some commit message

# Rebase 419206d..fba6b72 onto de95063
#
# Commands:
#  p, pick = use commit
#  r, reword = use commit, but edit the commit message
#  e, edit = use commit, but stop for amending
#  s, squash = use commit, but meld into previous commit
#  f, fixup = like "squash", but discard this commit's log message
#
# If you remove a line here THAT COMMIT WILL BE LOST.
# However, if you remove everything, the rebase will be aborted.
#
按照说明操作,将除第一行以外的所有行更改为以
squash
开头,而不是以
pick
开头。这将为您提供在保存并退出编辑器后合并消息的选项

或者,您可以将拟合
pick
更改为
reword
,将其余拟合更改为
fixup
。这将仅显示第一条提交消息。如果希望完全丢弃所有旧的提交消息,则此选项更简单

最后,如果您非常喜欢冒险,您可以绕过重基的第一个交互部分,自动过滤提交列表:

EDITOR='sed -i -e "2,$s/pick/squash/"' git rebase -i F
这将通过
sed
而不是通常的交互式编辑器过滤编辑器文件,自动将从第二行开始的所有行上的
pick
更改为
squash

现在在我的D分支上,这些更改由一系列提交组成,我想将这些提交合并到F作为一个提交

现在在我的D分支上,这些更改由一系列提交组成,我想将这些提交合并到F作为一个提交


重定基调是一个强大的工具,如果你不小心,它会让你处于一种奇怪的状态。如果您是该命令的新手,在继续之前备份您的回购协议是明智的;这不符合OP的要求。是的,他提到D应该从F分支而不是M,但这不是他的问题;他想将提交压缩成一个提交,而这不是简单的再基所能做到的。@JoeChrysler我认为这是个糟糕的建议。无论源代码管理如何,都应备份回购协议。这样的评论只是吓跑了人们,使他们不敢使用
git
。问责人如何能以一种
git-rebase-中止
git-checkout
/
git-reset
无法修复的方式,实际地搞乱回购协议。你完全正确。我希望我已经修复了你的满意。如果你不小心的话,重定基址是一个强大的工具,它会让你处于一种奇怪的状态。如果您是该命令的新手,在继续之前备份您的回购协议是明智的;这不符合OP的要求。是的,他提到D应该从F分支而不是M,但这不是他的问题;他想将提交压缩成一个提交,而这不是简单的再基所能做到的。@JoeChrysler我认为这是个糟糕的建议。无论源代码管理如何,都应备份回购协议。这样的评论只是吓跑了人们,使他们不敢使用
git
。问责人如何能以一种
git-rebase-中止
git-checkout
/
git-reset
无法修复的方式,实际地搞乱回购协议。你完全正确。我希望我已经修复到您满意的程度。当我执行
git日志
时,输出将显示压缩在一起的提交列表。有没有办法只使用新的提交ID wi