แนวคิด git ของ HEAD, master, origin คืออะไร?


197

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

คำตอบ:


232

ผมขอแนะนำหนังสือ"โปร Git" โดยสกอตต์ Chacon ใช้เวลาและอ่านมันจริงๆในขณะที่สำรวจ repo คอมไพล์จริงตามที่คุณทำ

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

ในกรณีที่การกระทำที่HEADอ้างถึงไม่ได้เป็นปลายของสาขาใด ๆ นี้เรียกว่า "หัวใหญ่"

หลัก : ชื่อของสาขาเริ่มต้นที่ git สร้างให้คุณเมื่อสร้าง repo ครั้งแรก ในกรณีส่วนใหญ่ "หลัก" หมายถึง "สาขาหลัก" ร้านค้าส่วนใหญ่มีให้ทุกคนผลักดันให้เป็นผู้เชี่ยวชาญและปริญญาโทถือเป็นมุมมองที่ชัดเจนของร้านค้าปลีก แต่มันก็เป็นเรื่องธรรมดาที่จะปล่อยกิ่งก้านสาขาออกจากตำแหน่งเพื่อปล่อย Repo ในพื้นที่ของคุณมีสาขาหลักของตนเองซึ่งตามหลัง Master Repo ทางไกลเกือบตลอดเวลา

ที่มา : ชื่อเริ่มต้นที่ git มอบให้กับ repo ระยะไกลหลักของคุณ กล่องของคุณมี repo ของตัวเองและคุณมักจะผลักดันไปยัง repo ระยะไกลที่คุณและเพื่อนร่วมงานของคุณผลักดันไป รีโมตรีโมตนั้นเกือบจะเรียกว่า Origin เสมอ แต่มันไม่จำเป็นต้องเป็น

HEADเป็นความคิดอย่างเป็นทางการในคอมไพล์ HEADมีความหมายที่ดีเสมอ masterและoriginชื่อสามัญมักจะใช้ในคอมไพล์ แต่ไม่จำเป็นต้องเป็น


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

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

ฉันเพิ่งโคลนในไดเรกทอรีขนานเพื่อเปรียบเทียบไดเรกทอรีการทำงานของฉันกับปลาย repo ระยะไกล นี่เป็นคำตอบที่ดีสำหรับคอมไพล์ทั้งหมด

@JingHe คุณอ่านหนังสือทั้งเล่มเหรอ? คุ้มหรือไม่ ฉันหมายความว่าเรากำลังพูดถึงเลว 500 + หน้าอ่านที่ดูเหมือนเล็ก ๆ น้อย ๆ มากเกินไปที่จะฉัน ...
แม็กซ์

1
ในการตรวจสอบว่าฉันเข้าใจตรรกะฉันสามารถโทรสาขาในระยะไกลเป็น featureA และเมื่อฉันกดไปที่สาขานั้นฉันพิมพ์ "git push origin featureA" ฉันสามารถดึงสิ่งเดียวกันจากระยะไกลได้เช่นกันโดยพูดว่า "คุณสมบัติดึงต้นกำเนิด Git A" ทำการเปลี่ยนแปลง และหัวเป็นเพียงการอ้างอิงถึงสำเนาในเครื่อง @ OK999 ฉันเชื่อว่า HEAD กำลังชี้ไปที่สาขาใดที่คุณเช็คเอาท์ในขณะนี้ในท้องถิ่น หากกระทำได้ทำใน branchA แต่ขณะนี้คุณอยู่ใน branchB, HEAD จะชี้ไปที่ branchB คุณต้องย้าย HEAD ไปที่ branchA ก่อนที่จะทำการคอมมิท
TLee

43

HEADไม่ใช่การแก้ไขล่าสุด แต่เป็นการแก้ไขในปัจจุบัน โดยปกติจะเป็นการแก้ไขล่าสุดของสาขาปัจจุบัน แต่ไม่จำเป็นต้องเป็น

master เป็นชื่อทั่วไปที่ให้กับสาขาหลัก แต่อาจเรียกได้ว่าเป็นอย่างอื่น (หรืออาจไม่มีสาขาหลัก)

originเป็นชื่อทั่วไปที่ให้กับรีโมตหลัก remote เป็นที่เก็บอื่นที่คุณสามารถดึงและดันไปที่ โดยปกติจะอยู่ในเซิร์ฟเวอร์บางตัวเช่น Github


1
คุณสามารถยกตัวอย่างเมื่อหัวเป็นปัจจุบัน แต่ไม่ล่าสุด? ฉันไม่เคยเห็นแบบนั้นมาก่อน หรือคุณหมายถึงอาจจะไม่ใช่สาขาล่าสุดเพราะสาขาของคุณอยู่หลังสาขาระยะไกลที่ติดตามอยู่
Matt Greer

12
@MattGreer: หากคุณตรวจสอบบางอย่างที่เก่ากว่า (เช่นแท็กเช่นgit checkout v1.1) ดังนั้น HEAD ของคุณจะเปลี่ยนไปเป็นการกระทำของแท็กนั้น อาจไม่ใช่การกระทำล่าสุด
เกร็กฮิวกิลล์

8

ขณะนี้ไม่ได้ตอบคำถามโดยตรงที่มีหนังสือที่ดีสามารถใช้ได้ฟรีที่จะช่วยให้คุณได้เรียนรู้พื้นฐานที่เรียกว่า ProGit หากคุณต้องการรุ่นตายไม้คอลเลกชันของบิตที่คุณสามารถซื้อได้จากอเมซอน


9
คำถามไม่ได้ขอหนังสือ! มันยังไม่ชัดเจนสำหรับฉันทำไมฉันต้องใช้หนังสือสำหรับคอมไพล์เมื่อฉันไม่ต้องการใช้ C ++

13
คุณคิดว่าคุณไม่ต้องการหนังสือสำหรับ C ++;)
Piotr Perak
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.