git中的压缩提交是什么意思?我如何挤压提交在Github?


这意味着将多个提交合并为一个。来看看:

使用Git压缩我最后的X提交


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

Git的一个非常好的特性是重写提交历史的能力。 这样做的主要原因是,许多这样的历史只与生成它的开发人员相关,因此在将其提交到共享存储库之前,必须对其进行简化,或使其更美观。

压缩提交意味着,从惯用的角度来看,将所述提交中引入的更改移动到它的父文件中,以便最终得到一个提交而不是两个(或多个)提交。 如果多次重复这个过程,可以将n次提交减少为一次。

从视觉上看,如果您在标记为Start的提交处开始工作,则需要这样

您可能会注意到,新的提交有一个稍深的蓝色阴影。这是故意的。

在Git中,压缩是通过Rebase实现的,这是一种特殊的形式,称为交互式Rebase。 简化了当您将一组提交转换为分支B时,您将应用这些提交所引入的所有更改,从B开始,而不是从它们的原始祖先开始。

视觉线索

再次注意不同深浅的蓝色。

交互式重基可以让您选择如何重基提交。 如果执行该命令:

 git rebase -i branch

您最终将得到一个列出将被重基于的提交的文件

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

我没有命名这些提交,但这四个是从Start到Head的提交

这个列表的优点是它是可编辑的。 您可以省略提交,也可以压缩它们。 你所要做的就是把第一个单词改成squash。

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

如果你关闭编辑器,没有发现合并冲突,你最终会得到这样的历史:

在您的例子中,您不想将base调到另一个分支中,而是调到以前的提交中。 为了像第一个例子中显示的那样转换历史,您必须运行类似于

git rebase -i HEAD~4

将“commands”更改为压缩除第一次提交外的所有提交,然后关闭编辑器。


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

在Git中,提交永远不会被编辑。它们可以被修剪、不可访问、克隆但不可更改。 当你重新建立数据库时,你实际上是在创建新的提交。 旧的已经不能被任何裁判找到,所以没有显示在历史上,但他们仍然在那里!

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

如果你已经把他们推到了某个地方,重写历史实际上会产生一个分支!


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.
#

这里发生了一些事情。首先,我告诉Git,我想使用HEAD~4的最后4次提交来重新赋基。Git现在把我放进了一个编辑器,里面有上面的文本,还有一些关于可以做什么的解释。在这个屏幕上有很多选项可供选择,但现在我们要把所有选项都压缩到一次提交中。因此,将文件的前四行更改为this将达到目的:

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.

如果我们再看看历史……

到目前为止,这个过程还算轻松。如果在改基过程中遇到冲突,它们通常很容易解决,Git会尽可能地引导您。这样做的基础是修复冲突,git添加文件,然后git rebase—continue将恢复该过程。当然,如果你想的话,做一个git rebase -abort将把你带回你以前的状态。如果由于某种原因,您在rebase中丢失了一个提交,您可以使用reflog来取回它。

详情请点击此链接。