HEAD ใน Git คืออะไร


1026

คุณเห็นเอกสาร Git ที่พูดถึงสิ่งต่างๆ

สาขาจะต้องรวมกันใน HEAD

แต่ Git คืออะไรHEADกันแน่



คำตอบ:


775

คุณคิดว่า HEAD เป็น "สาขาปัจจุบัน" เมื่อคุณสลับสาขาด้วยgit checkoutการแก้ไข HEAD จะเปลี่ยนไปชี้ไปที่ปลายของสาขาใหม่

คุณสามารถดูว่า HEAD ชี้ไปที่ใดโดยทำดังนี้

cat .git/HEAD

ในกรณีของฉันผลลัพธ์คือ:

$ cat .git/HEAD
ref: refs/heads/master

เป็นไปได้ที่ HEAD จะอ้างถึงการแก้ไขเฉพาะที่ไม่เกี่ยวข้องกับชื่อสาขา สถานการณ์เช่นนี้จะเรียกว่าหัวเดี่ยว


53
ดังนั้นหัวคอมไพล์จึงขึ้นอยู่กับบริบทว่าสาขาใดที่คุณใช้อยู่ถูกต้อง? ยิ่งไปกว่านั้นคุณในฐานะนักพัฒนา ฉันเดาว่าฉันถาม Git HEAD จะเป็นที่เก็บข้อมูลทั่วโลกหรือเป็นรายบุคคลสำหรับแต่ละ dev
bobobobo

91
@bobobobo: ถูกต้อง HEAD เปรียบเสมือนตัวชี้ที่ชี้ไปยังสาขาปัจจุบัน เมื่อคุณชำระเงินสาขาที่แตกต่างกัน HEAD จะเปลี่ยนไปเป็นสาขาใหม่ HEAD ปัจจุบันเป็นโลคัลสำหรับแต่ละที่เก็บและเป็นแต่ละรายการสำหรับนักพัฒนาแต่ละคน
Greg Hewgill

16
@Meng หนึ่งนี้ช่วยให้ผมหวังว่ามันจะช่วยให้: marklodato.github.com/visual-git-guide/index-en.html
ราฟาเอล

54
@ 動靜能量: หัวหน้าสามารถชี้ไปที่กระทำใด ๆมันไม่จำเป็นต้องเป็นกระทำสุดท้ายในสาขาใด ๆ (เมื่อ HEAD ชี้ไปที่การกระทำที่ไม่ใช่การกระทำสุดท้ายในสาขานั่นคือ "HEAD เดี่ยว")
เกร็กฮิวกิล

127
HEAD ไม่ใช่ "สาขาปัจจุบัน" Is คือชื่อที่กำหนดให้กับคอมมิชชันซึ่งสถานะปัจจุบันของแผนผังการทำงานถูกเตรียมใช้งาน ในแง่การปฏิบัติมากขึ้นมันอาจจะคิดว่าเป็นการอ้างอิงสัญลักษณ์เพื่อกระทำการตรวจสอบ
Ben Collins

184

ในการอ้างถึงคนอื่น :

หัวเป็นเพียงการอ้างอิงถึงวัตถุกระทำ แต่ละหัวมีชื่อ (ชื่อสาขาหรือชื่อแท็ก ฯลฯ ) ตามค่าเริ่มต้นจะมีส่วนหัวในที่เก็บข้อมูลทั้งหมดที่เรียกว่าต้นแบบ พื้นที่เก็บข้อมูลสามารถมีจำนวนของหัวใด ๆ เมื่อถึงเวลาใดเวลาหนึ่งหัวจะถูกเลือกเป็น "หัวปัจจุบัน" หัวนี้มีนามแฝงต่อ HEAD อยู่ในเมืองหลวงเสมอ "

โปรดสังเกตความแตกต่างนี้: "หัว" (ตัวพิมพ์เล็ก) หมายถึงหนึ่งในหัวที่มีชื่อในที่เก็บ; “ HEAD” (ตัวพิมพ์ใหญ่) อ้างถึงส่วนหัวที่ใช้งานอยู่ในปัจจุบันเท่านั้น ความแตกต่างนี้ถูกใช้บ่อยในเอกสารประกอบ Git

แหล่งอื่นที่ดีที่ได้อย่างรวดเร็วครอบคลุมการทำงานภายในของคอมไพล์ (และดังนั้นความเข้าใจที่ดีของหัว / HEAD) สามารถพบได้ที่นี่ การอ้างอิง (การอ้างอิง :) หรือหัวหรือกิ่งถือได้ว่าเป็นบันทึกโพสต์มันติดอยู่กับความมุ่งมั่นในประวัติการกระทำ โดยปกติแล้วพวกเขาจะชี้ไปที่ปลายของชุดของความมุ่งมั่น แต่พวกเขาสามารถย้ายไปรอบ ๆ ด้วยgit checkoutหรือgit resetอื่น ๆ


