【发布时间】:2016-02-07 09:21:51
【问题描述】:
我想知道是否可以在两次提交之间显示 diff 什么是 amend 之一?换句话说,git 是否将修改后的提交保存在某个地方的历史记录中?
【问题讨论】:
我想知道是否可以在两次提交之间显示 diff 什么是 amend 之一?换句话说,git 是否将修改后的提交保存在某个地方的历史记录中?
【问题讨论】:
我不认为我理解这个问题,但我认为部分原因是我认为你对 git commit --amend 的作用有错误的想法。
在 git 中的提交实际上无法更改。 git commit --amend 所做的只是用故意更改的父 ID 编写 new 提交。
让我们看一下进行新提交的正常过程。
在进行新的提交之前,修改工作树中的一些文件,然后使用git add 暂存这些更改,以便提交新版本的文件。这个git add 将文件的新版本放入 git 的“索引”,即它的暂存区。
已经在上一次提交中的文件已经在暂存区。因此,您将进行的新提交将包含所有原始文件,除了您更改的任何内容,然后 git add-ed 将是新版本而不是旧版本。
现在你运行git commit(没有--amend),git 会执行以下操作:
-m、-F,或运行您的编辑器);最后一步“增长分支”,所以如果你曾经有一些提交,像这样:
... <- E <- F <- G <-- master
你现在又多了一个:
... <- E <- F <- G <- H <-- master
分支名称(master 或其他任何名称)现在指向您的最新提交 H,H 指向使用作为您最新提交的 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到新的。)
【讨论】:
修改后的提交与任何其他提交没有什么不同。从这个意义上说,完全有可能区分“正常”提交和修改后的提交。
换句话说,git 是否会将修改后的提交保存在某个地方的历史记录中?
没有包含所有已修改提交的列表,不。修改后的提交就像所有其他提交一样在历史记录中。
当你修改一个提交时,它基本上会被删除并替换为一个新的(它也会获得一个新的提交哈希),其中包含原始提交的更改 + 修改后的更改。
在git reflog 中,您可以看到您最近的操作,这确实显示了提交的修改。来自那里的引用可用于例如撤消git commit --amend。另请参阅 How to undo "git commit --amend" done instead of "git commit" 了解更多详情。
【讨论】: