2016-07-25 133 views
1

我有一个关于如何将我的更改从一个分支合并到另一个分支的问题。下面是对事物的计划:git - 将一系列提交合并为一个提交

有三个分支:硕士(M),功能(F)和发展(d)

d创建关中号之前F的创建,又出发了M.理想的情况下,d应该已经由F创建,具有层次结构:

 M 
     | 
     | 
     F 
     | 
     | 
     D 

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

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

请注意,d和F可以在M.

由于可以分出不同的提交!

回答

7

现在我d分支,这些变化包括一系列提交我想合并到F其中作为一个犯

git checkout F 
git merge --squash D 
git commit 
+0

当我做一个'git log'时,输出显示被压扁在一起的提交列表。有没有办法做到这一点,只有新的提交ID和评论'合并'会显示? – Maddy

+1

是的,使用'git commit -m '。一个空的'git commit'使用'merge --squash'中的默认值,它是分支提交的连接列表。 – RJFalconer

+0

非常整洁,也可能是最安全的方式,因为不涉及任何rebase。 –

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

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

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

这将自动更改picksquash上开始与所有行第二行是通过sed而不是通常的交互式编辑器来过滤编辑器文件。

+0

衍合是一个强大的工具,可以让你在一个奇怪的状态,如果你不小心。如果您不熟悉命令,在继续操作之前备份您的回购是明智的。 –

+0

-1;这不是OP所要求的。是的,他提到D应该是F而不是M,但这不是他的问题;他想压缩一个承诺,这不是一个简单的基金会会做什么。 – RJFalconer

+0

@JoeChrysler我认为这是不好的建议。无论源代码管理如何,Repos都应备份。像这样的评论会吓跑人们使用'git'。怎样才能真正地混淆他的回购?'git rebase --abort'或'git checkout' /'git reset'无法修复? – RJFalconer