我想知道是否有可能在两次提交之间显示差异 修改之一?换句话说,git save修改了历史记录中的提交吗?
答案 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
或运行您的编辑器); 最后一步"增长分支",这样如果你曾经有过一些提交,就像这样:
... <- 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 - 提到新的。)