446

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

4

8 回答 8

698

您想要做的事情在 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

将除第一个之外的所有更改picksquash(或):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”将为您提供所有其他可用选项的解释。

于 2011-08-04T00:27:40.940 回答
103

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

git rebase -i <that_commit_id>

然后按照 leopd 的回答中的描述进行操作,将除第一个之外的所有picks 更改为es。squash

示例

871adf OK, feature Z is fully implemented      --- newer commit --┐
0c3317 Whoops, not yet...                                         |
87871a I'm ready!                                                 |
643d0e Code cleanup                                               |-- Join these into one
afb581 Fix this and that                                          |
4e9baa Cool implementation                                        |
d94e78 Prepare the workbench for feature Z     -------------------┘
6394dc Feature Y                               --- older commit

您可以这样做(写下提交的数量):

git rebase --interactive HEAD~[7]

或者这个(写下你不想压缩的最后一次提交的哈希

git rebase --interactive 6394dc
于 2014-01-22T09:28:35.697 回答
44

这里有很多可行的答案,但我发现这是最简单的。此命令将打开一个编辑器,您可以在其中替换picksquash将它们删除/合并为一个

git rebase -i HEAD~4

其中,4是您想要压缩为一个的提交数。这也在这里解释。

于 2016-10-05T23:16:09.863 回答
31

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

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

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

于 2011-08-04T00:08:57.870 回答
15

我想出了

#!/bin/sh

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

合并、排序、统一和删除提交消息中的空行。我将其用于对 github wiki 的本地更改(使用 gollum)

于 2015-03-27T20:55:56.240 回答
8

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

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

很舒服:

在此处输入图像描述

Atlassian还提供了一个非常好的教程,展示了它是如何工作的:

于 2015-11-10T17:01:07.627 回答
7

而我的squashing多重方式push是(也许你向自己的分支推送了许多提交,现在你希望做一个拉取请求,并且你不想用你已经推送的许多提交来混淆它们)。我这样做的方式(据我所知,没有其他更简单的选择)。

  1. 为了squash(从您希望将请求拉到的原始分支的分支)创建新分支。
  2. 推送新创建的分支。
  3. 将提交(已推送)的分支合并到新分支。
  4. 重新设置新分支和壁球。
  5. 推新分支。
  6. 为现在具有单个提交的新分支创建新的拉取请求。

例子:

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

于 2015-11-15T11:20:49.107 回答
2

您可能想要使用Interactive Rebasing,该链接中对此进行了详细描述。

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

于 2011-08-04T00:06:39.490 回答