จากนี้: "แต่ละหัวมีชื่อ" และ "หนึ่งหัวถูกเลือกเป็น" หัวปัจจุบัน " หัวนี้ใช้นามแฝงเป็น HEAD " ดังนั้นฉันสรุปได้จากสิ่งนี้ว่า "HEAD" ไม่ได้อ้างถึงสถานการณ์ของสถานะ "HEAD HEAD"
gxyd

1
@ gxyd หากเป็นกรณีที่ HEAD ไม่ได้ชี้ไปที่ 'head' มันเป็น HEAD ที่แยกออกมา มันกำลังชี้ไปที่การส่งมอบรหัสของการกระทำที่คุณระบุไว้ (ตัวอย่างเช่นการใช้git checkout HEAD~2) ซึ่งไม่ได้เป็นรหัสการกระทำของหัวที่รู้จักกัน ดูบทความที่eagain.net/articles/git-for-computer-scientistsสำหรับคำอธิบายที่ละเอียดยิ่งขึ้น
Silfheed

1
@Silfheed: โดยทั่วไปฉันคิดว่าคำตอบนี้เป็นแนวคิดที่ดีกว่าคำตอบที่ยอมรับ (แม้ว่าการใช้ "หัว" ตัวพิมพ์เล็กเพื่ออ้างอิงถึงสาขาทำให้หลายคนสับสน) อย่างไรก็ตามgit revertไม่ใช่ตัวอย่างที่ดีของการย้ายสาขาที่ไม่ได้อยู่ที่ปลายเพราะgit revertเพิ่งสร้างการกระทำใหม่และยังคงออกจากสาขาปัจจุบันที่เคล็ดลับ (ใหม่)
LarsH

1
"ซึ่งไม่ใช่รหัสการกระทำของหัวหน้าที่รู้จัก" - ที่จริงแล้ว HEAD ที่แยกออกมาสามารถชี้ไปที่รหัสการกระทำซึ่งเป็นรหัสการกระทำของหัวหน้าที่รู้จัก (หรือหลายหัว) สิ่งที่ทำให้แยกออกได้คือ HEAD ชี้ไปที่รหัสการกระทำไม่ใช่ตรงไปที่หัว สิ่งนี้จะส่งผลต่อพฤติกรรมของอนาคตcommits resetฯลฯ s
LarsH

1
@ LarsH: จุดที่ดีใน HEAD เดี่ยวที่ชี้ไปที่รหัสการกระทำแทนที่จะเป็นข้อมูลอ้างอิง คุณสามารถยืนยันได้โดยดูที่. git / HEAD ถ้าแยกออกมันจะมีแฮชของการคอมมิทถึงแม้ว่ามันจะเหมือนกับคอมมิทที่รู้จักกันดีก็ตาม หากมีการแนบมันจะมีเส้นทางไปยังหัว (เช่น 'ref: refs / heads / bob') สำหรับคำสั่งย้อนกลับหลังจาก 8 ปีฉันไม่เคยจับตัวพิมพ์ผิดนั้น การรีเซ็ต Git เป็นสิ่งที่ช่วยให้คุณปรับหัวเฉพาะเพื่อชี้ไปที่การกระทำที่เฉพาะเจาะจง
Silfheed

62

ฉันแนะนำคำนิยามนี้จากนักพัฒนา Github Scott Chacon [ วิดีโออ้างอิง ]:

Head เป็นสาขาปัจจุบันของคุณ มันคือการอ้างอิงสัญลักษณ์ มันคือการอ้างอิงไปยังสาขา คุณมักจะมี HEAD แต่ HEAD จะชี้ไปยังหนึ่งในพอยน์เตอร์อื่น ๆ เหล่านี้ไปยังหนึ่งในสาขาที่คุณอยู่ มันเป็นพ่อแม่ของการกระทำของคุณต่อไป นี่คือสิ่งที่ควรตรวจสอบล่าสุดในไดเรกทอรีการทำงานของคุณ ... นี่คือสถานะล่าสุดที่ทราบว่าไดเรกทอรีการทำงานของคุณคืออะไร

วิดีโอทั้งหมดจะให้คำแนะนำที่เป็นธรรมกับระบบคอมไพล์ทั้งหมดดังนั้นฉันขอแนะนำให้คุณดูมันทั้งหมดหากมีเวลา


34
ดังนั้น def ที่แท้จริงคือ "พ่อแม่ของความมุ่งมั่นต่อไปของคุณ"
ลัส

1
และ "สิ่งที่ชี้ไปที่สาขาถัดไปที่จะย้าย"
ลัส

@ นิโคลัส - ฉันไม่คิดว่าเป็นเรื่องจริง HEAD สามารถชี้ไปที่การกระทำใด ๆ ก็ได้โดยไม่จำเป็นต้องชี้ไปที่สาขา - เมื่อไม่มีคุณอยู่ในโหมด "HEAD HEAD"
scubbo

23
วิดีโอนี้ยอดเยี่ยม แต่น่าเสียดายที่มันเป็นคำตอบที่ไม่เหมาะสมสำหรับ Stack Overflow จะเกิดอะไรขึ้นหากวิดีโอถูกลบในบางครั้งในอนาคต ลิงก์ของคุณจะชี้ไปที่อะไรเลย คำตอบที่ดีกว่านั้นรวมถึงการถอดเสียงสิ่งที่ Scott พูดในวิดีโอ

2
Scott กล่าวว่า HEAD เป็นตัวชี้ไปยังสาขา แต่ HEAD สามารถชี้ไปที่การคอมมิชชันเก่าได้เช่นกัน นี่คือความสับสนมาก
Fixee

60

HEAD เป็นเพียงตัวชี้พิเศษที่ชี้ไปยังสาขาท้องถิ่นที่คุณอยู่

จากหนังสือPro Gitบทที่3.1 การแยกกิ่ง Git - สาขาโดยสังเขปในส่วนการสร้างสาขาใหม่ :

จะเกิดอะไรขึ้นถ้าคุณสร้างสาขาใหม่ การทำเช่นนั้นจะสร้างตัวชี้ใหม่เพื่อให้คุณเลื่อนไปรอบ ๆ สมมติว่าคุณสร้างสาขาใหม่ที่เรียกว่าการทดสอบ คุณทำสิ่งนี้ด้วยคำสั่ง git branch:

$ git branch testing 

สิ่งนี้จะสร้างตัวชี้ใหม่พร้อมกันกับการกระทำที่คุณกำลังทำอยู่

ป้อนคำอธิบายรูปภาพที่นี่

Git รู้ได้อย่างไรว่าสาขาไหนที่คุณเปิดอยู่ มันเก็บตัวชี้พิเศษที่เรียกว่า HEAD โปรดทราบว่านี่แตกต่างจากแนวคิดของ HEAD ใน VCS อื่น ๆ ที่คุณอาจคุ้นเคยเช่น Subversion หรือ CVS ใน Git นี่คือตัวชี้ไปยังสาขาท้องถิ่นที่คุณอยู่ ในกรณีนี้คุณยังคงอยู่ในระดับปริญญาโท คำสั่ง git branch สร้างสาขาใหม่เท่านั้น - มันไม่ได้เปลี่ยนเป็นสาขานั้น

ป้อนคำอธิบายรูปภาพที่นี่


4
ดีมากสามารถใช้รูปภาพแสดงหัว HEAD ที่แยกออกมาได้
Don Hatch

@ DonHatch คำอธิบายที่ดีของการแยก HEAD stackoverflow.com/a/35301963/1074179
Alexandr

3
คำตอบที่ดี สาขาไม่มีอะไรเลยนอกจากป้ายคอมมิทเมื่อคุณทำคอมมิทใหม่ฉลากนี้จะถูกย้ายไปที่คอมมิทใหม่ เมื่อคุณชำระเงินการกระทำที่ไม่มีป้ายกำกับจะอยู่ในสถานะ HEAD ที่แยกออกมา นั่นหมายความว่า HEAD กำลังชี้ไปที่การกระทำที่ไม่มีป้ายชื่อสาขา หากคุณชำระเงิน34ac2ในตัวอย่างด้านบนตอนนี้ HEAD จะชี้ไปที่การคอมมิทและเรียกว่า HEAD ที่แยกออกมา ในสถานะนี้คุณสามารถทำการเปลี่ยนแปลงทดลองและกระทำการเปลี่ยนแปลงได้เช่นกัน แต่เมื่อคุณชำระเงินที่สาขาอื่นคุณจะสูญเสียการเปลี่ยนแปลงทั้งหมดยกเว้นว่าคุณสร้างสาขาใหม่
sleepwalkerfx

1
@sleepwalkerfx แต่คุณสามารถชำระเงินการกระทำที่มีเลเบลสาขาและยังคงอยู่ในสถานะหัวหน้าเดี่ยวเนื่องจาก HEAD ของคุณไม่ได้ชี้ไปที่เลเบลสาขาอีกต่อไป แต่
มาร์คคอมมิท

1
@sleepwalkerfx ฉันคิดว่าเรากำลังพูดถึงซีแมนทิกส์ ณ จุดนี้ คุณถูกต้องฉลากสาขาคือการอ้างอิงข้อความเพื่อกระทำเฉพาะ อย่างไรก็ตามมันไม่ใช่การกระทำ ดังนั้นถ้าคุณได้git logและได้สิ่งที่ต้องการcommit ad0265... HEAD -> foo ...ที่จะหมายถึงfooสาขาคือการอ้างอิงถึงการกระทำ ad0265ID การทำเช็คเอาต์ของการอ้างอิงข้อความfooไม่ใช่หัวเดี่ยว การชำระเงินการยืนยันรหัสad0265จะส่งผลให้หัวที่ถอดออก อาจเป็นเพราะฉันขาดความลึกซึ้งในสิ่งที่คุณกำลังสื่อสาร ฉันหวังว่ากำแพงข้อความนี้จะช่วยค้นหาว่าฉันหลงทางไหน
Marc

40

สมมติว่าไม่ใช่กรณีพิเศษที่เรียกว่า "HEAD HEAD" จากนั้นตามที่ระบุไว้ในหนังสือ O'Reilly Git, 2nd edtion, p.69 HEADหมายถึง:

HEADอ้างถึงการกระทำล่าสุดในสาขาปัจจุบันเสมอ เมื่อคุณเปลี่ยนสาขาHEADจะได้รับการอัปเดตเพื่ออ้างอิงการกระทำล่าสุดของสาขาใหม่

ดังนั้น

HEADคือว่า "เคล็ดลับ" ของสาขาในปัจจุบัน

โปรดทราบว่าเราสามารถใช้HEADเพื่ออ้างถึงการคอมมิชชันล่าสุดและใช้HEAD~เป็นการคอมมิตก่อนทิปและHEAD~~หรือHEAD~2เป็นคอมมิทแม้แต่ก่อนหน้าและอื่น ๆ


27

อาจมีความเข้าใจผิดที่สำคัญ แต่สำคัญในจำนวนคำตอบเหล่านี้ ฉันคิดว่าฉันจะเพิ่มคำตอบเพื่อล้างมัน

คือHEADอะไร

หัวคือคุณ

HEADเป็นข้อมูลอ้างอิงเชิงสัญลักษณ์ที่ชี้ไปยังที่ใดก็ตามที่คุณอยู่ในประวัติการกระทำของคุณ มันติดตามคุณทุกที่ที่คุณไปไม่ว่าคุณจะทำอะไรเหมือนเงา หากคุณกระทำHEADจะย้าย หากคุณชำระเงินบางอย่างHEADจะย้าย ไม่ว่าคุณจะทำอะไรถ้าคุณย้ายที่ใดที่หนึ่งใหม่ในประวัติความเป็นมาของHEADคุณ ไปยังที่อยู่ความเข้าใจผิดอย่างใดอย่างหนึ่งที่เหมือนกัน: HEADคุณไม่สามารถแยกตัวเองจาก นั่นไม่ใช่สถานะ HEAD ที่แยกออกมา ถ้าคุณคิดว่าตัวเองเคยคิดว่า: "โอ้ไม่ฉันอยู่ในสถานะ HEAD เดี่ยว! ฉันทำ HEAD หาย!" จำไว้ว่ามันเป็นหัวหน้าของคุณ หัวคือคุณ คุณไม่ได้แยกออกจาก HEAD คุณและ HEAD ของคุณได้แยกออกจากสิ่งอื่นแล้ว

HEAD สามารถแนบกับอะไรได้บ้าง

HEADสามารถชี้ไปที่การตกลงใช่ แต่โดยทั่วไปแล้วจะไม่ ให้ฉันพูดอีกครั้ง โดยทั่วไปแล้วHEADไม่ได้ชี้ไปที่การกระทำ มันชี้ไปที่การอ้างอิงสาขา มันถูกแนบไปยังสาขาที่และเมื่อคุณทำบางสิ่งบางอย่าง (เช่นcommitหรือreset) HEADสาขาที่แนบมาจะย้ายไปพร้อมกับ คุณสามารถเห็นสิ่งที่ชี้ไปโดยดูใต้ฝากระโปรง

cat .git/HEAD

โดยปกติคุณจะได้รับสิ่งนี้:

ref: refs/heads/master

บางครั้งคุณจะได้รับสิ่งนี้:

a3c485d9688e3c6bc14b06ca1529f0e78edd3f86

นั่นคือสิ่งที่จะเกิดขึ้นเมื่อHEADชี้ไปที่การส่งโดยตรง สิ่งนี้เรียกว่า HEAD เดี่ยวเนื่องจากHEADชี้ไปที่สิ่งอื่นนอกเหนือจากการอ้างอิงสาขา หากคุณกระทำในสถานะนี้จะmasterไม่ถูกผูกติดกับHEADอีกต่อไปจะไม่ย้ายไปกับคุณอีกต่อไป มันไม่สำคัญว่าจะทำอะไร คุณอาจใช้การกระทำเดียวกับสาขาหลักของคุณ แต่ถ้าHEADชี้ไปที่การส่งมอบมากกว่าสาขาจะเป็นการแยกออกและการส่งมอบใหม่จะไม่เชื่อมโยงกับการอ้างอิงสาขา

คุณสามารถดูกราฟนี้ถ้าคุณลองออกกำลังกายต่อไปนี้ จากที่เก็บ git ให้รันสิ่งนี้ คุณจะได้อะไรที่แตกต่างออกไปเล็กน้อย แต่พวกมันจะอยู่ตรงนั้น เมื่อถึงเวลาชำระเงินการกระทำโดยตรงเพียงใช้แฮชตัวย่อที่คุณได้รับจากเอาต์พุตแรก (นี่คือa3c485d)

git checkout master
git log --pretty=format:"%h:  %d" -1
# a3c485d:   (HEAD -> master)

git checkout a3c485d -q # (-q is for dramatic effect)
git log --pretty=format:"%h:  %d" -1   
# a3c485d:   (HEAD, master)

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

ตอนนี้ลอง:

git status
# HEAD detached at a3c485d

Nope เราอยู่ในสถานะ 'ถอดหัว'

คุณสามารถเห็นการเป็นตัวแทนของ(HEAD -> branch)vs. (HEAD, branch)ด้วยgit log -1เหมือนกัน

สรุปแล้ว

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


1
ฉันชอบคำตอบนี้เพราะในขณะที่เอกสารอธิบายความจริงซอฟต์แวร์กำหนดความจริง .git/HEADเป็นสิ่งที่ซอฟต์แวร์พิจารณาแล้วว่าเป็น HEAD
Don Branson

2
สำหรับคำนิยามเชิงแนวคิดเพียงอย่างเดียวนี่ควรเป็นคำตอบที่ยอมรับได้
ata

22

HEADอ้างถึงการกระทำปัจจุบันที่สำเนาการทำงานของคุณชี้ไปที่นั่นคือการกระทำที่คุณได้ชำระเงิน จากเอกสารเคอร์เนล Linux Kernel อย่างเป็นทางการเกี่ยวกับการระบุการแก้ไข Git :

HEAD ชื่อการกระทำที่คุณยึดตามการเปลี่ยนแปลงในแผนผังการทำงาน

อย่างไรก็ตามโปรดทราบว่าใน Git รุ่น 1.8.4 ที่กำลังจะมา@นั้นยังสามารถใช้เป็นชวเลขได้HEADตามที่บันทึกไว้โดยผู้ร่วมสนับสนุน Git Junio ​​C Hamano ในบล็อก Git Blame ของเขา :

แทนที่จะพิมพ์ "HEAD" คุณสามารถพูดว่า "@" แทนเช่น "git log @"

กองมากเกินใช้VonCยังพบว่าบางข้อมูลที่น่าสนใจเกี่ยวกับเหตุผลที่@ได้รับเลือกเป็นชวเลขในคำตอบของเขาไปยังคำถามอื่น

นอกจากนี้ที่น่าสนใจในบางสภาพแวดล้อมไม่จำเป็นต้องใช้ประโยชน์HEADโดยเฉพาะในระบบปฏิบัติการที่ใช้ระบบไฟล์แบบไม่คำนึงถึงขนาดตัวพิมพ์โดยเฉพาะ Windows และ OS X


17

ลองดูที่การสร้างและเล่นกับสาขา

HEAD เป็นไฟล์ที่เนื้อหากำหนดตำแหน่งที่ตัวแปร HEAD อ้างถึง:

$ cat .git/HEAD
ref: refs/heads/master
$ cat .git/refs/heads/master
35ede5c916f88d8ba5a9dd6afd69fcaf773f70ed

ในพื้นที่เก็บข้อมูลนี้เนื้อหาของแฟ้มหัวหมายถึงไฟล์ที่สองชื่อrefs / หัว / Master ไฟล์refs / heads / masterมีแฮชของการคอมมิทล่าสุดบนกิ่งหลัก

ผลที่ได้คือจุดมุ่งหน้าไปยังสาขาต้นแบบที่กระทำจาก/ refs / หัว / Master .gitไฟล์

ป้อนคำอธิบายรูปภาพที่นี่


1
ระวัง: ลิงค์ gitguys.com ดูเหมือนจะชี้ไปที่โดเมนที่พัก
MKesper

14

ฉันต้องการรายละเอียดเล็ก ๆ น้อย ๆ ในคำตอบที่ได้รับการยอมรับของ Greg Hewgil อ้างอิงจากGit Pocket Guide

สาขา:

สาขาเองถูกกำหนดให้เป็นทุกจุดที่เข้าถึงได้ในกราฟการกระทำจากการกระทำที่มีชื่อ

HEAD: Ref ชนิดพิเศษ

