我在本地存储库中有一堆主题相似的提交。我想把它们合并成一个单独的提交,然后再进行远程操作。我该怎么做?我认为rebase是这样做的,但我不明白这些文档。


当前回答

你可以使用git rebase -i,传入你想要用作“根”的修订:

git rebase -i origin/master

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

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

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

and

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

这是我能找到的头两页好书。

其他回答

你可以使用git rebase -i,传入你想要用作“根”的修订:

git rebase -i origin/master

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

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

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

and

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

这是我能找到的头两页好书。

如果你有很多提交,你只想压缩最后的X个提交,找到你想开始压缩的提交的提交ID

git rebase -i <that_commit_id>

然后按照豹的回答中所描述的那样进行,将所有的选择都改为压扁,除了第一个。

例子:

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

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

git rebase -i HEAD~4

其中,4是你想要压缩成一个的提交数。这里也有解释。

如果您希望压缩包含第一次提交的提交,则使用此命令

git rebase -i --root

你可能想要使用交互式重基,在那个链接中有详细的描述。

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

我想到了

#!/bin/sh

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

合并、排序、统一和删除提交消息中的空行。我使用这个对github维基进行本地更改(使用咕噜)