การตรวจสอบแท็ก Git นำไปสู่ ​​"สถานะ HEAD ที่แยกออก"


166

ฉันกำลังพัฒนาสคริปต์การปรับใช้สำหรับโครงการคอมไพล์ของฉันและฉันเพิ่งเริ่มใช้แท็ก ฉันได้เพิ่มแท็กใหม่ชื่อv2.0:

git tag -a v2.0 -m "Launching version 2.0"

และฉันได้ผลักแท็กนี้ไปยังที่เก็บระยะไกล

git push --tags

เมื่อฉันพยายามเรียกใช้สคริปต์การปรับใช้และตรวจสอบv2.0แท็กที่ฉันได้รับข้อความนี้:

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

เป็นเรื่องปกติหรือไม่ ที่เก็บอยู่ในบริเวณขอบรกเพราะถ้าฉัน:

git branch

ฉันได้ผลลัพธ์นี้:

* (no branch)
  master

ขออภัยถ้ามันชัดเจน แต่ฉันไม่สามารถเข้าใจได้


เมื่อคุณพูดว่า "รันสคริปต์การปรับใช้และตรวจสอบ v2.0" โค้ดของคุณมีลักษณะอย่างไร "git checkout v2.0"? ฉันพยายามที่จะปรับปรุงสคริปต์การวางจำหน่ายของฉันและเมื่อฉันเรียกใช้ "git checkout v2.0" จากเครื่องที่ใช้งานจริงฉันได้รับ "error: pathspec 'v2.0' ไม่ตรงกับไฟล์ใด ๆ ที่ git รู้จัก" แม้ว่าฉันจะใช้งานแล้ว "git push origin --tags" บนเครื่องท้องถิ่นของฉันก่อนที่จะทำการ "git checkout v2.0" ในการผลิต ฉันได้ลองใช้งาน "git pull --tags" และ "git fetch --tags" ในการผลิตก่อนที่จะเรียกว่า "git checkout v2.0" และนั่นก็ไม่ทำงานเช่นกัน ... ฉันยังคงได้รับ ความผิดพลาด ความคิดใด ๆ
John Erck

3
ฉันกำลังจะลบความคิดเห็นข้างต้น แต่เมื่อคิดว่าการติดตามแล้วอาจช่วยคนอื่นได้ ฉันได้รับข้อผิดพลาดเนื่องจากฉันมี TYPO ในชื่อแท็กของฉันเมื่อฉันทำงาน "git checkout v2.0" อย่างไรก็ตามข้อผิดพลาดที่เกี่ยวข้องกับการพิมพ์ผิดเป็นข้อผิดพลาดเดียวกันแน่นอนคุณจะได้รับถ้าคุณเรียกใช้ "git checkout v2.0" โดยไม่ต้องพิมพ์ผิดก่อนที่จะทำงาน "git fetch --tags" ดังนั้นในที่สุดปัญหาของฉันได้รับการแก้ไขโดยการเรียกใช้ "git fetch --tags" ก่อนหน้านี้เพื่อทำงาน "git checkout v2.0" โดยไม่ต้องพิมพ์ผิด วุ้ย
John Erck

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

คำตอบ:


429

โอเคข้อตกลงสองสามข้อแรกที่เล็กน้อยเกินจริงเล็กน้อย

ในgitการtag(เช่นเดียวกับสิ่งอื่น ๆ อีกมากมาย) เป็นสิ่งที่เรียกว่าtreeish มันเป็นวิธีการอ้างอิงถึงจุดในประวัติศาสตร์ของโครงการ Treeish สามารถเป็นแท็กการกระทำตัวระบุวันที่ตัวระบุลำดับหรือสิ่งอื่น ๆ อีกมากมาย

ตอนนี้ a branchก็เหมือนกับแท็ก แต่สามารถเคลื่อนย้ายได้ เมื่อคุณ "เปิด" สาขาและทำการกระทำสาขาจะถูกย้ายไปที่การส่งข้อมูลใหม่ที่คุณทำเพื่อระบุว่าเป็นตำแหน่งปัจจุบัน

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

ตอนนี้คำอธิบาย

