Squashing在git中的含义是什么意思。我如何在Github中压缩提交?
我是Git的新手,我要求被分配到coala-analyzer中的新手bug。我修复了这个bug,现在我被要求压缩我的提交。我该怎么做?
答案 0 :(得分:116)
您可以将Git视为工作目录快照的高级数据库。
Git的一个非常好的功能是能够重写提交历史 这样做的主要原因是很多此类历史记录仅对生成它的开发人员有用,因此在将其提交到共享存储库之前必须简化或更好。
压缩提交意味着,从惯用的角度来看,将所述提交中引入的更改移动到其父级中,以便以两个提交结束。 如果您多次重复此过程,则可以将 n 提交减少到一个。
在视觉上,如果您在提交标记开始的情况下开始工作,那么您需要这个
您可能会注意到新提交的颜色略深一些蓝色。这是故意的。
在Git中,使用名为 Interactive Rebase 的特殊形式的 Rebase 实现压缩。
简化当您将一组提交重新绑定到分支 B 时,您应用该提交引入的所有更改,因为它们是从 B 而不是原始祖先开始的。< / p>
视觉线索
再次注意蓝色的不同色调。
如果运行此命令,交互式rebase允许您选择应该如何重新提交:
git rebase -i branch
您最终会得到一个列出将要重新提交的提交的文件
pick ae3...
pick ef6...
pick 1e0...
pick 341...
我没有为提交命名,但这四个提交是从开始到 Head 的提交
关于此列表的好处是可编辑 您可以省略提交,也可以压缩它们 您所要做的就是将第一个单词更改为 squash 。
pick ae3...
squash ef6...
squash 1e0...
squash 341...
如果您关闭编辑器并且未找到合并冲突,则最终会显示此历史记录:
在您的情况下,您不希望转换到另一个分支,而是转换为先前的提交 为了转换历史记录,如第一个示例所示,您必须运行类似
的内容git rebase -i HEAD~4
将所有提交的“命令”更改为 squash ,但第一次提交然后关闭编辑器。
关于更改历史记录的注意事项
在Git中,提交永远不会被编辑,它们可以被修剪,无法访问,克隆但不能更改。
当你重新定义时,你实际上是在创建新的提交
任何参考都不能再访问旧版本了,所以历史记录中没有显示,但它们仍然存在!
这是你实际获得的一个变种:
如果你已经将它们推到某处,重写历史记录实际上会成为一个分支!
答案 1 :(得分:12)
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与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.
所以,到目前为止,这是相对无痛的。如果你在rebase期间遇到冲突,它们通常很容易解决,Git会尽可能地引导你。这方面的基础是解决有争议的问题,git add
文件,然后git rebase --continue
将恢复该过程。当然,如果你愿意,做一个git rebase --abort
会让你回到以前的状态。如果由于某种原因你在rebase中丢失了一个提交,你可以使用reflog来恢复它。
详情请见link。
答案 2 :(得分:10)