通过修改提交进行差异化

时间:2015-11-06 09:16:39

标签: git amend

我想知道是否有可能在两次提交之间显示差异 修改之一?换句话说,git save修改了历史记录中的提交吗?

2 个答案:

答案 0 :(得分:4)

修改后的提交与任何其他提交没有什么不同。从这个意义上说,完全可能在“正常”和“正常”之间进行区分。提交和修改后的提交。

  

换句话说,git save修改了历史记录吗?

没有一些列表包含所有修改过的提交,没有。修改后的提交就像所有其他提交一样在历史中。

当你修改一个提交时,它基本上被删除并被一个新的(它也获得一个新的提交哈希)替换,它具有原始提交和修改后的更改的更改。

git reflog中,您可以看到最近的操作,这确实显示了提交的修改。从那里引用可以用于例如撤消git commit --amend。有关详细信息,请参阅How to undo "git commit --amend" done instead of "git commit"

答案 1 :(得分:0)

我不认为我理解这个问题,但我认为部分原因是因为我认为你对git commit --amend所做的事情有错误的想法。

git中的提交实际上无法更改。 git commit --amend所做的就是使用故意更改的父ID编写 new 提交。

让我们来看看进行新提交的正常过程。

在进行新提交之前,修改工作树中的某些文件,然后使用git add暂存这些更改,以便提交新版本的文件。这个git add将新版本的文件放入git' s" index",即它的临时区域。

先前提交中已有的文件已在暂存区域中。因此,您将进行的新提交将包含所有原始文件,除了您更改的任何内容,然后git add - ed将是新版本而不是旧版本。

现在你运行git commit(没有--amend)并且git执行以下操作:

  • 收集提交消息(来自-m-F或运行您的编辑器);
  • 获取您的姓名和电子邮件,以及当前时间;
  • 获取当前提交的SHA-1 ID(不是新提交);
  • 使用暂存区域来编写"树" object:这是与新提交相关联的源树;
  • 使用所有这些信息(作者+提交者,树,父ID和您的消息)创建一个提交对象 - 这个新的提交对象具有一个新的唯一SHA-1 ID;
  • 最后,将新ID写入分支,以便分支标签指向新ID,而不是过去最常见的分支。

最后一步"增长分支",这样如果你曾经有过一些提交,就像这样:

... <- E <- F <- G   <-- master

你现在还有一个:

... <- E <- F <- G <- H   <-- master

分支名称(master或其可能的任何内容)现在指向您的最新提交H,而H指向使用的内容您最新的提交G

如果你使用git commit --amend,git只会改变这个序列:不是让新的提交(H)指向当前的(G),git make新的一点回到当前的父母(在这种情况下,F):

                G
              /
... <- E <- F <- H   <-- master

现在master(或您正在使用的任何分支)指向H,其指向F,依此类推。

如果你运行git log,git会从当前提交(H)开始并记录它,然后移动到它的父(F)并记录它,依此类推。提交G似乎已经消失。

G 的SHA-1 ID 仍然存在(默认为30天),&#34; reflogs&#34;。有HEAD的reflog,以及当前分支的一个。如果你在分支机构master上并且刚刚提出H,则master@{1}master的前一个提示,即提交{{1} }}。或者,如果您在屏幕上的某处保存了SHA-1 ID,则可以将其剪切并粘贴以查看提交G

G开关也可以修改合并提交。这与上面完全相同,只是意味着git必须从旧分支复制所有父ID - 提到新的。)