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

muu*_*ope 373 git git-squash

我在本地存储库上有一堆提交,它们在主题上相似.在推送到遥控器之前,我想将它们组合成一个提交.我该怎么做?我认为rebase这样做,但我无法理解文档.

Leo*_*opd 575

你想做的事情在git中被称为"挤压".当你这样做时(有太多?)有很多选项,但如果你只想将所有未删除的提交合并到一个提交中,请执行以下操作:

git rebase -i origin/master
Run Code Online (Sandbox Code Playgroud)

这将打开您的文本编辑器(-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
Run Code Online (Sandbox Code Playgroud)

将所有内容更改picksquash(或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
Run Code Online (Sandbox Code Playgroud)

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

瞧!谷歌搜索"git squashing"将为您提供所有其他可用选项的解释.

  • 通过`origin/master`,你的意思是`<upstream-branch>`?如果配置了上游分支,它是隐式的还是我还必须指定它? (26认同)
  • 使用`fixup`而不是`squash`跳过创建新提交消息的步骤.最后一次提交消息("All done")将自动用于`rebase`创建的最终提交. (15认同)
  • 好!你也可以用**s**而不是**壁球** (4认同)
  • @Jusleong只需删除该行即可从提交中删除更改. (3认同)
  • 任何人都知道你的"选择"行中是否有多行内容提交消息,或者是否会使解析器混淆? (2认同)

Noi*_*ich 74

如果你有很多提交并且你只想压缩最后的X提交,找到你要从中开始压缩的提交的提交ID,并且

git rebase -i <that_commit_id>
Run Code Online (Sandbox Code Playgroud)

然后按照leopd的回答中所述进行操作,将所有picks 更改为squashes,除了第一个.

  • 它应该说"在你要提交的提交集合之前找到提交的提交ID". (10认同)
  • 我花了一些时间才弄清楚,但似乎<that_commit_id>本身并不会被压扁. (7认同)

vik*_*027 33

这里有很多工作的答案,但我发现这是最简单的.此命令将打开一个编辑器,在那里你可以替换pick使用squash,以消除/它们合并成一个

git rebase -i HEAD~4
Run Code Online (Sandbox Code Playgroud)

其中,4是你要压缩成一个提交的数量.这也在这里解释.


Jus*_*iss 25

您可以执行此操作git rebase -i,传入要用作"root"的修订:

git rebase -i origin/master
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

是我能找到的前两个好页面.


rue*_*ste 12

我想出来了

#!/bin/sh

message=`git log --format=%B origin..HEAD | sort | uniq | grep -v '^$'`
git reset --soft origin
git commit -m "$message"
Run Code Online (Sandbox Code Playgroud)

从提交消息中组合,排序,统一和删除空行.我使用它来对github wiki进行本地更改(使用gollum)


Ben*_*uer 6

您可以使用Interactive Rebase压缩(加入)提交。YouTube上有一个非常漂亮的视频,展示了如何在命令行或SmartGit上执行此操作:

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

很舒服:

在此处输入图片说明

Atlassian还有一个很好的教程,展示了它的工作原理:


Tom*_*vid 6

我的squashing多重方式push是(也许你推到自己的分支许多提交,现在你想做一个拉请求,你不想让它们与你已经推过的许多提交混乱).我这样做的方式(据我所知,没有其他更简单的选择).

  1. 为了创建新分支squash(从您希望提取请求的原始分支分支).
  2. 推送新创建的分支.
  3. 将提交(已经推送)的分支合并到新分支.
  4. Rebase新分支和壁球.
  5. 推新分支.
  6. 为新分支创建新的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
Run Code Online (Sandbox Code Playgroud)

您现在可以将请求拉入 from_branch_you_wish_to_pull_request_to