Sự khác biệt giữa `Commit hash`,` Parent Hash` và` Tree hash` trong git là gì?


12

Hôm nay tôi đang học một số kiến ​​thức cơ bản về git thông qua việc đọc tài liệu này trực tuyến:

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

Và ở chương đó, tôi bắt đầu học cách sử dụng git log --pretty=format:" "để hiển thị thông tin nhật ký theo sở thích của mình.

Nhưng một số cách, tôi thấy trong bảng định dạng hai tùy chọn tương tự, %Hcho Commit Hash, %Pcho Parent Hash%Tcho Tree Hash.

Tôi đã thử nghiệm chúng trên dòng lệnh của tôi, nó xuất hiện tất cả chúng đều là các giá trị băm có cùng độ dài với giá trị khác nhau.

Tôi googled và stackoverflow, cho đến nay không có gợi ý rõ ràng.

Tôi có ý tưởng về điều này Hash value, đó là một tổng kiểm tra của cam kết git đó.

Nhưng làm gì Parent HashTree hashlàm gì?

  • PS: Ah, bây giờ tôi đã có một số ý tưởng, Parent Hashcó nghĩa là giá trị băm của nguồn gốc trực tiếp của một chi nhánh?

Câu trả lời:


7

Phụ huynh băm:

$ 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

Bạn có thể thấy commit4commit3 là cha của commit5 , commit2 là cha của commit3commit4 , commit1 là cha của commit2 .

Cây băm:

$ 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

Chức năng của lệnh: In khá nhiều nội dung <object>dựa trên loại của nó.

git cat-file -p 

Trong git, tất cả nội dung được lưu trữ dưới dạng các đối tượng cây và blob, với các cây tương ứng với các mục nhập thư mục UNIX và các đốm màu tương ứng ít nhiều với các nút hoặc nội dung tệp. Một đối tượng cây duy nhất chứa một hoặc nhiều mục cây, mỗi mục chứa con trỏ SHA-1 đến blob hoặc cây con với chế độ, loại và tên tệp được liên kết của nó. Git thường tạo một cây bằng cách lấy trạng thái của khu vực tổ chức hoặc chỉ mục của bạn và viết một loạt các đối tượng cây từ nó. Các đối tượng cam kết có thông tin về người đã lưu đối tượng cây, khi chúng được lưu hoặc lý do chúng được lưu. Đây là thông tin cơ bản mà đối tượng cam kết lưu trữ cho bạn.

Phần kết luận:

Cam kết băm, băm gốc, băm cây đều là SHA-1. Cam kết băm và băm Parent là giống hệt nhau ngoại trừ băm Parent có con. Cây băm là đại diện cho một đối tượng cây. Cam kết băm và Băm cha biểu thị một đối tượng cam kết.

Tài liệu tham khảo:

  1. Git Internals - Đối tượng Git

  2. git-cat-file - Cung cấp thông tin nội dung hoặc loại và kích thước cho các đối tượng kho lưu trữ


4

Một cây là một bộ sưu tập thứ bậc của tập tin và thư mục, không gắn với bất kỳ điểm cụ thể trong lịch sử. Ví dụ: nếu bạn tạo một tệp và sau đó xóa tệp đó (không có các cam kết can thiệp nào khác), bạn sẽ kết thúc với cùng một cây bạn đã bắt đầu.

Một cam kết là một điểm trong lịch sử của dự án của bạn. Một cam kết chỉ định một cây, nhưng cũng chứa các thông tin khác như tác giả / committer và thời gian, một thông báo cam kết (trong đó tác giả mô tả những gì đã thay đổi) và quan trọng nhất là không hoặc nhiều cha mẹ, là trạng thái trước đó của kho lưu trữ. (Cam kết đầu tiên của bạn không có cha mẹ. Hầu hết các cam kết sau đó có một cha mẹ trong quá trình phát triển tuyến tính và nhiều hơn một lần nếu bạn hợp nhất.)

Bạn có thể hiểu được cách thức hoạt động của git cat-file -plệnh này với lệnh in ra nội dung của một hàm băm cụ thể, bất kể loại nào. Ví dụ: để xem cam kết CHÍNH, bạn có thể chạy:

$ 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

Để xem cây bên trong cam kết đó, bạn có thể cat-file -plà cây:

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

Tương tự như vậy, nếu bạn nhìn vào cha mẹ, bạn cũng sẽ thấy đó là những cam kết. Một tốc ký cho cây bên trong một cam kết như revrev^{tree}. Vì vậy, lệnh trước đó có thể đã được viết git cat-file -p HEAD^{tree}. Lưu ý rằng rev^viết tắt của cha mẹ của rev. Khi có nhiều bậc phụ huynh, rev^1, rev^2, vv Nhiều thông tin có sẵn trong git trang người đàn ông rev-phân tích cú pháp .


2

"Cam kết Hash" là hàm băm cho cam kết hiện tại. Các cam kết các mục được liên kết với.

"Parent Hash" là hàm băm cho bất kỳ nhánh cha mẹ nào mà cam kết đến từ.

"Cây băm" là hàm băm của thư mục hiện tại trong cam kết. Giá trị băm bằng với hàm băm mà thư mục có nếu nhìn thấy từ thư mục mẹ với git ls-files --stage --abbrev.

Tài liệu tham khảo:


1
commit hasnghĩa là gì trong phần đầu của đoạn 3 của bạn?
Zen
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.