2011-01-05 80 views
43

通常,我在Git中使用分支,但我不喜欢在工作树(Git历史记录)中看到数百个分支。我想知道在Git中是否有一个方法在一次提交中“加入”分支中的所有提交(理想情况下使用明确的提交消息)。Git:只合并一个提交

事情是这样的:

git checkout -b branch 
<some work> 
git commit -a -m "commit 1" 
<some work> 
git commit -a -m "commit 2" 
<some work> 
git commit -a -m "commit 3" 
git checkout master 
git SUPER-JOIN branch -m "super commit" 

在此之后,只有 “超级承诺” 将在git的日志存在。

回答

41

这是可以做到,看到

Git merge flattening

git: squash/fixup earlier commit

+2

git merge --squash真是太棒了。我希望在2011年我更仔细地阅读了这个;)+1 – 2013-01-06 21:22:17

+6

git merge --squash的问题在于它实际上并没有创建合并提交。像GitHub的网络浏览器的GUI不会显示分支重新加入;一个会突然结束而另一个继续。 – Maxpm 2013-06-12 17:54:12

66

这听起来像你正在寻找的--squash选项git-merge:使用git rebase和壁球,或使用git merge --squash

git checkout master 
git merge --squash branch -m "super commit" 
+4

+1性感的回答! – JohnnyQ 2013-05-16 07:09:15

+0

美丽的谢谢你! – Denis 2014-01-03 19:00:50

+3

这可能在过去有效,但它不再起作用。 (git v1.7.9)输出'Fast-forward(没有创建任何提交; -m选项被忽略)'消息,并且留下一个未提交的更改。 '--no-ff'选项看起来很有前途,但仍然创建了与所有单独提交的合并。 – 2014-01-15 02:00:12

13

如果你是积极的,你只想要一个承诺,并罚款从来没有被标记为“合并”(也许是因为你即将与git branch -D my-squash-merged-branch删除它,再也不想看到它)的分支,使用:

git checkout master 
git merge --squash branch-to-merge 
git commit -m "message for commit" 

然而,许多测试之后,我相信最好的方式合并分支是:

git checkout master 
git merge --no-ff branch-to-merge -m "message for commit" 

这就避免了“快进”合并是不允许指定-m "message"选项很多合并。它不是实际上提供了最初请求的单个提交,但至少可以很容易地看到分支的开始/结束,因此可以轻松恢复等等。一个git log将显示所有被合并,个人提交...

commit a6672a4c3d90c35d5f39c45f307ef6b385660196 
Merge: 015f8d6 f84e029 
Author: Brian White <[email protected]> 
Date: Wed Jan 15 20:47:35 2014 -0500 

    merged something trivial 

commit f84e02915faa02afc9a31b8c93a6e7712420687d 
Author: Brian White <[email protected]> 
Date: Wed Jan 15 20:47:12 2014 -0500 

    added something also trivial 

commit 904d5b5ff00d691d63104a77d2e2ca484732a5fb 
Author: Brian White <[email protected]> 
Date: Wed Jan 15 20:46:26 2014 -0500 

    added something trivial 

commit 015f8d681bdaf65725067ee8058215cedb529dd6 
Author: Brian White <[email protected]> 
Date: Wed Jan 15 20:23:31 2014 -0500 

    optimizations to MyThing 
... 

...但如果你看看日志(git log --graph)的,你可以看到,混帐确实认识到它作为一个合并。

* commit a6672a4c3d90c35d5f39c45f307ef6b385660196 
|\ Merge: 015f8d6 f84e029 
| | Author: Brian White <[email protected]> 
| | Date: Wed Jan 15 20:47:35 2014 -0500 
| | 
| |  merged something trivial 
| | 
| * commit f84e02915faa02afc9a31b8c93a6e7712420687d 
| | Author: Brian White <[email protected]> 
| | Date: Wed Jan 15 20:47:12 2014 -0500 
| | 
| |  added something also trivial 
| | 
| * commit 904d5b5ff00d691d63104a77d2e2ca484732a5fb 
|/ Author: Brian White <[email protected]> 
| Date: Wed Jan 15 20:46:26 2014 -0500 
| 
|  added something trivial 
| 
* commit 015f8d681bdaf65725067ee8058215cedb529dd6 
| Author: Brian White <[email protected]> 
| Date: Wed Jan 15 20:23:31 2014 -0500 
| 
|  optimizations to MyThing 
... 

如果提交或其他活动发生在主分支,该图表将显示合并后的分支开始在正确的地方,在目前的头部结合,但当然,所有提交仍将日志与中所示来自顶部的分支承诺。

+0

像我以为'git merge --squash'会工作。 – r0hitsharma 2014-06-03 21:26:07