ความแตกต่างระหว่าง "Commit hash", "Parent Hash`" กับ "Tree hash" ในคอมไพล์คืออะไร?


12

วันนี้ฉันเรียนรู้ความรู้พื้นฐานเกี่ยวกับคอมไพล์ผ่านการอ่านเอกสารออนไลน์:

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

และในบทนั้นฉันเริ่มเรียนรู้การใช้git log --pretty=format:" "เพื่อแสดงข้อมูลบันทึกตามรสนิยมของฉัน

แต่วิธีการบางอย่างที่ผมเห็นในรูปแบบตารางสองตัวเลือกที่คล้ายกัน%HสำหรับCommit Hash, %PสำหรับParent Hashและสำหรับ%TTree Hash

ฉันทดลองพวกมันในบรรทัดคำสั่งของฉันมันปรากฎว่ามันเป็นค่าแฮชที่มีความยาวเท่ากันและมีค่าต่างกัน

ฉัน googled และ stackoverflowed ไม่มีคำใบ้ที่ชัดเจนจนถึงตอนนี้

ฉันมีความคิดเกี่ยวกับสิ่งนี้Hash valueมันเป็นผลรวมตรวจสอบของคอมไพล์นั้น

แต่จะทำอะไรParent HashและTree hashทำอย่างไร

  • PS: อ่าฉันมีความคิดตอนนี้Parent Hashค่าแฮชของต้นกำเนิดโดยตรงของสาขาหรือไม่?

คำตอบ:


7

แฮชพาเรนต์:

$ 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

ท่านสามารถเข้าดูcommit4และcommit3เป็นแม่ของcommit5 , commit2เป็นแม่ของcommit3และcommit4 , commit1เป็นแม่ของcommit2

แฮชต้นไม้:

$ 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

ฟังก์ชั่นของคำสั่ง: พิมพ์พริตตี้เนื้อหา<object>ตามประเภทของมัน

git cat-file -p 

ในคอมไพล์เนื้อหาทั้งหมดจะถูกเก็บไว้เป็นวัตถุต้นไม้และหยดด้วยต้นไม้ที่สอดคล้องกับรายการไดเรกทอรี UNIX และ blobs สอดคล้องมากขึ้นหรือน้อยลง inodes หรือเนื้อหาไฟล์ วัตถุทรีเดียวมีรายการต้นไม้หนึ่งรายการขึ้นไปซึ่งแต่ละรายการมีตัวชี้ SHA-1 ไปยังหยดหรือทรีย่อยด้วยโหมดที่เกี่ยวข้องประเภทและชื่อไฟล์ ปกติแล้ว Git จะสร้างแผนผังโดยใช้สถานะของพื้นที่การจัดเตรียมหรือดัชนีและเขียนชุดของวัตถุต้นไม้จากนั้น วัตถุ Commit มีข้อมูลเกี่ยวกับผู้บันทึกวัตถุต้นไม้เมื่อพวกเขาบันทึกหรือทำไมพวกเขาบันทึก นี่คือข้อมูลพื้นฐานที่คอมมิชชันเก็บอ็อบเจ็กต์สำหรับคุณ

สรุป:

Commit hash, hash Parent, Tree hash เป็น SHA-1 ทั้งหมด Commit hash และ Parent hash นั้นเหมือนกันยกเว้น Parent hash มีลูก แฮชของต้นไม้แสดงถึงวัตถุต้นไม้ Commit hash และ Parent hash เป็นตัวแทนของอ็อบเจกต์ commit

อ้างอิง:

  1. Git Internals - วัตถุ Git

  2. git-cat-file - จัดเตรียมเนื้อหาหรือประเภทและข้อมูลขนาดสำหรับวัตถุที่เก็บ


4

ต้นไม้เป็นคอลเลกชันลำดับชั้นของไฟล์และไดเรกทอรีไม่เชื่อมโยงกับจุดใดจุดหนึ่งในประวัติศาสตร์ ตัวอย่างเช่นหากคุณสร้างไฟล์และจากนั้นลบไฟล์ในภายหลัง (โดยไม่มีการคอมมิทใด ๆ แทรกแซง) คุณจะต้องจบด้วยต้นไม้เดียวกันกับที่คุณเริ่มต้นด้วย

การกระทำเป็นจุดในประวัติศาสตร์ของโครงการของคุณ กระทำระบุต้นไม้ แต่ยังมีข้อมูลอื่น ๆ เช่นผู้เขียน / committer และเวลาข้อความกระทำ (ซึ่งผู้เขียนอธิบายสิ่งที่เปลี่ยนแปลง) และที่สำคัญที่สุดคือศูนย์หรือมากกว่าพ่อแม่ซึ่งเป็นสถานะก่อนหน้าของพื้นที่เก็บข้อมูล (ความมุ่งมั่นแรกของคุณมีผู้ปกครองเป็นศูนย์ส่วนใหญ่กระทำหลังจากนั้นให้ผู้ปกครองคนหนึ่งในระหว่างการพัฒนาเชิงเส้นและมากกว่าหนึ่งถ้าคุณผสาน)

คุณสามารถรับความรู้สึกของวิธีการทำงานกับgit cat-file -pคำสั่งซึ่งพิมพ์เนื้อหาของแฮเฉพาะโดยไม่คำนึงถึงประเภท ตัวอย่างเช่นหากต้องการดู HEAD commit คุณสามารถเรียกใช้:

$ 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

หากต้องการดูต้นไม้ที่อยู่ข้างในคุณสามารถcat-file -pใช้ต้นไม้:

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

ในทำนองเดียวกันถ้าคุณดูที่ผู้ปกครองคุณจะเห็นว่ามีความมุ่งมั่นเช่นกัน ชวเลขต้นไม้ภายในกระทำเช่นมีrev rev^{tree}ดังนั้นคำสั่งก่อนหน้านี้สามารถเขียนgit cat-file -p HEAD^{tree}ได้ โปรดทราบว่าย่อมาจากแม่ของrev^ revเมื่อมีผู้ปกครองหลายrev^1, rev^2ฯลฯ ข้อมูลเพิ่มเติมสามารถดูได้ในหน้าคนรอบ-แจงคอมไพล์


2

"Commit Hash" คือแฮชของการส่งข้อมูลปัจจุบัน คอมมิทรายการที่เกี่ยวข้องกับ

"Parent Hash" คือแฮชสำหรับสาขาหลักใด ๆ ที่กระทำได้มาจาก

"แฮชของต้นไม้" คือแฮชของไดเรกทอรีปัจจุบันในการส่ง git ls-files --stage --abbrevกัญชาเท่ากับกัญชาไดเรกทอรีได้ถ้าเห็นจากไดเรกทอรีของพ่อแม่ด้วย

อ้างอิง:


1
สิ่งที่ไม่commit hasหมายถึงจุดเริ่มต้นของย่อหน้าที่ 3 ของคุณหรือไม่
เซน
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.