【问题标题】:Make a diff with amend commit使用修改提交进行差异
【发布时间】:2016-02-07 09:21:51
【问题描述】:

我想知道是否可以在两次提交之间显示 diff 什么是 amend 之一?换句话说,git 是否将修改后的提交保存在某个地方的历史记录中?

【问题讨论】:

    标签: git git-amend


    【解决方案1】:

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

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

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

    在进行新的提交之前,修改工作树中的一些文件,然后使用git add 暂存这些更改,以便提交新版本的文件。这个git add 将文件的新版本放入 git 的“索引”,即它的暂存区。

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

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

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

    最后一步“增长分支”,所以如果你曾经有一些提交,像这样:

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

    你现在又多了一个:

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

    分支名称(master 或其他任何名称)现在指向您的最新提交 HH 指向使用作为您最新提交的 G .

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

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

    现在master(或您所在的任何分支)指向H,后者指向F,依此类推。

    如果您运行git log,git 从当前提交 (H) 开始并记录它,然后移动到其父提交 (F) 并记录它,依此类推。提交G 好像没了。

    G 的 SHA-1 ID 仍然存在(默认为 30 天),在“reflogs”中。有一个 HEAD 的 reflog 和一个用于您当前分支的日志。如果您在分支master 上并且刚刚创建了H,那么master@{1}master 的前一个提示,即提交G。或者,如果您将 SHA-1 ID 保存在屏幕上的某个位置,您可以剪切并粘贴它以查看提交 G

    (--amend 开关也可以修改合并提交。这与上面的工作方式完全相同,只是意味着 git 必须从旧分支提示中复制 all 父 ID到新的。)

    【讨论】:

      【解决方案2】:

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

      换句话说,git 是否会将修改后的提交保存在某个地方的历史记录中?

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

      当你修改一个提交时,它基本上会被删除并替换为一个新的(它也会获得一个新的提交哈希),其中包含原始提交的更改 + 修改后的更改。

      git reflog 中,您可以看到您最近的操作,这确实显示了提交的修改。来自那里的引用可用于例如撤消git commit --amend。另请参阅 How to undo "git commit --amend" done instead of "git commit" 了解更多详情。

      【讨论】:

      • 好的,谢谢 Tim,git reflog -> git diff commit1_hash amend_commit_hash 解决了我的问题!
      猜你喜欢
      • 2012-03-23
      • 2019-01-27
      • 2013-06-24
      • 1970-01-01
      • 2019-02-28
      • 1970-01-01
      • 1970-01-01
      • 2021-12-31
      • 1970-01-01
      相关资源
      最近更新 更多