1. "1234567..1234567 123456"是什么意思?它与提交的sha不匹配?
从git-log man page中可以看到:
索引行包括更改前后的SHA-1校验和。如果文件模式未更改,则包括< mode >; 否则,单独的行指示旧模式和新模式。
好的,很酷...但这是什么意思呢?
所以,git通过内部存储地址来存储对象。这些SHA-1校验和是您更改之前和之后文件版本的地址。
您可以使用git内部命令访问这些文件来查看:
$git cat-file -p a874b73
<--- the contents of the file before the commit --->
$git cat-file -p 8f94139
<--- the contents of the file after the commit --->
第二个数字,即
<mode>
,表示Unix文件权限。请参阅
this answer for more info about how to read them以获取更多信息。
请参见下面的示例,解释哈希值!
编辑:糟糕,忘记回答第二和第三个问题了。
2. 更改行后逗号后面的int是什么?@@ -40,20 +40,20 @@?
更改使用
统一差异格式显示。该维基百科文章有一个相当好的解释,但基本上该行是
范围信息
。它由两对组成:第一对有一个
-
符号,第二对有一个
+
符号。
-
对引用原始文件,
+
对引用第二个文件。
在每个对中,第一个数字是要显示的块的起始行号,第二个数字是将要显示的行数。
所以@@ -10,5 +10,10 @@
意味着您添加了5行,因此第二个版本中的块比原来多了五行。
3. 更改行后面的部分是什么?
这一行应该是块所在的上下文。因此,正如@TimWolla下面的答案指出的那样,如果这是一个C/C++程序,那么可能是该块所在函数的名称。在这种情况下,require 'rake/gempackagetask'
是Ruby代码,可能是程序的第一行,因此diff
认为这是适当的名称来引用此部分。
这里有几个展示git的SHA-1校验和工作的例子:
$ touch newfileA newfileB
$ git add newfile*
$ git commit -m 'added new files'
[master a49cb1c] added new files
2 files changed, 0 insertions(+), 0 deletions(-)
create mode 100644 newfileA
create mode 100644 newfileB
$ git log -p -1
commit a49cb1c5292082a6ed9c7f09e1bce2636e60ab93
Author: Nathan Daly <NHDaly@gmail.com>
Date: Sat Mar 1 16:10:49 2014 -0500
added new files
diff --git a/newfileA b/newfileA
new file mode 100644
index 0000000..e69de29
diff --git a/newfileB b/newfileB
new file mode 100644
index 0000000..e69de29
你可以看到,在提交之前,这些文件是不存在的(因为没有地址引用先前的版本:因此索引为0000000),在提交后它们被创建了,这些文件的blob地址为e69de29。它们具有相同的哈希值,因为这些文件是相同的,所以没有理由拥有空文件的不同副本。
你可以通过对一个空文件进行哈希来验证这一点。我们得到与之前相同的哈希值(这次是完整长度)。
$ touch blankfile
$ git hash-object blankfile
e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
现在,如果我们更改文件的内容:
$ echo 'contents1' > newfileA
$ echo 'contents2' > newfileB
$ git add newfile*
$ git commit -m 'updated newfile contents'
[master 76827d7] updated newfile contents
2 files changed, 2 insertions(+)
$ git log -p -1
commit 76827d7af1846c6c0f07ac2b78771cbc34cd6056
Author: Nathan Daly <NHDaly@gmail.com>
Date: Sat Mar 1 16:18:40 2014 -0500
updated newfile contents
diff --git a/newfileA b/newfileA
index e69de29..a024003 100644
--- a/newfileA
+++ b/newfileA
@@ -0,0 +1 @@
+contents1
diff --git a/newfileB b/newfileB
index e69de29..6b46faa 100644
--- a/newfileB
+++ b/newfileB
@@ -0,0 +1 @@
+contents2
你可以看到它们现在有不同的哈希值。它们中的每一个都从e69de29对象开始,移动到具有不同地址的新对象。为了验证这一点,我们可以从它们各自的哈希值获取这些对象的内容:
$ git cat-file -p a024003
contents1
$ git cat-file -p 6b46faa
contents2
最后,如果我们再次使它们的内容相等,它们将再次共享哈希值。(再次强调,Git这样做只是为了节省磁盘空间,因为这两个文件除了名称外完全相同)
$ echo 'contents2' > newfileA
$ git add newfileA
$ git commit -m 'now files match'
$ git log -p -1
commit 3f63bcef9290fae616521ec1b380639c6026c5c5
Author: Nathan Daly <NHDaly@gmail.com>
Date: Sat Mar 1 16:22:29 2014 -0500
now files match
diff --git a/newfileA b/newfileA
index a024003..6b46faa 100644
--- a/newfileA
+++ b/newfileA
@@ -1 +1 @@
-contents1
+contents2
正如您所见,现在newfileA也有与newfileB相同的哈希值6b46faa
。
Git中的每个对象都以这样的哈希地址存储,因此在您的git日志查看器应用程序中,您可以使用这些索引哈希来向用户显示每个版本文件的内容!