如何将两个提交合并为一个提交?

Posted

技术标签:

【中文标题】如何将两个提交合并为一个提交?【英文标题】:How can I combine two commits into one commit? 【发布时间】:2012-09-13 09:44:49 【问题描述】:

我有一个包含 2 次提交的分支“firstproject”。我想摆脱这些提交并使它们显示为单个提交。

命令git merge --squash 听起来很有希望,但是当我运行git merge --squash 时,我的终端只会显示该命令的选项。什么是正确的命令?

Commit 1:
Added 'homepage.html'
Added 'contacts.html'

Commit 2:
Added 'homepage.php'
Added 'homepage.php'
Deleted 'homepage.html'
Deleted 'contacts.html'

【问题讨论】:

我认为这不是正确的命令。另外,我怀疑您甚至可以更改这样的提交。 不,您可以将多个提交更改为一个提交:git-scm.com/book/en/Git-Tools-Rewriting-History 我的问题只是关于它的具体命令。 @BSull 您绝对可以以任何您想要的方式更改提交。它们几乎在任何时候都是完全可编辑的。如果您与他人共享代码,这样做会改写您的历史,您将有效地使用与其他人不同的分支。 这不应该被欺骗。事实上,另一个应该被关闭的太宽泛了。另一个被标记为受骗的问题是不必要的复杂,因为它涉及放弃先前的变基。 【参考方案1】:

你想git rebase -i 执行interactive rebase。

如果您当前您的“提交 1”,并且您要合并的提交“提交 2”是之前的提交,您可以运行 git rebase -i HEAD~2,它将生成列出 rebase 将遍历的所有提交的编辑器。您应该看到以“pick”开头的两行。要继续挤压,将第二行的第一个单词从“pick”更改为“squash”。然后保存文件,然后退出。 Git 会将你的第一个提交压缩到你的第二个最后提交。

请注意,此过程会重写您的分支的历史记录。如果您将代码推送到某个地方,则必须发送至 git push -f,任何共享您的代码的人都必须跳过一些障碍来拉取您的更改。

请注意,如果有问题的两个提交不是分支上的最后两个提交,则过程会略有不同。

【讨论】:

Then write your file, and quit怎么办?我正在使用 android Studio 终端、git 控制台本身,甚至是由 SourceTree 软件打开的 git 控制台。但是如何保存和退出呢? 如何合并不是分支上最后两个提交的 2 个提交? @meagar 我认为这确实有道理......如果你检查这个问题(这个问题的副本),挤压“方向”会产生很大的不同,并且是整个问题的根源(参见第一条评论大约有 200 个关于“以错误的方式挤压”的评论)-***.com/a/2568581/43453 @PandaWood 你误读了答案。第一种方法很简单错误,而不是不同。您可以向后压缩,考虑将较旧的提交压缩到较新的提交是没有意义的,但如果您可以,这将是相同的操作。 我理解为“更改第二行的第一个单词” - 第二行是什么?【参考方案2】:
    检查您的分支并计算所有提交的数量。 打开 git bash 并写入:git rebase -i HEAD~<quantity of your commits>(即git rebase -i HEAD~5) 在打开的txt 文件中,将所有提交的pick 关键字更改为squash,但第一次提交(位于顶部)除外。对于最上面的一个,将其更改为reword(这意味着您将在下一步中为此提交提供新评论),然后单击保存!如果在 vim 中,请按 esc,然后输入 wq! 保存并按 Enter。 提供评论。 打开 Git 并进行“获取所有”以查看新更改。

完成

【讨论】:

【参考方案3】:

像我这样健忘的懒人简单版:

git rebase -i HEAD~3 或者但是很多提交而不是 3。

转这个

pick YourCommitMessageWhatever
pick YouGetThePoint
pick IdkManItsACommitMessage

进入这个

pick YourCommitMessageWhatever
s YouGetThePoint
s IdkManItsACommitMessage

并执行一些操作,点击esc 然后点击enter 以保存更改。 [1]

当下一个屏幕出现时,摆脱那些垃圾 # 行 [2] 并创建一个新的提交消息或其他东西,然后执行相同的 escape enter 操作。 [1]

哇,你的提交更少了。或者你只是破坏了一切。


[1] - 或者任何适用于你的 git 配置的东西。考虑到我的设置,这只是一个有效的序列。

[2] - 你会看到像# this is your n'th commit 这样的东西几次,你的原始提交就在这些消息的正下方。您想删除这些行,并创建一个提交消息以反映您合并为 1 的 n 个提交的意图。

【讨论】:

非常简洁的解决方案 - 谢谢。概述这里使用的s 代表壁球可能会很方便。使用提交,但融合到之前的提交中 如果您只有2 提交并且想要合并相同的2 提交,则需要运行git reset --soft HEAD~git commit --amend @Stachu 当我在此之后命令推送时,它会要求拉取和合并。我能做些什么来避免这种情况? 你为什么不想拉和合并?

以上是关于如何将两个提交合并为一个提交?的主要内容,如果未能解决你的问题,请参考以下文章

如何将多个提交合并到另一个分支上作为单个压缩提交?

合并 Git 存储库的前两个提交?

如何使用正常提交压缩合并提交?

如何提交两个分支的“git diff”?

如何修改git已经提交的信息及合并多次提交

执行合并后在两个分支中同时提交