在推入Git之前组合多个提交

时间:2011-08-04 00:04:01

标签: git git-squash

我在本地存储库中有一堆提交,它们在主题上相似。在推送到遥控器之前,我想将它们组合成一个提交。我该怎么做?我认为rebase会这样做,但我无法理解文档。

8 个答案:

答案 0 :(得分:537)

你想做的事情在git中被称为“挤压”。当你这样做时(有太多?)有很多选项,但是如果你只是想将所有未删除的提交合并到一个提交中,请执行以下操作:

git rebase -i origin/master

这将显示您的文本编辑器(-i用于“交互式”),其文件如下所示:

pick 16b5fcc Code in, tests not passing
pick c964dea Getting closer
pick 06cf8ee Something changed
pick 396b4a3 Tests pass
pick 9be7fdb Better comments
pick 7dba9cb All done

将所有pick更改为squash(或s),但第一个除外:

pick 16b5fcc Code in, tests not passing
squash c964dea Getting closer
squash 06cf8ee Something changed
squash 396b4a3 Tests pass
squash 9be7fdb Better comments
squash 7dba9cb All done

保存文件并退出编辑器。然后打开另一个文本编辑器,让您将来自所有提交的提交消息组合成一个大提交消息。

瞧!谷歌搜索“git squashing”将为您提供所有其他可用选项的解释。

答案 1 :(得分:65)

如果您有批次提交并且您只想压缩最后的X提交,请找到您要从中开始压缩的提交的提交ID并执行

git rebase -i <that_commit_id>

然后按照leopd的回答进行操作,将除{1}之外的所有pick更改为squash

答案 2 :(得分:32)

这里有很多工作的答案,但我发现这是最简单的。此命令将打开一个编辑器,您只需将pick替换为squash即可将其删除/合并为一个

git rebase -i HEAD~4

其中,4是您希望压缩为一个的提交数。这也解释了here

答案 3 :(得分:25)

您可以使用git rebase -i执行此操作,并传入要用作“root”的修订:

git rebase -i origin/master

将打开一个编辑器窗口,显示您在origin/master中最后一次提交后所做的所有提交。您可以拒绝提交,将提交压缩为单个提交,或编辑以前的提交。

有一些资源可以更好地解释这一点,并展示其他一些例子:

http://book.git-scm.com/4_interactive_rebasing.html

http://gitready.com/advanced/2009/02/10/squashing-commits-with-rebase.html

是我能找到的前两个好页面。

答案 4 :(得分:11)

我想出了

#!/bin/sh

message=`git log --format=%B origin..HEAD | sort | uniq | grep -v '^$'`
git reset --soft origin
git commit -m "$message"

从提交消息中合并,排序,统一和删除空行。我使用它来对github wiki进行本地更改(使用gollum)

答案 5 :(得分:6)

squashingpush的方式(也许你推到自己的分支很多提交,现在你想做一个拉请求,你不想让它们混乱许多你已经推过的提交)。我这样做的方式(据我所知,没有其他更简单的选择)。

  1. squash创建新分支(从您希望提取请求的原始分支分支)。
  2. 推送新创建的分支。
  3. 将提交(已推送)的分支合并到新分支。
  4. 重新启动新分支和壁球。
  5. 推新分支。
  6. 为新分支创建新的拉取请求,现在只有一次提交。
  7. 示例:

    git checkout from_branch_you_wish_to_pull_request_to
    git checkout -b new_branch_will_have_single_squashed_commit
    git push -u new_branch_will_have_single_squashed_commit
    git merge older_branch_with_all_those_multiple_commits
    git rebase -i (here you squash)
    git push origin new_branch_will_have_single_squashed_commit
    

    您现在可以将请求提取到from_branch_you_wish_to_pull_request_to

答案 6 :(得分:5)

您可以使用 Interactive Rebase 压缩(加入)提交。有一个非常好的YouTube视频,它显示了如何在命令行或SmartGit上执行此操作:

如果您已经是SmartGit用户,那么您可以选择所有传出提交(按住Ctrl键)并打开上下文菜单(右键单击)以压缩您的提交。

非常舒服:

enter image description here

Atlassian还有一个非常好的教程,展示了它的工作原理:

答案 7 :(得分:2)

您可能希望使用Interactive Rebasing,该链接中会详细介绍。

如果您搜索“git rebase interactive”,您可以找到其他好的资源。