Git 与他发生争执
我想知道是否有可能在两个提交之间显示差异修改中的一个?换句话说,git是否将修改后的提交保存在历史的某个地方?修改后的提交与任何其他提交都没有区别。从这个意义上讲,完全有可能区分“正常”提交和已修改的提交 换句话说,git是否在历史上的某个地方保存了修改后的提交 没有任何列表包含所有已修改的提交,没有。已修改的提交与所有其他提交一样在历史上 当您修改提交时,它基本上会被删除并替换为一个新的提交(它也会得到一个新的提交哈希),该哈希包含原始提交的更改+修改后的更改Git 与他发生争执,git,git-amend,Git,Git Amend,我想知道是否有可能在两个提交之间显示差异修改中的一个?换句话说,git是否将修改后的提交保存在历史的某个地方?修改后的提交与任何其他提交都没有区别。从这个意义上讲,完全有可能区分“正常”提交和已修改的提交 换句话说,git是否在历史上的某个地方保存了修改后的提交 没有任何列表包含所有已修改的提交,没有。已修改的提交与所有其他提交一样在历史上 当您修改提交时,它基本上会被删除并替换为一个新的提交(它也会得到一个新的提交哈希),该哈希包含原始提交的更改+修改后的更改 在git reflog中,您可以
在
git reflog
中,您可以看到最近的操作,这确实显示了提交的修改。这里的引用可以用来撤销git提交--amend。有关这方面的更多细节,请参见。我认为我不理解这个问题,但我认为部分原因是因为我认为您对git提交--amend的功能有错误的理解
git中的提交实际上无法更改。git commit--amend所做的一切就是使用故意修改的父ID编写新的commit
让我们看一下进行新提交的正常过程
在进行新提交之前,请修改工作树中的一些文件,然后使用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
现在master
(或您所在的任何分支)指向H
,它指向F
,依此类推
如果运行git log
,git将以当前提交(H
)开始并记录它,然后移动到其父级(F
)并记录它,依此类推。提交G
似乎不见了
G
的SHA-1 ID仍在“重登录”中(默认为30天)。有一个reflog用于HEAD
,还有一个用于当前分支。如果您在分支master
上,并且刚刚创建了H
,那么master@{1}
是master
的上一个提示,即提交G
。或者,如果您将SHA-1 ID保存在屏幕上的某个位置,您可以剪切并粘贴它以查看提交G
(--amend
开关也可以修改合并提交。其工作方式与上面完全相同,只是意味着git必须将所有父ID从旧分支提示复制到新分支提示。)好的,谢谢Tim,git reflog->git diff commit1\u hash amend\u commit\u hash解决了我的问题!
... <- E <- F <- G <- H <-- master
G
/
... <- E <- F <- H <-- master