122

我有一个包含 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'
4

4 回答 4

179

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

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

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

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

于 2012-09-21T02:19:24.433 回答
90

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

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

转这个

pick YourCommitMessageWhatever
pick YouGetThePoint
pick IdkManItsACommitMessage

进入这个

pick YourCommitMessageWhatever
s YouGetThePoint
s IdkManItsACommitMessage

并在您点击的地方执行一些操作escenter保存更改。[1]

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

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


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

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

于 2017-03-16T20:24:16.253 回答
26
  1. 签出您的分支并计算所有提交的数量。
  2. 打开 git bash 并写入:(git rebase -i HEAD~<quantity of your commits>git rebase -i HEAD~5
  3. 在打开的txt文件中,将所有提交的pick关键字更改squash为除第一次提交(位于顶部)之外。对于最重要的一项,将其更改为reword(这意味着您将在下一步中为此提交提供新评论),然后单击保存!如果在 vim 中,请按esc然后输入保存,然后wq!按 enter。
  4. 提供评论。
  5. 打开 Git 并进行“获取所有”以查看新更改。

完毕

于 2015-08-03T09:45:23.347 回答
0

这就是我所做的。(对我来说)比进行交互式变基更容易:

git reset HEAD~2.  // go back 2 commits.
git commit -am “My squashed single commit”
git push --force 
于 2022-02-18T20:13:58.210 回答