我在本地存储库中有一堆主题相似的提交。我想把它们合并成一个单独的提交,然后再进行远程操作。我该怎么做?我认为rebase是这样做的,但我不明白这些文档。
当前回答
这里有很多可行的答案,但我发现这个是最简单的。这个命令将打开一个编辑器,在这里你可以将pick替换为squash,以便将它们删除/合并为一个
git rebase -i HEAD~4
其中,4是你想要压缩成一个的提交数。这里也有解释。
如果您希望压缩包含第一次提交的提交,则使用此命令
git rebase -i --root
其他回答
你可能想要使用交互式重基,在那个链接中有详细的描述。
如果你搜索“git rebase interactive”,你可以找到其他好的资源。
你可以使用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
这是我能找到的头两页好书。
这里有很多可行的答案,但我发现这个是最简单的。这个命令将打开一个编辑器,在这里你可以将pick替换为squash,以便将它们删除/合并为一个
git rebase -i HEAD~4
其中,4是你想要压缩成一个的提交数。这里也有解释。
如果您希望压缩包含第一次提交的提交,则使用此命令
git rebase -i --root
你想要做的在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”,就会给出所有其他选项的解释。
我压缩多次推送的方法是(也许你向你自己的分支推送了很多提交,现在你想做一个pull请求,你不想用你已经推送的许多提交来混乱它们)。我这样做的方式(就我所知,没有其他更简单的选择)。
创建一个新的分支(你希望将请求拉到的原始分支)。 推送新创建的分支。 合并分支并提交(已经推送)到新分支。 重新建立新的分支和挤压。 推送新分支。 为新分支创建新的拉请求,该分支现在有单次提交。
例子:
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
推荐文章
- 如何将git配置存储为存储库的一部分?
- 如何修改GitHub拉请求?
- 如何在Github和本地删除最后n次提交?
- 我如何调试git/git-shell相关的问题?
- 错误:无法使用rebase进行拉取:您有未分阶段的更改
- Git隐藏未缓存:如何把所有未分期的变化?
- 真实的恶魔
- 如何从另一个分支获得更改
- Git:权限被拒绝(publickey)致命-无法从远程存储库读取。克隆Git存储库时
- git reflog和log有什么区别?
- git推挂在Total line之后
- 重命名git子模块
- 结合Git存储库的前两次提交?
- Xcode 6 gitignore文件应该包括什么?
- 我如何从现有回购的分支创建一个新的GitHub回购?