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

时间:2016-07-25 13:03:25

标签: git merge

我有一个关于如何将我的更改从一个分支合并到另一个分支的问题。这是事情的方案:

有三个分支:Master(M),Feature(F)和Development(D)

D在创建F之前从M创建,再次关闭M.理想情况下,D应该是从F创建的,具有层次结构:

table{
  cursor: pointer;
}


th  {
  cursor: hand;
}

M始终更新至其他提交的更改。

现在在我的D分支上,更改包含一系列提交,我想将其合并为F作为一个提交。我怎么做?这反过来将在稍后合并到M.

请注意,D和F可能在M的不同提交中分支。

谢谢!

3 个答案:

答案 0 :(得分:7)

  

现在在我的D分支上,更改包含一系列提交,我希望将其合并为F作为一个提交

git checkout F
git merge --squash D
git commit

答案 1 :(得分:2)

您正在寻找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。这只会显示第一个提交消息。如果您想完全丢弃所有旧的提交消息,则此选项更简单。

最后,如果你感觉非常冒险,你可以自动过滤提交列表,绕过rebase的第一个交互部分:

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

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

答案 2 :(得分:1)

  

现在在我的D分支上,更改包含一系列提交,我想将其合并为F作为一个提交。我怎么做?

git checkout D
git rebase -i F       # pick "squash" for every commit

git checkout F
git merge D

请参阅http://gitready.com/advanced/2009/02/10/squashing-commits-with-rebase.html以获得一个好例子(但它确实不是很复杂,git help rebase也应该足够了)。基本上,您编辑git rebase -i提供给您的文件,并在所有行上输入“squash”。

  

这又将在稍后合并到M.

git checkout M
git merge F