2015-11-06 77 views
8

作出区别我是否可以显示差异两个提交之一是什么是修正?换句话说,git是否将修改的提交保存在历史记录中?与修改承诺

回答

4

修改后的提交与其他提交没有区别。从这个意义上说,完全可以在“正常”提交和已修改的提交之间进行区分。

换句话说,git保存修改的提交历史记录吗?

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

当你修改一个提交时,它基本上被删除并被一个新的代码替换(它也得到了一个新的提交哈希),它有原始提交+修改后的更改。

git reflog中,您可以看到最近的操作,并确实显示修改提交。从那里引用可用于例如撤消git commit --amend。有关详细信息,另请参阅How to undo "git commit --amend" done instead of "git commit"

+1

好的,谢谢Tim,_git reflog_ - > _git diff commit1_hash amend_commit_hash_解决了我的问题! –

0

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

git中的提交实际上无法更改。 git commit --amend所做的就是编写新的提交一个故意改变的父ID。

让我们来看看进行新提交的正常流程。

在您进行新提交之前,您需要修改工作树中的某些文件,然后使用git add来对这些更改进行暂存,以便提交新版本的文件。这个git add把文件的新版本放到git的“索引”中,即它的暂存区域。

已经在上次提交中的文件已经在暂存区域中。因此,您将提交的新提交将包含所有原始文件,但您更改的任何内容都将是新版本,而不是旧版本。

现在你运行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,混帐改变这个序列只是一个很小位:而不是使新的提交(H)点回当前(G),混帐使得新的点回到当前的父(在这种情况下,F):

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

现在master(或你对)指向H,指向F等任何分支。

如果你运行git log,混帐与当前开始提交(H)并记录它,然后移动到它的父(F),并将其记录,依此类推。承诺G似乎已经消失。

G的SHA-1 ID是仍在(默认为30天),在“reflogs”中。有一个HEAD的推荐日志,一个用于你当前的分支。如果您在分支master上,而您刚刚制造了H,则[email protected]{1}master的上一个小费,即。或者,如果您将SHA-1 ID保存在屏幕的某个位置,则可以剪切并粘贴它以查看提交G

(该--amend交换机还可以修改合并提交。此作品完全相同的方式如上,那只是意味着Git有从老枝尖复制所有父ID来新的。)