Apa perbedaan antara `Commit hash`,` Parent Hash` dan `Tree hash` di git?


12

Hari ini saya belajar beberapa pengetahuan dasar git melalui membaca dokumen ini secara online:

http://git-scm.com/book/en/v2/Git-Basics-Viewing-the-Commit-Hi

Dan pada bab itu, saya mulai belajar menggunakan git log --pretty=format:" "untuk menampilkan info log sesuai selera saya.

Tapi entah bagaimana, saya melihat dalam tabel format dua opsi yang sama, %Huntuk Commit Hash, %Puntuk Parent Hashdan %Tuntuk Tree Hash.

Saya bereksperimen dengan mereka di baris perintah saya, ternyata mereka semua memiliki nilai hash yang sama panjang dengan nilai yang berbeda.

Saya googled dan stackoverflow, tidak ada petunjuk yang jelas sejauh ini.

Saya punya ide tentang ini Hash value, itu adalah checksum dari git commit itu.

Tetapi apa yang dilakukan Parent Hashdan Tree hashdilakukan?

  • PS: Ah, saya punya ide sekarang, apakah Parent Hashmaksudnya nilai hash dari asal cabang?

Jawaban:


7

Hash induk:

$ git log --graph
*   commit c06c4c912dbd9ee377d14ec8ebe2847cf1a3ec7e
|\  Merge: 79e6924 3113760
| | Author: linjie <linjielig@gmail.com>
| | Date:   Mon Mar 14 16:02:09 2016 +0800
| |
| |     commit5
| |
| |     Merge branch 'dev'
| |
| * commit 31137606f85d8960fa1640d0881682a081ffa9d0
| | Author: linjie <linjielig@gmail.com>
| | Date:   Mon Mar 14 16:01:26 2016 +0800
| |
| |     commit3
| |
* | commit 79e69240ccd218d49d78a72f33002fd6bc62f407
|/  Author: linjie <linjielig@gmail.com>
|   Date:   Mon Mar 14 16:01:59 2016 +0800
|
|       commit4
|
* commit 7fd4e3fdddb89858d925a89767ec62985ba07f3d
| Author: linjie <linjielig@gmail.com>
| Date:   Mon Mar 14 16:01:00 2016 +0800
|
|     commit2
|
* commit 316dd3fb3c7b501bc9974676adcf558a18508dd4
  Author: linjie <linjielig@gmail.com>
  Date:   Mon Mar 14 16:00:34 2016 +0800

     commit1

$ git log --pretty=format:'%<(82)%P %s'
79e69240ccd218d49d78a72f33002fd6bc62f407 31137606f85d8960fa1640d0881682a081ffa9d0  commit5
7fd4e3fdddb89858d925a89767ec62985ba07f3d                                           commit4
7fd4e3fdddb89858d925a89767ec62985ba07f3d                                           commit3
316dd3fb3c7b501bc9974676adcf558a18508dd4                                           commit2
                                                                                   commit1

Anda dapat melihat komit4 dan komit3 adalah induk dari komit5 , komit2 adalah induk komit3 dan komit4 , komit1 adalah induk komit2 .

Hash pohon:

$ git log --pretty=format:'%T %s'
f3c7cee96f33938631a9b023ccf5d8743b00db0e commit5
e0ecb42ae45ddc91c947289f928ea5085c70b208 commit4
d466aea17dc07516c449c58a73b2dc3faa9d11a1 commit3
b39f2e707050e0c5bbb3b48680f416ef05b179ba commit2
5706ec2b32605e27fa04cbef37d582325d14dda9 commit1

$ git cat-file -p f3c7ce
100644 blob 8bb2e871e94c486a867f5cfcbc6f30d004f6a9e5    dev
100644 blob 47f16c8e00adba77ec5c176876e99c8e9f05d69b    master

$ git cat-file -p 5706ec
100644 blob fc0bfde0d44bb4d6c7d27b6e587ebedd34ba5911    master

Fungsi perintah: Cukup-cetak konten <object>berdasarkan jenisnya itu.

git cat-file -p 

