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

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

331395 次浏览

你可能想要使用交互式垫底术,它在那个链接中有详细描述。

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

你可以用git rebase -i来做这件事,传入你想要用作“根”的修订:

git rebase -i origin/master

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

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

http://book.git-scm.com/4_interactive_rebasing.html < a href = " http://book.git-scm.com/4_interactive_rebasing.html " > < / >

而且

http://gitready.com/advanced/2009/02/10/squashing-commits-with-rebase.html < a href = " http://gitready.com/advanced/2009/02/10/squashing-commits-with-rebase.html " > < / >

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

你想要做的在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的回答中所描述的那样,将所有__abc0更改为squashes,除了第一个。

例子:

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

我想到了

#!/bin/sh


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

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

你可以用交互式变基压缩(连接)提交。YouTube上有一个非常不错的视频,展示了如何在命令行或SmartGit中实现这一点:

如果你已经是一个SmartGit用户,那么你可以选择你所有的提交(按住Ctrl键),然后打开上下文菜单(右键单击)来压缩你的提交。

非常舒服:

enter image description here

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

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

  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

你现在可以将request拉入from_branch_you_wish_to_pull_request_to

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

git rebase -i HEAD~4

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

如果你正在寻找squash的提交,其中也包括第一次提交,那么使用这个命令

git rebase -i --root