Git:仅在一次提交中合并

Iva*_*van 44 git branch

通常,我在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"
Run Code Online (Sandbox Code Playgroud)

在此之后,git日志中只存在"超级提交".

Gre*_*ill 68

听起来你正在寻找以下--squash选项 git-merge:

git checkout master
git merge --squash branch -m "super commit"
Run Code Online (Sandbox Code Playgroud)

  • 这可能在过去有效,但它不再起作用.(git v1.7.9)输出消息"快进(没有提交创建;忽略-m选项)",我留下了未提交的更改.`--no-ff`选项看起来很有前途,但仍然创建了与所有单独提交的合并. (3认同)
  • 我相信 `--squash` 总是禁止立即提交。从我的搜索来看,普遍接受的答案是 `merge --squash` 加上单独的提交(技术上使分支“挂起”,在 UI 查看器中可见)和 `rebase --squash` 加上单独的合并(这更复杂并在没有单独提交的情况下离开原始分支)。但我会继续寻找(和试验)以尝试找到更好的东西。 (2认同)

ton*_*nio 41

这可以使用git rebase和压缩,或使用git merge --squash,请参阅

Git合并扁平化

git:squash/fixup之前的提交

  • `git merge --squash`的问题在于它实际上并没有创建合并提交.像GitHub的网络查看器这样的GUI不会显示分支重新加入; 一个人会突然结束,而另一个继续. (6认同)
  • git merge --squash很棒.我希望我在2011年更仔细地阅读这篇文章;)+1 (2认同)

Bri*_*ite 14

如果你是肯定的,你只需要一次提交,并且没有被标记为"合并"的分支(可能是因为你将要删除它git branch -D my-squash-merged-branch并且永远不想再看到它),请使用:

git checkout master
git merge --squash branch-to-merge
git commit -m "message for commit"
Run Code Online (Sandbox Code Playgroud)

但经过大量测试后,我认为合并大多数分支的最佳方法是:

git checkout master
git merge --no-ff branch-to-merge -m "message for commit"
Run Code Online (Sandbox Code Playgroud)

这避免了"快进"合并,不允许-m "message"为许多合并指定选项.它实际上并不提供最初请求的单个提交,但至少可以很容易地看到分支的开始/结束,因此易于恢复等.A 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
...
Run Code Online (Sandbox Code Playgroud)

...但是如果你看一下log()的图形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
...
Run Code Online (Sandbox Code Playgroud)

如果主分支上发生了提交或其他活动,则图形将显示从正确位置开始并在当前头部加入的合并分支,但当然所有提交仍将显示在日志中,其中来自分支的提交位于最佳.