在git中压缩提交是什么意思?

时间:2016-02-29 15:40:27

标签: git github

Squashing在git中的含义是什么意思。我如何在Github中压缩提交?

我是Git的新手,我要求被分配到coala-analyzer中的新手bug。我修复了这个bug,现在我被要求压缩我的提交。我该怎么做?

3 个答案:

答案 0 :(得分:116)

您可以将Git视为工作目录快照的高级数据库。

Git的一个非常好的功能是能够重写提交历史 这样做的主要原因是很多此类历史记录仅对生成它的开发人员有用,因此在将其提交到共享存储库之前必须简化或更好。

压缩提交意味着,从惯用的角度来看,将所述提交中引入的更改移动到其父级中,以便以两个提交结束。 如果您多次重复此过程,则可以将 n 提交减少到一个。

在视觉上,如果您在提交标记开始的情况下开始工作,那么您需要这个

Git commits squashing

您可能会注意到新提交的颜色略深一些蓝色。这是故意的。

在Git中,使用名为 Interactive Rebase 的特殊形式的 Rebase 实现压缩。
简化当您将一组提交重新绑定到分支 B 时,您应用该提交引入的所有更改,因为它们是从 B 而不是原始祖先开始的。< / p>

视觉线索

enter image description here

再次注意蓝色的不同色调。

如果运行此命令,交互式rebase允许您选择应该如何重新提交:

 git rebase -i branch

您最终会得到一个列出将要重新提交的提交的文件

 pick ae3...
 pick ef6...
 pick 1e0...
 pick 341...

我没有为提交命名,但这四个提交是从开始 Head 的提交

关于此列表的好处是可编辑 您可以省略提交,也可以压缩它们 您所要做的就是将第一个单词更改为 squash

 pick ae3...
 squash ef6...
 squash 1e0...
 squash 341...

如果您关闭编辑器并且未找到合并冲突,则最终会显示此历史记录:

enter image description here

在您的情况下,您不希望转换到另一个分支,而是转换为先前的提交 为了转换历史记录,如第一个示例所示,您必须运行类似

的内容
git rebase -i HEAD~4

将所有提交的“命令”更改为 squash ,但第一次提交然后关闭编辑器。

关于更改历史记录的注意事项

在Git中,提交永远不会被编辑,它们可以被修剪,无法访问,克隆但不能更改。
当你重新定义时,你实际上是在创建新的提交 任何参考都不能再访问旧版本了,所以历史记录中没有显示,但它们仍然存在!

这是你实际获得的一个变种:

enter image description here

如果你已经将它们推到某处,重写历史记录实际上会成为一个分支!

答案 1 :(得分:12)

rebase命令在--interactive(或-i)模式下有一些很棒的选项,其中最广泛使用的是压缩提交的能力。这样做需要较小的提交并将它们组合成较大的提交,如果您正在完成当天的工作或者您只是想以不同方式打包您的更改,这可能很有用。我们将逐步介绍如何轻松完成这项工作。

请注意:仅对尚未推送到外部存储库的提交执行此操作。如果其他人的工作基于您要删除的提交,则可能会发生许多冲突。如果已经与他人共享,请不要重写您的历史记录。

所以,假设您刚刚提交了一些小提交,并且您希望从中进行一次更大的提交。我们的存储库历史目前如下:

enter image description here

最后4次提交如果将它们组合在一起会更快乐,所以让我们通过交互式变基来做到这一点:

$ git rebase -i HEAD~4

pick 01d1124 Adding license
pick 6340aaa Moving license into its own file
pick ebfd367 Jekyll has become self-aware.
pick 30e0ccb Changed the tagline in the binary, too.

# Rebase 60709da..30e0ccb onto 60709da
#
# Commands:
#  p, pick = use commit
#  e, edit = use commit, but stop for amending
#  s, squash = use commit, but meld into previous commit
#
# If you remove a line here THAT COMMIT WILL BE LOST.
# However, if you remove everything, the rebase will be aborted.
#

所以,这里发生了一些事情。首先,我告诉Git,我想使用最后四个提交来改变HEAD与HEAD~4的位置。 Git现在让我进入一个包含上述文本的编辑器,并对可以做什么做了一点解释。你可以从这个屏幕上找到很多选项,但是现在我们只是把所有东西都压缩成一个提交。因此,将文件的前四行更改为此可以解决问题:

pick 01d1124 Adding license
squash 6340aaa Moving license into its own file
squash ebfd367 Jekyll has become self-aware.
squash 30e0ccb Changed the tagline in the binary, too.

基本上,这告诉Git将所有四个提交合并到列表中的第一个提交中。完成并保存后,会弹出另一个编辑器,其中包含以下内容:

# This is a combination of 4 commits.
# The first commit's message is:
Adding license

# This is the 2nd commit message:

Moving license into its own file

# This is the 3rd commit message:

Jekyll has become self-aware.

# This is the 4th commit message:

Changed the tagline in the binary, too.

    # Please enter the commit message for your changes. Lines starting
    # with '#' will be ignored, and an empty message aborts the commit.
    # Explicit paths specified without -i nor -o; assuming --only paths...
    # Not currently on any branch.
    # Changes to be committed:
    #   (use "git reset HEAD <file>..." to unstage)
    #
    #   new file:   LICENSE
    #   modified:   README.textile
    #   modified:   Rakefile
    #   modified:   bin/jekyll
    #

由于我们正在组合这么多提交,Git允许您根据流程中涉及的其余提交修改新提交的消息。根据需要编辑邮件,然后保存并退出。完成后,您的提交已被成功压缩!

Created commit 0fc4eea: Creating license file, and making jekyll self-aware.
 4 files changed, 27 insertions(+), 30 deletions(-)
  create mode 100644 LICENSE
    Successfully rebased and updated refs/heads/master.

如果我们再看一下历史...... enter image description here

所以,到目前为止,这是相对无痛的。如果你在rebase期间遇到冲突,它们通常很容易解决,Git会尽可能地引导你。这方面的基础是解决有争议的问题,git add文件,然后git rebase --continue将恢复该过程。当然,如果你愿意,做一个git rebase --abort会让你回到以前的状态。如果由于某种原因你在rebase中丢失了一个提交,你可以使用reflog来恢复它。

详情请见link

答案 2 :(得分:10)