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


102

我有一个带有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'

我认为这不是正确的命令。另外,我怀疑您是否可以像这样更改提交。
BSull 2012年

不,您可以将多个提交更改为一个提交:git-scm.com/book/en/Git-Tools-Rewriting-History 我的问题只是关于它的特定命令。
Don P

@BSull绝对可以按您想要的任何方式更改提交。它们几乎可以随时进行完全编辑。如果您要与他人共享代码,那么这样做将重写您的历史记录,并且您将有效地使用与其他人不同的分支。
meagar

这应该永远不会被欺骗。实际上,应该以太宽泛的角度关闭另一个。被标记为重复的另一个问题是不必要的复杂问题,因为它涉及放弃先前的基准。
埃文·卡罗尔

Answers:


143

您要git rebase -i执行交互式变基

如果您当前正在执行“ commit 1”,而您要合并的提交“ commit 2”是上一个提交,则可以运行git rebase -i HEAD~2,这将生成一个编辑器,列出重新定位将遍历的所有提交。您应该看到两行以“ pick”开头。要进行压扁,请将第二行的第一个单词从“ pick”更改为“ squash”。然后保存文件,然后退出。Git会将您的第一次提交压缩为您的第二次提交提交。

请注意,此过程将重写分支的历史记录。如果您要将代码推送到某个地方,则必须这样做git push -f,共享代码的任何人都必须跳过一些麻烦才能完成更改。

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


2
怎么办Then write your file, and quit?我正在使用Android Studio Terminal,git控制台本身,甚至是通过SourceTree软件打开的git控制台。但是如何保存并退出呢?
Dr.jacky

1
如何合并不是分支中最后两个提交的2个提交?
曾伟石

1
@meagar我认为这是有道理的...如果您检查此问题(此问题的重复项),那么挤压“方向”会产生很大的不同,并且是整个问题的根源(请参阅第一个评论,其中包含200左右关于“挤压错误的方式“) - stackoverflow.com/a/2568581/43453
PandaWood

1
@PandaWood您在误解答案。第一种方法是简单的错误,没有区别。您只能向后挤压,将一个较旧的提交压缩为一个较新的提交是没有意义的,但是如果可以的话,将是相同的操作。
meagar

1
我了解到“更改第二行的第一个单词”-第二行是什么?
安德鲁·托

75

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

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个提交的意图。


1
非常简洁的解决方案-谢谢。可能很容易勾勒出s此处用于壁球的轮廓。要使用提交,但要合并到先前的提交中
UrbanConor

如果您只有2提交并想合并同一2提交,则需要运行git reset --soft HEAD~git commit --amend
scrutari

@Stachu当我在此之后命令推入时,它将要求拉入并合并。我可以做些什么来避免这种情况?
Abhay Koradiya

您为什么不想要合并?
Stachu

23
  1. 签出您的分支并计算所有提交的数量。
  2. 打开git bash并输入:(git rebase -i HEAD~<quantity of your commits>git rebase -i HEAD~5
  3. 在打开的txt文件中,将pick关键字to更改squash为所有提交,第一次提交除外(位于顶部)。对于上一个,将其更改为reword(这意味着您将在下一步中为此提交提供新的注释),然后单击“保存”!如果是vim,请按,esc然后按Enter进行保存,wq!然后按Enter。
  4. 提供评论。
  5. 打开Git并进行“全部提取”以查看新的更改。

完成了


第一个告诉我在vim中使用的方式。非常感谢
Ho Luong
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.