หัวหน้าอ้างอิงพิเศษเป็นตัวกำหนดว่าคุณอยู่ในสาขาใด ...

refs

Git กำหนดการอ้างอิงสองประเภทหรือพอยน์เตอร์ที่มีชื่อซึ่งเรียกว่า“ refs”:

  • การอ้างอิงแบบง่ายซึ่งชี้ไปยัง ID วัตถุโดยตรง (โดยปกติจะเป็นการกระทำหรือแท็ก)
  • การอ้างอิงเชิงสัญลักษณ์ (หรือ symref) ซึ่งชี้ไปที่การอ้างอิงอื่น (อย่างง่ายหรือเชิงสัญลักษณ์)

ตามที่ Greg พูดถึง HEAD อาจอยู่ใน "สถานะแยกออก" ดังนั้น HEAD สามารถเป็นได้ทั้งการอ้างอิงแบบง่าย (สำหรับ HEAD ที่แยกออก) หรือ symref

ถ้า HEAD เป็นสัญลักษณ์อ้างอิงสำหรับสาขาที่มีอยู่คุณก็จะ "เปิด" สาขานั้น ถ้าในทางกลับกัน HEAD คือการอ้างอิงที่เรียบง่ายตั้งชื่อการกระทำโดยตรงโดย SHA-1 ID ของคุณคุณจะไม่ได้ "เปิด" สาขาใด ๆ แต่จะอยู่ในโหมด "ถอดหัว" ซึ่งจะเกิดขึ้นเมื่อคุณตรวจสอบก่อนหน้านี้ มุ่งมั่นที่จะตรวจสอบ


ขอบคุณ @ ไมค์! นี่เป็นคำตอบแรกที่อธิบายสิ่งที่เกิดขึ้นเมื่อคุณตรวจสอบข้อผูกพันก่อนหน้านี้ เมื่อมองดูหนังสือบนเว็บไซต์คอมไพล์ฉันรู้สึกว่า "หัวที่ถอดออกได้" เป็นสถานะทางพยาธิวิทยาที่คุณเพิ่งเข้าไปหากคุณทำสิ่งที่ไม่ดี แต่การตรวจสอบการกระทำก่อนหน้านี้ไม่ใช่เรื่องแปลกที่จะทำและเมื่อคุณทำเช่นนั้น HEAD ไม่ใช่ "ส่วนปลายของสาขาปัจจุบัน" ดังนั้นนี่เป็นครั้งแรกที่ฉันรู้สึกว่าฉันเข้าใจจริงๆ
Nat Kuhn

7

ฉันคิดว่า 'HEAD' เป็นสิ่งที่ต้องทำในปัจจุบัน กล่าวอีกนัยหนึ่ง 'หัว' ชี้ไปที่การกระทำที่มีการตรวจสอบในปัจจุบัน

หากคุณเพิ่งโคลนและไม่ได้เช็คเอาท์ฉันไม่รู้ว่ามันชี้ไปยังอะไรอาจเป็นตำแหน่งที่ไม่ถูกต้อง


ใช่การอ้างอิงพิเศษHEADคือสิ่งใดก็ตามที่คุณส่งออกไปแล้ว ดูคู่มือสำหรับรายละเอียด (ย่อหน้าที่เกี่ยวข้องตามรูป 3.4)
Calrion

1
หากคุณโคลนที่เก็บ git จะเริ่มต้นตรวจสอบmasterสาขา - ดังนั้น HEAD จะชี้ไปที่มาสเตอร์
sleske

1
@sleske หากคุณโคลนที่เก็บไม่มีตัวเลือกพิเศษ git จะตรวจสอบหัวหน้าระยะไกล เป็นปกติmasterแต่ไม่เสมอไป ดูremote set-head
เดอโนโว

ความคิดเห็นก่อนหน้าของฉันนั้นถูกต้องยกเว้นการอ้างอิงถึงremote set-headซึ่งมีผลกับสาขาเริ่มต้นในเครื่องเท่านั้นและจะไม่เปลี่ยนค่าเริ่มต้นที่เซิร์ฟเวอร์
De Novo

5

มุ่งหน้าไปที่ส่วนปลายของสาขาที่เช็คเอาท์ในปัจจุบัน

ป้อนคำอธิบายรูปภาพที่นี่

ในที่เก็บของคุณมีโฟลเดอร์. git เปิดไฟล์ในตำแหน่งนี้: .git \ refs \ heads รหัส (SHA-1 กัญชา) ในแฟ้มที่ (ต้นแบบในกรณีส่วนใหญ่) git logจะเป็นล่าสุดกระทำเช่นหนึ่งที่เห็นในผลลัพธ์ของคำสั่งที่ ข้อมูลเพิ่มเติมเกี่ยวกับโฟลเดอร์. git: http://gitready.com/advanced/2009/03/23/whats-inside-your-git-directory.html


