首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在git中压缩提交意味着什么?

在git中压缩提交意味着什么?
EN

Stack Overflow用户
提问于 2016-02-29 23:40:27
回答 3查看 96.4K关注 0票数 187

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

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-03-01 00:42:39

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

Git的一个非常好的特性是能够重写提交的历史记录。

这样做的主要原因是,许多这样的历史记录只与生成它的开发人员相关,因此在将其提交到共享存储库之前,必须对其进行简化或使其更好。

从惯用的观点来看,挤压提交意味着将上述提交中引入的更改移动到其父提交中,以便最终提交一次而不是两次(或更多)。

如果您多次重复此过程,则可以将n次提交减少为一个提交。

从视觉上看,如果您在标记为commit的开始时开始工作,那么您希望这样做

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

在Git中,挤压是通过Rebase实现的,这是一种特殊的形式,称为交互式Rebase。

为了简化将一组提交重新设置为分支B的基址时,您可以应用由这些提交引入的所有更改,从B开始,而不是从它们的原始祖先开始。

一条视觉线索

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

交互式重定基使您可以选择提交应该如何重定基数。如果您运行此命令:

代码语言:javascript
复制
 git rebase -i branch

您最终会得到一个文件,其中列出了将被重新设置基址的提交

代码语言:javascript
复制
 pick ae3...
 pick ef6...
 pick 1e0...
 pick 341...

我没有命名提交,但这四个提交从头到尾都是提交

这个列表的好处是它是可编辑的。

你可以省略提交,或者你可以对它们进行压缩。

您所要做的就是将第一个单词更改为squash。

代码语言:javascript
复制
 pick ae3...
 squash ef6...
 squash 1e0...
 squash 341...

如果您关闭编辑器,并且没有发现合并冲突,那么您将得到以下历史记录:

在您的例子中,您不希望重设到另一个分支,而是重设到前一个提交。

为了转换第一个示例中显示的历史记录,您必须运行如下所示的命令

代码语言:javascript
复制
git rebase -i HEAD~4

更改“命令”以压缩除第一个提交之外的所有提交,然后关闭编辑器。

关于更改历史记录的说明

在Git中,提交永远不会被编辑。它们可以被修剪,使其不可达,可以克隆,但不能更改。

当你改变基址时,你实际上是在创建新的提交。

旧的不再是任何参考可以到达的,所以没有显示在历史中,但他们仍然在那里!

这是你在rebase中实际得到的:

如果你已经把它们推到了某个地方,重写历史实际上会造成分支!

票数 280
EN

Stack Overflow用户

发布于 2018-05-21 15:25:36

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

需要注意的是:仅在未推送到外部存储库的提交上执行此操作。如果其他人基于您要删除的提交进行了工作,则可能会发生大量冲突。如果你的历史已经被别人分享了,不要重写它。

因此,假设你刚刚做了几个小的提交,并且你想要从中做一个更大的提交。我们的存储库的历史记录目前如下所示:

如果最后4个提交包在一起会更好,所以让我们通过交互式rebasing来做这件事:

代码语言:javascript
复制
$ 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,我想用前四次提交的头~4来重新定位。Git现在已经把我放进了一个编辑器,里面有上面的文本,还有一些关于可以做什么的解释。在这个屏幕上,您可以选择很多选项,但现在我们只需要将所有内容都压缩到一个提交中即可。因此,将文件的前四行更改为以下代码即可实现此目的:

代码语言:javascript
复制
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将所有四个提交合并到列表中的第一个提交中。完成此操作并保存后,将弹出另一个编辑器,其中包含以下内容:

代码语言:javascript
复制
# 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允许您根据流程中涉及的其余提交修改新提交的消息。按您认为合适的方式编辑邮件,然后保存并退出。一旦完成,你的提交就被成功地压缩了!

代码语言:javascript
复制
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.

如果我们再看一遍历史,…

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

详细信息可以在此link中找到。

票数 33
EN

Stack Overflow用户

发布于 2016-02-29 23:46:51

票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35703556

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档