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

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

你想要做的就是在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 

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

瞧! 谷歌search“git挤压”会给你所有其他可用的选项的解释。

如果你有很多的提交,你只想压缩最后的X提交,find你想要开始压扁提交的提交ID,并做

 git rebase -i <that_commit_id> 

然后按照leopd的回答中的描述进行操作,将所有pick改为除了第一个之外的选项。

你可以用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

是我能find的前两个好页面。

这里有相当多的工作答案,但我发现这是最简单的。 这个命令将打开一个编辑器,在那里你可以用squashreplacepick ,以便将它们合并成一个

 git rebase -i HEAD~4 

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

我想出了

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

组合,sorting,统一和删除提交消息中的空行。 我使用这个对github wiki进行本地修改(使用gollum)

您可以压缩(join)与交互式资源库的提交。 有一个相当不错的YouTubevideo,显示如何在命令行或SmartGit做到这一点:

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

这很舒服:

在这里输入图像说明

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

而我的squashing多重squashing方式是(也许你推到你自己的分支许多提交,现在你想做一个拉请求,你不想凌乱他们已经推了很多提交)。 我这样做的方式(据我所知,没有其他更简单的select)。

  1. 创build新的分支为了squash (分支从您想要拉扯请求的原始的分支)。
  2. 推新创build的分支。
  3. 合并分支与提交(已推)到新的分支。
  4. 重新新分支和壁球。
  5. 推新的分支。
  6. 为现在有单个提交的新分支创build新的请求。

例:

 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

您可能想要使用交互式重新激活 ,在该链接中详细介绍。

你可以find其他的好资源,如果你search“git rebase interactive”。