1
มันเป็นความเข้าใจผิดทั่วไปที่ส่วนปลายของสาขาปัจจุบันชี้ไปที่การกระทำล่าสุด โดยทั่วไปแล้วมันเป็นความจริง แต่ก็ไม่ใช่เรื่องแปลกgit reset HEAD^และจากนั้นคอมมิชชันล่าสุด (ปลายเดิม) จะไม่ถูกชี้ไปที่ปลายกิ่งอีกต่อไป
LarsH

4

วิธีที่ยอดเยี่ยมในการขับรถกลับบ้านจุดที่ทำไว้ในคำตอบที่ถูกต้องคือการวิ่ง git reflog HEADคุณจะได้รับประวัติศาสตร์ของทุกสถานที่ที่หัวหน้าได้ชี้ไป


4

หลังจากอ่านคำตอบก่อนหน้าทั้งหมดแล้วฉันยังต้องการความชัดเจนมากขึ้น บล็อกนี้ที่เว็บไซต์ git อย่างเป็นทางการhttp://git-scm.com/blogให้สิ่งที่ฉันต้องการ:

HEAD: ตัวชี้ไปยังการยอมรับสแน็ปช็อต, พาเรนต์ถัดไป

HEAD in Git เป็นตัวชี้ไปยังการอ้างอิงสาขาปัจจุบันซึ่งจะเป็นตัวชี้ไปยังการส่งข้อมูลล่าสุดที่คุณทำหรือการส่งข้อมูลครั้งล่าสุดที่มีการตรวจสอบในไดเรกทอรีการทำงานของคุณ นั่นก็หมายความว่ามันจะเป็นหน้าที่หลักของการกระทำครั้งต่อไปที่คุณทำ โดยทั่วไปจะคิดได้ง่ายที่สุดเนื่องจาก HEAD เป็นภาพรวมของการคอมมิทครั้งล่าสุดของคุณ


1
HEAD: คอมมิทคอมมิชชันล่าสุด, พาเรนต์ถัดไปไม่ถูกต้อง HEADไม่ใช่ความมุ่งมั่น; มันชี้ไปที่หนึ่ง
jub0bs

ไม่จำเป็นต้องประชด ก่อนการแก้ไขของคุณถึงแม้ว่าใบเสนอราคานั้นถูกต้อง แต่ตัวอักษรตัวใหญ่ตัวใหญ่นั้นเรียบง่ายและทำให้เข้าใจผิดเล็กน้อย ตอนนี้มันจะดีกว่า
jub0bs

1
หากคุณอ่านบรรทัดถัดไป: HEAD in Git เป็นตัวชี้ไปยังการอ้างอิงสาขาปัจจุบันซึ่งจะเปลี่ยนเป็นตัวชี้ไปยังการส่งข้อมูลล่าสุดที่คุณทำหรือการส่งข้อมูลครั้งล่าสุดที่ถูกตรวจสอบในไดเรกทอรีการทำงานของคุณ - โปรดทราบการใช้คำว่า "ตัวชี้" ที่นั่น
user3751385

ในขณะที่คำอธิบาย "สแน็ปช็อตสแนปช็อตครั้งสุดท้าย" จะให้ความรู้สึกที่เป็นนามธรรมว่าควรใช้ HEAD อย่างไร แต่ก็ไม่ถูกต้อง หากฉันทำการส่งมอบให้สลับไปยังสาขาอื่น HEAD ไม่ได้ชี้ไปที่สแน็ปช็อตการส่งล่าสุดอีกต่อไป มันชี้ไปที่สแนปช็อตการกระทำล่าสุดในสาขาที่ฉันเพิ่งเปลี่ยนไป ถ้าฉันcheckout HEAD^ตอนนี้ HEAD ไม่ได้ชี้ไปที่การสแนปชอตครั้งสุดท้ายในทุกสาขา
LarsH

"ผู้ปกครองของการกระทำครั้งต่อไปของคุณ (ถ้าคุณต้องทำตอนนี้)" มีความแม่นยำมากขึ้น แต่มีการดำเนินการอื่น ๆ ในคอมไพล์นอกเหนือจากการกระทำที่ได้รับผลกระทบจากหัวหน้า จริงๆในที่สุดหัวเป็นหัวหน้าและธรรมชาติของมันจะถูกกำหนดโดยวิธีการที่จะส่งผลกระทบต่อคำสั่งที่ชอบcommit, merge, rebase, logฯลฯ แต่แนวคิดอาจจะ "(ชี้ไป) ตำแหน่งปัจจุบัน" เป็นบทสรุปที่ดี
LarsH

3

