如果你确定你只需要一次提交,并且分支永远不会被标记为“合并”(可能是因为你将要使用 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 <bcwhite@example.com>
Date: Wed Jan 15 20:47:35 2014 -0500
merged something trivial
commit f84e02915faa02afc9a31b8c93a6e7712420687d
Author: Brian White <bcwhite@example.com>
Date: Wed Jan 15 20:47:12 2014 -0500
added something also trivial
commit 904d5b5ff00d691d63104a77d2e2ca484732a5fb
Author: Brian White <bcwhite@example.com>
Date: Wed Jan 15 20:46:26 2014 -0500
added something trivial
commit 015f8d681bdaf65725067ee8058215cedb529dd6
Author: Brian White <bcwhite@example.com>
Date: Wed Jan 15 20:23:31 2014 -0500
optimizations to MyThing
...
...但是如果您查看日志 (git log --graph) 的 图表,您会发现 git 确实将其识别为单个合并。
* commit a6672a4c3d90c35d5f39c45f307ef6b385660196
|\ Merge: 015f8d6 f84e029
| | Author: Brian White <bcwhite@example.com>
| | Date: Wed Jan 15 20:47:35 2014 -0500
| |
| | merged something trivial
| |
| * commit f84e02915faa02afc9a31b8c93a6e7712420687d
| | Author: Brian White <bcwhite@example.com>
| | Date: Wed Jan 15 20:47:12 2014 -0500
| |
| | added something also trivial
| |
| * commit 904d5b5ff00d691d63104a77d2e2ca484732a5fb
|/ Author: Brian White <bcwhite@example.com>
| Date: Wed Jan 15 20:46:26 2014 -0500
|
| added something trivial
|
* commit 015f8d681bdaf65725067ee8058215cedb529dd6
| Author: Brian White <bcwhite@example.com>
| Date: Wed Jan 15 20:23:31 2014 -0500
|
| optimizations to MyThing
...
如果主分支上发生提交或其他活动,图表将显示合并的分支从正确的位置开始并在当前头部加入,但当然所有提交仍将显示在日志中,其中包含来自分支的提交位居榜首。