git中的压缩提交是什么意思?我如何挤压提交在Github?
当前回答
这意味着将多个提交合并为一个。来看看:
使用Git压缩我最后的X提交
其他回答
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来取回它。
详情请点击此链接。
您可以将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:
如果你已经把他们推到了某个地方,重写历史实际上会产生一个分支!
这意味着将多个提交合并为一个。来看看:
使用Git压缩我最后的X提交
推荐文章
- 如何禁用Git凭证管理器的Windows?
- Git 拉取与 Git 变基
- 在git中压缩提交是什么意思?
- 在GIT中合并2个分支
- git标签也会被推送吗?
- 嵌套的Git存储库?
- Git bash错误:无法fork子进程:没有可用的终端(-1)
- 有没有办法在SourceTree中获得两个分支的视觉差异?
- 如何在GitHub上找到存储库项目的创建日期?
- Git标记是否只应用于当前分支?
- Git分支:master vs. origin/master vs. remotes/origin/master
- 如何根据文件扩展名过滤git差异?
- 如何设置一个git项目使用外部回购子模块?
- Git同时在两个分支上工作
- 如何在Visual Studio中删除未推送的外向提交?