รู้สึกเหมือนHEADเป็นเพียงแท็กสำหรับการส่งมอบครั้งล่าสุดที่คุณเช็คเอาต์

นี่อาจเป็นเคล็ดลับของสาขาเฉพาะ (เช่น "ต้นแบบ") หรือบางส่วนอยู่ระหว่างการกระทำของสาขา ("ถอดหัว")


1

นอกเหนือจากคำจำกัดความทั้งหมดสิ่งที่ติดอยู่ในใจของฉันคือเมื่อคุณทำการคอมมิชชัน GIT จะสร้างออบเจกต์การคอมมิตภายในที่เก็บ วัตถุ Commit ควรมีพาเรนต์ (หรือหลายพาเรนต์ถ้าเป็นการรวมคอมมิต) ตอนนี้ git รู้จักผู้ปกครองของการกระทำในปัจจุบันอย่างไร ดังนั้น HEAD เป็นตัวชี้ไปยัง (การอ้างอิง) การกระทำล่าสุดซึ่งจะกลายเป็น parent ของการกระทำปัจจุบัน


0

สองสิ่งนี้อาจทำให้คุณสับสน:

ศีรษะ

ชี้ไปที่การอ้างอิงที่ระบุชื่อสาขาที่ส่งล่าสุด ยกเว้นว่าคุณใช้การอ้างอิงแพ็คเกจมักจะเก็บหัวไว้ใน $ GIT_DIR / refs / heads /

ศีรษะ

สาขาปัจจุบันหรือต้นไม้ทำงานของคุณมักจะถูกสร้างขึ้นจากต้นไม้ HEAD ชี้ไปที่ HEAD จะต้องชี้ไปที่ศีรษะยกเว้นว่าคุณกำลังใช้ HEAD ที่ถอดออกมา


0

ลองดูที่http://git-scm.com/book/en/Git-Branching-What-a-Branch-Is

รูปที่ 3-5 ไฟล์ HEAD ชี้ไปที่สาขาที่คุณอยู่


4
โดยทั่วไปลิงก์เฉพาะคำตอบจะขมวดคิ้วใน Stackoverflow โปรดใส่ข้อมูลที่เกี่ยวข้องในคำตอบของคุณ
HaskellElephant

2
สิ่งนี้ไม่ถูกต้องทั้งหมด HEADหมายถึงอะไรขึ้นอยู่กับว่าคุณกำลังพูดถึง repo เปล่าหรือเปล่า ในบริบทของธุรกรรมซื้อคืนที่ไม่ได้เปลือยเปล่าหมายถึงการกระทำที่ได้ชำระเงินแล้วในปัจจุบันซึ่งไม่จำเป็นต้องมีสาขาที่แนบมา (เช่นเมื่ออยู่ในHEADสถานะเดี่ยว)

0

สาขาเป็นจริงชี้ที่ถือกระทำ ID เช่น17a5 HEADเป็นตัวชี้ไปยังสาขาที่ผู้ใช้กำลังทำงานอยู่

HEADมี filw อ้างอิงซึ่งมีลักษณะเช่นนี้:

Ref:

คุณสามารถตรวจสอบไฟล์เหล่านี้ได้ด้วยการเข้าถึง .git/HEAD .git/refsที่อยู่ในพื้นที่เก็บข้อมูลที่คุณกำลังทำงาน


0

Gitเป็นเรื่องของความมุ่งมั่น
และHeadชี้ไปที่การกระทำที่คุณตรวจสอบในปัจจุบัน

$ git cat-file -t HEAD
commit

เมื่อใดก็ตามที่คุณชำระเงินสาขา HEAD จะชี้ไปที่การกระทำล่าสุดในสาขานั้น เนื้อหาของ HEAD สามารถตรวจสอบได้ดังนี้ (สำหรับสาขาหลัก):

$ cat .git/refs/heads/master
  b089141cc8a7d89d606b2f7c15bfdc48640a8e25

-5

ตามแนวคิดหัวคือการแก้ไขล่าสุดในสาขา หากคุณมีมากกว่าหนึ่งหัวต่อสาขาที่มีชื่อคุณอาจสร้างมันขึ้นมาเมื่อทำหน้าที่ในท้องถิ่นโดยไม่ต้องรวมกันสร้างสาขาที่ไม่มีชื่อได้อย่างมีประสิทธิภาพ

เพื่อให้มีพื้นที่เก็บข้อมูลที่ "สะอาด" คุณควรมีหนึ่งหัวต่อสาขาที่มีชื่อและรวมกับสาขาที่มีชื่อทุกครั้งหลังจากที่คุณทำงานในพื้นที่

นี่เป็นความจริงสำหรับMercurialด้วย


4
นี่เป็นความจริงสำหรับ Mercurial แต่ไม่ใช่สำหรับ Git
Reinstate Monica - notmaynard
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.