1

git commit の構成要素と、コミットの sha ハッシュに含まれる部分を検索してみました。しかし、おそらく私は間違った言葉を尋ねていたので、何も見つかりませんでした。

何のコミットで構成されているのだろうか。コミュニティブックを少し読んだところ、次の画像があります。

ここに画像の説明を入力

ただし、コミットには画像に示されているよりも多くのフィールドがあると思います。

ここで主な質問: commit sha ハッシュに参加しているフィールドは何ですか? 同じshaハッシュを持つが、異なる親コミットを持つ異なるリポジトリで2つのコミットを取得した原因を尋ねています。それ以前は、2 つのコミットが同じで、親コミットが同じである場合、2 つのコミットが同じ sha ハッシュを持つ可能性があると考えていました。だから私は少し混乱しています。

2 つのローカル リポジトリ (git1、git2) があり、1 つは他のリポジトリのクローンです。

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

同じリポジトリのクローン内の2つの異なるコミットが同じIDであるが、コミットが異なることはほとんどあり得ません。親のリストはハッシュされたコミットのデータの一部です。ハッシュされたデータを表示するには、次のコマンドを実行できます。

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

ハッシュされる実際のデータは、以下で構成されるヘッダーであり、<type> <size>\0その後にコミットのデータが続きます。たとえば、私のgitクローンのコミットの場合:

$ 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 に答える