我的本地存储库中有一堆主题相似的提交。我想在推送到远程之前将它们组合成一个提交。我该怎么做?我认为rebase
这样做,但我无法理解文档。
8 回答
您想要做的事情在 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”将为您提供所有其他可用选项的解释。
如果您有很多提交并且您只想压缩最后 X 次提交,请找到您要开始压缩的提交的提交 ID 并执行
git rebase -i <that_commit_id>
然后按照 leopd 的回答中的描述进行操作,将除第一个之外的所有pick
s 更改为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
这里有很多可行的答案,但我发现这是最简单的。此命令将打开一个编辑器,您可以在其中替换pick
以squash
将它们删除/合并为一个
git rebase -i HEAD~4
其中,4
是您想要压缩为一个的提交数。这也在这里解释。
您可以使用 来执行此操作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
是我能找到的前两个好页面。
我想出了
#!/bin/sh
message=`git log --format=%B origin..HEAD | sort | uniq | grep -v '^$'`
git reset --soft origin
git commit -m "$message"
合并、排序、统一和删除提交消息中的空行。我将其用于对 github wiki 的本地更改(使用 gollum)
而我的squashing
多重方式push
是(也许你向自己的分支推送了许多提交,现在你希望做一个拉取请求,并且你不想用你已经推送的许多提交来混淆它们)。我这样做的方式(据我所知,没有其他更简单的选择)。
- 为了
squash
(从您希望将请求拉到的原始分支的分支)创建新分支。 - 推送新创建的分支。
- 将提交(已推送)的分支合并到新分支。
- 重新设置新分支和壁球。
- 推新分支。
- 为现在具有单个提交的新分支创建新的拉取请求。
例子:
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
您可能想要使用Interactive Rebasing,该链接中对此进行了详细描述。
如果您搜索“git rebase interactive”,您可以找到其他好的资源。