1

我试图搜索 git commit 由什么组成以及哪些部分参与了提交的 sha 哈希。但可能我问错了词,我什么也没找到。

我想知道提交是由什么组成的。我读了一些社区书,有以下图片:

在此处输入图像描述

但是我认为提交的字段比图像中显示的要多。

现在的主要问题是:哪些字段参与了提交 sha 哈希?我之所以问这个问题,是因为我在不同的存储库中获得了两个具有相同 sha 哈希的提交,但具有不同的父提交。在此之前,我认为如果两个提交相同并且具有相同的父提交,则它们可能具有相同的 sha hash。所以我有点困惑。

我有两个本地存储库(git1,git2)一个是另一个的克隆。

git1

commit 4f438f9579939312689eb67e5fb7957d87cfa036 <-- this commit
Author: Michael Nesterenko <misha@gmail.com>
Date:   Mon Jun 25 00:00:31 2012 +0300

    stuff after change

commit e91e833158bb44f54f418cc5c3e1832452051428
Merge: dc69dc2 0b5912b
Author: Michael Nesterenko <misha@gmail.com>
Date:   Mon May 7 02:09:18 2012 +0300

    Merge branch 'master' of e:/temp/git2

    Conflicts:
        file.file

commit 0b5912bd1a1cb9b78410fe5c0dc67845ca1deec5
Author: Michael Nesterenko <misha@gmail.com>
Date:   Mon May 7 02:06:46 2012 +0300

    c8

commit dc69dc25a1e0c9067cbca19fe6a1d078a19138a0
Author: Michael Nesterenko <misha@gmail.com>
Date:   Mon May 7 02:06:29 2012 +0300

    c7

commit f6d88da1ecc3106f6debe1eac80d4b02705bcecf
Merge: d1a3c38 6134e66
Author: Michael Nesterenko <misha@gmail.com>
Date:   Mon May 7 02:05:05 2012 +0300

    Merge branch 'master' of e:/temp/git1

    Conflicts:
        file.file

commit d1a3c389416ff88e195e93def9a956fad1e63819
Author: Michael Nesterenko <misha@gmail.com>
Date:   Mon May 7 02:03:47 2012 +0300

git2

commit e1ee3b2756d4d8440ae3661df3fb3ec9af7cd55a
Merge: 4296e1b 4f438f9
Author: Michael Nesterenko <misha@gmail.com>
Date:   Mon Jun 25 00:01:30 2012 +0300

    Merge branch 'master' of e:/temp/git1

    Conflicts:
        file.file

commit 4f438f9579939312689eb67e5fb7957d87cfa036 <-- this commit
Author: Michael Nesterenko <misha@gmail.com>
Date:   Mon Jun 25 00:00:31 2012 +0300

    stuff after change

commit 4296e1bd046c4008166cfc516ef5ee2ce98a27d1
Author: Michael Nesterenko <misha@gmail.com>
Date:   Sun Jun 24 23:57:14 2012 +0300

    more stuff

commit e91e833158bb44f54f418cc5c3e1832452051428
Merge: dc69dc2 0b5912b
Author: Michael Nesterenko <misha@gmail.com>
Date:   Mon May 7 02:09:18 2012 +0300

    Merge branch 'master' of e:/temp/git2

    Conflicts:
        file.file

commit 0b5912bd1a1cb9b78410fe5c0dc67845ca1deec5
Author: Michael Nesterenko <misha@gmail.com>
Date:   Mon May 7 02:06:46 2012 +0300

    c8

commit dc69dc25a1e0c9067cbca19fe6a1d078a19138a0
Author: Michael Nesterenko <misha@gmail.com>
Date:   Mon May 7 02:06:29 2012 +0300

该提交具有不同的父级,但具有相同的 sha 哈希值。

4

1 回答 1

6

同一存储库的克隆中的两个不同提交具有相同的 id 但不同的提交是极不可能的。父列表散列的提交数据的一部分。要查看散列的数据,您可以运行:

git cat-file commit <id-of-commit>

散列的实际数据是一个标头,包括:<type> <size>\0后跟提交的数据。例如,在我的 git clone 中提交:

$ printf 'commit %d\0' $(git cat-file commit 5498c5f05283cd248fd5e4f48cb8902e9ca6ce28 | wc -c) >tmp.dat
$ hexdump -C tmp.dat
00000000  63 6f 6d 6d 69 74 20 33  30 34 00                 |commit 304.|
0000000b
$ git cat-file commit 5498c5f05283cd248fd5e4f48cb8902e9ca6ce28 >>tmp.dat
$ sha1sum tmp.dat
5498c5f05283cd248fd5e4f48cb8902e9ca6ce28  tmp.dat

请注意 sha1sum 与提交 id 匹配,并且父级是提交对象的一部分:

$ git cat-file commit 5498c5f05283cd248fd5e4f48cb8902e9ca6ce28 | grep parent
parent 3ba46634202968045e05e4d7f969d97c61efa53d

git log输出一个扁平的提交列表,但在 git 中提交是一个有向无环图。由于日志是一个扁平化的提交列表,它只会在简单的线性历史的简单情况下直接反映提交到父关系。如果您有任何合并(或正在记录多个分支),您将无法直接从git log.

要显示从提交到父母的实际链接,您需要使用类似git log --graph(我通常推荐使用--oneline)或图形可视化工具,例如gitk.

于 2012-06-24T21:48:24.123 回答