เมื่อคุณทำคุณจะเปลี่ยนเป็นกระทำที่ไม่ได้ชี้ไปด้วยgit checkout v2.0 อยู่ในขณะนี้ "แฝด" และไม่ชี้ไปที่สาขา หากคุณตัดสินใจที่จะส่งมอบทันที (ตามที่คุณต้องการ) จะไม่มีตัวชี้สาขาที่จะอัปเดตเพื่อติดตามการกระทำนี้ การเปลี่ยนกลับไปใช้การคอมมิชชันอื่นจะทำให้คุณสูญเสียการคอมมิชชันใหม่ที่คุณทำไป นั่นคือสิ่งที่ข้อความกำลังบอกคุณbranchHEAD

git checkout -b v2.0-fixes v2.0โดยปกติแล้วสิ่งที่คุณสามารถทำได้คือการพูด สิ่งนี้จะสร้างตัวชี้สาขาใหม่ที่คอมมิชชันที่ชี้ไปโดย treeish v2.0(แท็กในกรณีนี้) จากนั้นเลื่อนของคุณHEADไปยังจุดนั้น ตอนนี้ถ้าคุณทำคอมมิชชันมันจะเป็นไปได้ที่จะติดตามพวกเขา (ใช้v2.0-fixesสาขา) และคุณสามารถทำงานได้ตามปกติ ไม่มีอะไร "ผิด" กับสิ่งที่คุณทำโดยเฉพาะอย่างยิ่งถ้าคุณแค่ต้องการดูv2.0รหัส อย่างไรก็ตามหากคุณต้องการทำการเปลี่ยนแปลงใด ๆ ที่นั่นที่คุณต้องการติดตามคุณจะต้องมีสาขา

คุณควรใช้เวลาทำความเข้าใจกับแบบจำลองของ DAG ทั้งหมด มันง่ายอย่างน่าประหลาดใจและทำให้คำสั่งทั้งหมดค่อนข้างชัดเจน


ตกลงขอบคุณฉันไม่จำเป็นต้องทำการเปลี่ยนแปลงใด ๆ ในรหัสดังนั้นฉันคิดว่ามันโอเค ฉันไม่จำเป็นต้องสร้างสาขา ขอบคุณมาก!
Khriz

1
ฉันหลงทางเป็นครั้งแรกที่ฉันดูคำตอบนี้ แต่หลังจากฉันอ่านเอกสารการแยก Git: http://git-scm.com/book/en/Git-Branching-What-a-Branch-Isมันชัดเจนขึ้นมาก .
ทำเครื่องหมายกั้น

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

การกระทำที่ไม่ได้อ้างถึงสามารถสูญหายได้โดยการดำเนินการรวบรวมขยะ
Noufal Ibrahim

1
URL ไม่ถูกต้องเนื่องจากพวกเขาเปลี่ยนเค้าโครงของหน้า
jcubic

12

ใช่มันเป็นเรื่องปกติ นั่นเป็นเพราะคุณชำระเงินค่าคอมมิชชันเดียวนั่นไม่มีส่วนหัว โดยเฉพาะอย่างยิ่งมัน (ไม่ช้าก็เร็ว) ไม่ได้เป็นหัวหน้าสาขาใด ๆ

แต่โดยปกติจะไม่มีปัญหากับสถานะนั้น คุณอาจสร้างสาขาใหม่จากแท็กหากสิ่งนี้ทำให้คุณรู้สึกปลอดภัยยิ่งขึ้น :)


1
ตกลงฉันจะเก็บไว้อย่างนั้น ... ความปลอดภัยเกินจริงไปแล้ว;)
Khriz

ในขณะที่คุณแสดงความคิดเห็นในคำตอบ Noufals (ที่ดีกว่าฉันต้องพูด;)): ตราบใดที่คุณไม่เปลี่ยนแปลงอะไรไม่มีอะไรที่คุณต้องกังวล อย่างไรก็ตามหากคุณคิดว่าคุณสามารถเปลี่ยนบางสิ่งได้คุณสามารถสร้างสาขาได้เนื่องจากมีราคาถูกในคอมไพล์และคุณสามารถลบได้ (และสร้างใหม่ในภายหลังและต่อ ๆ ไป)
KingCrunch
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.