โปรดทราบก่อนว่าคำถามของคุณแสดงความเข้าใจผิดเล็กน้อย Origin / HEAD แสดงถึงสาขาเริ่มต้นบนรีโมตนั่นคือ HEAD ที่อยู่ในที่เก็บข้อมูลรีโมตนั้นที่คุณเรียกใช้ Origin เมื่อคุณสลับสาขาใน repo ของคุณคุณจะไม่ส่งผลกระทบต่อสิ่งนั้น เช่นเดียวกับสาขาระยะไกล คุณอาจมีmasterและorigin/masterใน repo ของคุณซึ่งorigin/masterเป็นตัวแทนของmasterสาขาในพื้นที่เก็บข้อมูลระยะไกล
HEAD ของ Origin จะเปลี่ยนเฉพาะเมื่อคุณหรือคนอื่นเปลี่ยนในที่เก็บระยะไกลซึ่งโดยทั่วไปไม่ควรเกิดขึ้น - คุณต้องการให้ repo สาธารณะสาขาเริ่มต้นคงที่ในสาขาที่มั่นคง (อาจเป็น Master) origin / HEAD คือการอ้างอิงแบบโลคัลที่แสดงสำเนาโลคัลของ HEAD ในที่เก็บแบบรีโมต (ชื่อเต็มของมันคือการอ้างอิง / รีโมท / กำเนิด / หัว)
ฉันคิดว่าคำตอบข้างต้นเป็นคำตอบที่คุณต้องการทราบจริง ๆ แต่เพื่อไปข้างหน้าและตอบคำถามที่คุณถามอย่างชัดเจนว่า ... Origin / HEAD ถูกตั้งค่าโดยอัตโนมัติเมื่อคุณโคลนที่เก็บข้อมูลและนั่นเป็นเรื่องเกี่ยวกับมัน เป็นเรื่องแปลกที่มันไม่ได้ถูกตั้งค่าโดยคำสั่งเช่นgit remote update- ฉันเชื่อว่าวิธีเดียวที่จะเปลี่ยนคือถ้าคุณเปลี่ยนมันด้วยตนเอง (โดยการเปลี่ยนแปลงฉันหมายถึงชี้ไปที่สาขาที่แตกต่างกันเห็นได้ชัดว่ากระทำมันชี้ไปที่การเปลี่ยนแปลงหากสาขานั้นมีการเปลี่ยนแปลงซึ่งอาจเกิดขึ้นในการดึง / ดึง / การปรับปรุงระยะไกล)
แก้ไข : ปัญหาที่กล่าวถึงด้านล่างได้รับการแก้ไขในGit 1.8.4.3 ; ดูอัปเดตนี้
มีข้อแม้เล็ก ๆ อยู่ HEAD คือการอ้างอิงเชิงสัญลักษณ์ชี้ไปที่สาขาแทนที่จะส่งไปยังการคอมมิตโดยตรง แต่โปรโตคอลการถ่ายโอนระยะไกล git เท่านั้นที่รายงานการกระทำเพื่อการอ้างอิง ดังนั้น Git จึงรู้ SHA1 ของการกระทำที่ชี้ไปที่ HEAD และผู้อ้างอิงอื่น ๆ ทั้งหมด จากนั้นจะต้องอนุมานค่าของ HEAD โดยการค้นหาสาขาที่ชี้ไปที่การกระทำเดียวกัน นี่หมายความว่าหากมีสองสาขาเกิดขึ้นที่จุดนั้นมันจะคลุมเครือ (ฉันเชื่อว่ามันเลือกอาจารย์ถ้าเป็นไปได้จากนั้นกลับไปที่ตัวอักษรแรก) คุณจะเห็นรายงานนี้ในผลลัพธ์ของgit remote show origin:
$ git remote show origin
* remote origin
Fetch URL: ...
Push URL: ...
HEAD branch (remote HEAD is ambiguous, may be one of the following):
foo
master
ผิดปกติแม้ว่าความคิดของหัวพิมพ์ด้วยวิธีนี้จะเปลี่ยนถ้าสิ่งที่เปลี่ยนแปลงในระยะไกล (เช่นถ้า foo จะถูกลบออก) refs/remotes/origin/HEADก็ไม่ได้ปรับปรุงจริง สิ่งนี้สามารถนำไปสู่สถานการณ์ที่แปลกจริง ๆ บอกว่าในตัวอย่างข้างต้นกำเนิด / HEAD จริงชี้ไปที่ foo และสาขา foo ของต้นกำเนิดถูกลบออกแล้ว จากนั้นเราสามารถทำสิ่งนี้:
$ git remote show origin
...
HEAD branch: master
$ git symbolic-ref refs/remotes/origin/HEAD
refs/remotes/origin/foo
$ git remote update --prune origin
Fetching origin
x [deleted] (none) -> origin/foo
(refs/remotes/origin/HEAD has become dangling)
ดังนั้นแม้ว่าการแสดงจากระยะไกลจะรู้ว่า HEAD นั้นเป็นผู้เชี่ยวชาญ แต่ก็ไม่ได้อัพเดทอะไรเลย สาขา fale เก่าถูกตัดอย่างถูกต้องและ HEAD จะกลายเป็นห้อย (ชี้ไปที่สาขาที่ไม่มีอยู่) และก็ยังไม่อัปเดตให้ชี้ไปที่ต้นแบบ หากคุณต้องการแก้ไขปัญหานี้ให้ใช้git remote set-head origin -aซึ่งกำหนดหัว HEAD ของต้นกำเนิดโดยอัตโนมัติจากนั้นตั้งค่า Origin / HEAD ให้ชี้ไปที่สาขาระยะไกลที่เหมาะสม
refs/origin/HEADโปรดทราบว่าคำถามนี้เป็นเรื่องเกี่ยวกับการอ้างอิงสัญลักษณ์ท้องถิ่นบนรีโมทเช่น มันไม่ได้เกี่ยวกับวิธีการHEADตั้งค่าการอ้างอิงสัญลักษณ์ของที่เก็บ