在一个分支上压缩提交记录

38

在将分支合并到主分支之前,是否有可能将分支上的提交压缩为一个单独的提交?我认为这应该是一个相当常见的情况,但也许我没有使用正确的搜索词。

我将更详细地解释一下情境。通常,我会在分支上进行许多本地提交,以确保我拥有全面的变更历史记录。但是,一旦完成分支中的更改并准备将其合并到主分支中时,我希望将分支上的提交压缩为一个单独的提交,然后再将其合并到主分支。我确实了解在Git中提交很廉价,但在某些情况下,我可能只是更喜欢这样做。

*   merge to main
|\
* | commit 2 on main
* | commit 1 on main
| * commit 2 on branch
| * commit 1 on branch
|/
*   branch from main

要让它看起来像

*   merge to main
|\
* | commit 2 on main
* | commit 1 on main
| * commit on branch (branch commits flattened to one)
|/
*   branch from main

在Git方面,我是一个新手。如果我使用术语犯了错误,我向您道歉。

4个回答

34

我建议学习使用交互式rebase,但如果它对你来说似乎太复杂了,你可以简单地使用

git reset --soft <分叉点提交>

撤销所有提交直到分叉点,而不更改索引,并用

git commit -s

将所有更改合并为一个提交。


18

使用交互式 rebase。找到您的分支与主分支分岔的提交(可以使用 git merge-base 命令来查找,我们将该提交称为 <diverge>),然后:

git rebase -i <diverge>

一个编辑器会弹出,允许您交互式地重写历史记录。您需要压缩提交。


3
谢谢。在你的提示下,我找到了这篇文章(http://ariejan.net/2011/07/05/git-squash-your-latests-commits-into-one/),它提供了一个示例来说明如何将最新的几次提交压缩成一个提交。 - Coffee And Keyboard

14

你也可以使用 git merge --squash <branch> 命令来合并一个分支,而不会执行任何提交操作:

$ git checkout master
$ git merge --squash mybranch
...
Squash commit -- not updating HEAD
Automatic merge went well; stopped before committing as requested
$ git commit

(更新:已删除提倡避免重写历史的文章链接。 我现在认为在审核之前压缩小的功能分支是一个好习惯。)


15
关于撒谎的文章似乎过分关注“说谎让你看起来好”。这很好,但是如何重新组织提交以使代码审查更简单,这是一个值得尊敬的目标。在这种情况下撒谎有多糟糕? - guioconnor

3

看一下 git rebase。选项-i 提供了编辑、合并(你想要的),甚至删除提交记录的机会。

例如,我通常使用它的方式是:

git rebase -i origin/master
....
git push

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接