Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Git 与他发生争执_Git_Git Amend - Fatal编程技术网

Git 与他发生争执

Git 与他发生争执,git,git-amend,Git,Git Amend,我想知道是否有可能在两个提交之间显示差异修改中的一个?换句话说,git是否将修改后的提交保存在历史的某个地方?修改后的提交与任何其他提交都没有区别。从这个意义上讲,完全有可能区分“正常”提交和已修改的提交 换句话说,git是否在历史上的某个地方保存了修改后的提交 没有任何列表包含所有已修改的提交,没有。已修改的提交与所有其他提交一样在历史上 当您修改提交时,它基本上会被删除并替换为一个新的提交(它也会得到一个新的提交哈希),该哈希包含原始提交的更改+修改后的更改 在git reflog中,您可以

我想知道是否有可能在两个提交之间显示差异修改中的一个?换句话说,git是否将修改后的提交保存在历史的某个地方?

修改后的提交与任何其他提交都没有区别。从这个意义上讲,完全有可能区分“正常”提交和已修改的提交

换句话说,git是否在历史上的某个地方保存了修改后的提交

没有任何列表包含所有已修改的提交,没有。已修改的提交与所有其他提交一样在历史上

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


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