Dalam git, semua konten disimpan sebagai objek pohon dan gumpalan, dengan pohon yang sesuai dengan entri direktori UNIX dan gumpalan yang sesuai kurang lebih dengan inode atau isi file. Objek pohon tunggal berisi satu atau lebih entri pohon, yang masing-masing berisi pointer SHA-1 ke gumpalan atau subtree dengan mode, jenis, dan nama file yang terkait. Git biasanya membuat pohon dengan mengambil status area pementasan Anda atau indeks dan menulis serangkaian objek pohon dari itu. Objek komit memiliki informasi tentang siapa yang menyelamatkan objek pohon, kapan disimpan atau mengapa disimpan. Ini adalah informasi dasar yang disimpan oleh objek commit untuk Anda.

Kesimpulan:

Komit hash, Parent hash, Tree hash semuanya SHA-1. Komit hash dan Parent hash identik kecuali Parent hash memiliki anak. Hash pohon mewakili objek Pohon. Komit hash dan Parent hash mewakili objek commit.

Referensi:

  1. Git Internal - Git Objects

  2. git-cat-file - Memberikan konten atau jenis dan informasi ukuran untuk objek repositori


4

Sebuah pohon adalah kumpulan hirarki dari file dan direktori, tidak terikat pada titik tertentu dalam sejarah. Misalnya, jika Anda membuat file dan kemudian menghapus file (tanpa melakukan intervensi lain), Anda akan berakhir dengan pohon yang sama dengan yang Anda mulai.

Sebuah komit adalah titik dalam sejarah proyek Anda. Komit menentukan pohon, tetapi juga berisi informasi lain seperti penulis / pengangkat dan waktu, pesan komit (di mana penulis menggambarkan apa yang berubah), dan yang paling penting nol atau lebih orangtua, yang merupakan keadaan repositori sebelumnya. (Komit pertama Anda memiliki nol orang tua. Sebagian besar komit setelah itu memiliki satu orangtua selama pengembangan linier, dan lebih dari satu jika Anda bergabung.)

Anda bisa mengetahui bagaimana ini bekerja dengan git cat-file -pperintah, yang mencetak konten hash tertentu, terlepas dari jenisnya. Misalnya, untuk melihat komit HEAD, Anda dapat menjalankan:

$ git cat-file -p HEAD
tree 81ca1cb660ea79131336944df28b13b711d93557
parent 92b6b8fe9956866ace5397e060e7cc8ee1c76233
parent 7ea2575ed96d150ee19f70edea4bd42c7c2f0b83
author Mislav MarohniÄ <mislav.marohnic@gmail.com> 1436468108 -0700
committer Mislav MarohniÄ <mislav.marohnic@gmail.com> 1436468108 -0700

Merge pull request #951 from github/global-args

Avoid depending on a hardcoded list of git global flags

Untuk melihat pohon di dalam komit itu, Anda dapat cat-file -pmelakukannya pohon:

$ git cat-file -p 81ca1cb660ea79131336944df28b13b711d93557
100644 blob 730f77a3be502cfe6769c1305c0b59c22274caf5        .gitignore
100644 blob bcbd000f6b9ad5b0510f804ac4a3b19306b39c03        .travis.yml
100644 blob da71aa1fa3c3ae47b2fe5e6245ce2eea1586e278        CONTRIBUTING.md
...

Demikian pula, jika Anda melihat orang tua, Anda akan melihat mereka juga berkomitmen. Sebuah istilah untuk pohon dalam komit seperti revis rev^{tree}. Jadi perintah sebelumnya bisa ditulis git cat-file -p HEAD^{tree}. Perhatikan bahwa rev^singkatan dari induk rev. Ketika ada beberapa orang tua, rev^1, rev^2, dll Informasi lebih lanjut tersedia di git halaman manual rev-parse .


2

"Commit Hash" adalah hash untuk commit saat ini. Komit yang dikaitkan dengan entri.

"Parent Hash" adalah hash untuk cabang induk mana pun dari komit.

"Tree hash" adalah hash dari direktori saat ini di komit. Hash sama dengan hash yang dimiliki direktori jika dilihat dari direktori induk dengan git ls-files --stage --abbrev.

Referensi:


1
apa commit hasartinya di awal paragraf ke-3 Anda?
Zen
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.