繁体   English   中英

压缩和删除git中的提交有什么区别?

[英]What is the difference between squashing and deleting a commit in git?

假如我做

git rebase -i HEAD~3

并在文本编辑器中打开以下内容:

pick ae27841 Commit 1 
pick fd8a71e Commit 2
pick badd490 Commit 3

我想将这3次提交转换为1次提交,以便可以将该提交推送到我的存储库中,然后调用请求请求。 我了解有两种方法可以解决此问题:

  1. 我可以留下一个承诺为pick和壁球其他两个。

     pick ae27841 Commit 1 s fd8a71e Commit 2 s badd490 Commit 3 
  2. 我可以删除这3个提交中的2个。

     pick ae27841 Commit 1 

这两个命令有什么区别? 据我了解,每次提交都是项目的不同版本。 因此,我的最新提交将是我的最新版本,对吗? 因此,我最近要做的就是保留所有内容。 由于其他2个提交是项目的“较旧”版本,因此我不需要它们,因此可以删除它们。 那么方法2是将我的3个提交转换成一个的正确方法吗? 如果是这样,我将需要压缩哪种类型的提交呢?

这里正确的方法是什么? 压缩或删除提交?

删除提交时,您将从历史记录中删除它引入的所有更改,即从其后的所有提交中删除。 压榨也从历史记录中删除了提交,但其更改已合并到结果提交中。

更新 -从评论看来,误解与问题有点不同,因此我在底部添加了一些注释


原始答案

压缩提交就是将其更改添加到之前的提交中。 删除提交就是不执行更改。

所以如果你有

A --- B --- C <--(master)

如果您C.txt提交,则A创建A.txtB创建B.txtC创建C.txt

ABC <--(master)

其中ABC是创建A.txtB.txtC.txt的单个提交,而如果删除BC得到

A <--(master)

并且仅创建A.txt


增加了笔记

因此,git COMMIT对象除其他外具有对当时表示您的项目内容的TREE对象的引用。 TREE大致是一个目录列表,其中包含其他TREE对象(子目录)和BLOB对象(文件)的名称列表。

在内部(如果打包了对象), BLOB可能表示为另一个BLOB的增量-但当前的修订版通常是完整的对象,增量用于构造文件的较早版本。

无论哪种情况,在任何有效的仓库中,您都可以从COMMIT上的TREE引用中重建项目的完整状态。 PARENT用于历史记录跟踪,但对于项目状态的构造则不需要。

但是 ,当您在重建基准期间pick一个提交时,这并不意味着您正在复制该提交的TREE 而这意味着,git会找出差异犯下的之间TREE和提交的PARENTTREE ,并应用一系列的变化。

REBASEMERGE操作中,根据提交与父提交的区别来处理提交的想法很重要。 从某种意义上说,即使提交是经过结构化的,因此它可以再现项目的快照,但通常认为将其表示为一组更改通常很有用。

压缩和删除在Git中在技术上是相同的。 他们创建新的提交,将一些现有的提交作为父提交,并且不会删除任何提交。

假设提交历史记录为ABCD。 压缩BCD时,将创建一个新的提交E作为A的新子级。新的提交包括BCD的更改。 BCD仍然在那里。 然后,当前ref(例如分支或HEAD)从A移到E(南瓜合并),或从D移到E(交互式变基)。 如果裁判在D时现在在E处,则似乎BCD丢失了,但实际上它们仍然存在。

至于通过选择C到A的“删除”,将创建一个新的提交C'作为A的新子代。C'具有等效的C更改(并不总是与C完全相同)。 BCD仍然在那里。 当前参考将A移至C'。 当您运行git reset ,当前ref从一个提交移动到另一个提交。

另一个示例是git commit --amend 当您为ABCD运行它时,新的提交D'被创建为C的新子代。 参考从D移到D'。 现在D似乎已删除,但它仍然存在。 据说Amend修改和更新了最后的提交,但实际上它创建了一个新的同级提交。

首先,关于git的概念在这里是错误的:

据我了解,每次提交都是项目的不同版本。 因此,我的最新提交将是我的最新版本,对吗?

当您删除提交2和提交3时,提交1将更改。 让我称它为(提交1)”。 即使(Commit 1)'与Commit 1保持相同的提交消息,与以前的版本相比仍保持相同的修改,但它们不是同一版本。 (提交1)和提交1具有不同的版本哈希。

方法1 :这就是您想要的。 保留代码的最新版本,保留最后的提交消息。 但是您应该注意,HASH已更改。

方法2 :不是您想要的。 在提交2和提交3中提交的代码将丢失。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM