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

Lak*_*pan 90 git github

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

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

Mar*_*oom 138

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

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

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

在视觉上,如果您在提交标记为" 开始"的情况下开始工作,则需要此操作

Git承诺挤压

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

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

一个直观的线索

在此输入图像描述

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

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

 git rebase -i branch
Run Code Online (Sandbox Code Playgroud)

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

 pick ae3...
 pick ef6...
 pick 1e0...
 pick 341...
Run Code Online (Sandbox Code Playgroud)

我没有提交提交的名称,但是这四个提交是从StartHead的提交

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

 pick ae3...
 squash ef6...
 squash 1e0...
 squash 341...
Run Code Online (Sandbox Code Playgroud)

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

在此输入图像描述

在您的情况下,您不希望重新绑定到另一个分支,而是转换为先前的提交.
为了转换历史,如第一个例子所示,你必须运行类似的东西

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

更改"命令"以压缩所有提交但第一个提交然后关闭编辑器.


关于改变历史的注意事项

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

这是你实际获得的一个rebase:

在此输入图像描述

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

  • 很好 - 原始提交评论会发生什么 - 它们是否会合并成一个大提交评论,或者是否会丢失? (3认同)
  • @alper其他人不会丢失他们的提交,他们会看到提交上的远程引用而不是他们的历史记录,并且 git 将阻止他们推送,除非他们引入更改或强制执行。如果你单独工作,你可以重写上游历史。Git 并不真正删除提交,您必须使用“git prune”来删除无法访问的对象。我不知道 GitHub 是如何运作的,它过去的时间越长,该网站与 git 的关系就越少,而与固执己见的第三方 SVC 的关系就越多。 (3认同)
  • 这是我见过的关于 rebase 的最好解释,谢谢。 (2认同)

0xA*_*iHn 17

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

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

所以,假设您刚刚做了一些小提交,并且想要从中进行一次更大的提交.我们的存储库历史目前看起来像这样:

在此输入图像描述

如果它们被包裹在一起,那么最后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.
#
Run Code Online (Sandbox Code Playgroud)

所以,这里发生了一些事情.首先,我告诉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.
Run Code Online (Sandbox Code Playgroud)

基本上,这告诉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
    #
Run Code Online (Sandbox Code Playgroud)

由于我们正在组合这么多提交,因此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.
Run Code Online (Sandbox Code Playgroud)

如果我们再看一下历史...... 在此输入图像描述

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

详细信息可以在此链接中找到.

  • 谢谢!如果有人对VIM感到不满意,...当您输入要编辑的操作时,请按“ i”进入编辑模式。完成更改后,请按Escape键,然后输入“:wq”,它将使您前进。(苹果电脑) (2认同)