ทำไม Git repo ของฉันถึงเข้าสู่ HEAD ที่แยกออกมา


387

ฉันลงเอยด้วยหัวหน้าเดี่ยววันนี้ปัญหาเดียวกับที่อธิบายไว้ใน: git push บอกทุกอย่างที่ทันสมัยแม้ว่าฉันจะมีการเปลี่ยนแปลงในท้องถิ่น

เท่าที่ฉันรู้ฉันไม่ได้ทำอะไรผิดไปจากปกติเพียงแค่คอมมิชชันและผลักดันจาก repo ท้องถิ่นของฉัน

ดังนั้นฉันจะจบลงด้วยการได้detached HEADอย่างไร


18
การตรวจสอบสาขาระยะไกลนั้นเป็นวิธีที่พบได้บ่อยที่สุดในการทำสิ่งนี้โดยไม่ตั้งใจ อีกวิธีหนึ่งที่พบได้บ่อยคือการตรวจสอบbranch-name@{n}ตำแหน่งก่อนหน้า n branch-nameของ git checkout <rev>แต่ไม่ว่าอะไรจะเกิดขึ้นในบางจุดมีคงจะรับ หากนั่นไม่ส่งเสียงกริ่งคุณอาจทำในสิ่งที่จะกล่าวถึง - ลองทำgit checkout <file>และจัดการเพื่อระบุการแก้ไขโดยไม่ตั้งใจ
Cascabel

3
สำหรับการยกเลิกสถานะ HEAD ที่แยกออกมาดูที่การแก้ไข Git ที่ถอดออกได้ .

repo ของฉันสิ้นสุดในสถานะนี้เมื่อพบข้อขัดแย้งระหว่างการรีบูต โชคดีที่ Git บอกฉันว่าต้องทำอย่างไรเมื่อฉันวิ่งgit status:all conflicts fixed: run "git rebase --continue"
พอล

2
นอกจากนี้ยังเกิดขึ้นถ้าคุณตั้งใจพิมพ์git checkout remotes/origin/my-branchแทนหรือgit checkout my-branch git checkout origin/my-branch
อดัมLibuša

@adam Libusa ขอบคุณที่ได้ผลกับฉัน อะไรคือความแตกต่างระหว่างการชำระเงิน git remotes / origin / my-branch และ git checkout my-branch มันไม่เหมือนกัน แต่สิ่งที่คุณพูดได้ผลกับฉัน ด้วยความอยากรู้ฉันขอ
karunakar bhogyari

คำตอบ:


281

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

ดูการกระทำด้วย HEAD เดี่ยว

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

ข้อความแสดงแทน

ตัวอย่างเช่นหากคุณชำระเงินที่ "สาขาระยะไกล" โดยไม่ต้องติดตามมันก่อนคุณสามารถจบลงด้วยการถอด HEAD ออก

ดูgit: สับเปลี่ยนสาขาโดยไม่ต้องถอดหัว


ด้วย Git 2.23 (สิงหาคม 2019) คุณไม่จำเป็นต้องใช้คำสั่งที่สับสนgit checkoutอีกต่อไป

git switch ยังสามารถชำระเงินสาขาและรับส่วนหัวยกเว้น:

  • มันมี--detachตัวเลือกที่ชัดเจน

หากต้องการตรวจสอบการยืนยันHEAD~3การตรวจสอบหรือทดสอบชั่วคราวโดยไม่ต้องสร้างสาขาใหม่:

git switch --detach HEAD~3
HEAD is now at 9fc9555312 Merge branch 'cc/shared-index-permbits'
  • ไม่สามารถแยกออกโดยไม่ได้ตั้งใจสาขาการติดตามระยะไกล

ดู:

C:\Users\vonc\arepo>git checkout origin/master
Note: switching to 'origin/master'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by switching back to a branch.

เมื่อเทียบกับ ใช้git switchคำสั่งใหม่:

C:\Users\vonc\arepo>git switch origin/master
fatal: a branch is expected, got remote branch 'origin/master'

หากคุณต้องการสร้างสาขาในพื้นที่ใหม่ติดตามสาขาระยะไกล:

git switch <branch> 

หาก<branch>ไม่พบ แต่มีสาขาการติดตามอยู่ในรีโมทหนึ่งตัว (เรียกว่า<remote>) ที่มีชื่อตรงกันให้ถือว่าเทียบเท่า

git switch -c <branch> --track <remote>/<branch>

ไม่มีข้อผิดพลาด!
ไม่มีหัวหน้าเดี่ยวที่ไม่ต้องการอีกต่อไป!


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

ในคำแนะนำแบบภาพนี้มีคำอธิบายนี้: git commit files creates a new commit containing the contents of the latest commit, plus a snapshot of files taken from the working directory. Additionally, files are copied to the stage."ไฟล์ถูกคัดลอกไปยังสเตจ" หมายความว่าอย่างไร? ฉันคิดว่าไฟล์ถูกคอมมิทซึ่งหมายความว่าสเตจถูกลบ?
สูงสุด

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

8
"You can think of this as an anonymous branch":) ฉันชอบอุปมา
Adrien Be


117

ฉันทำซ้ำตอนนี้โดยบังเอิญ:

  1. รายการสาขาระยะไกล

    git branch -r
          origin/Feature/f1234
          origin/master
    
  2. ฉันต้องการชำระเงินในพื้นที่ดังนั้นฉันจึงตัดแปะ:

    git checkout origin/Feature/f1234
    
  3. โอมเพี้ยง! สถานะ HEAD ที่แยกออก

    You are in 'detached HEAD' state. [...])
    

โซลูชัน # 1:

อย่ารวมorigin/ที่ด้านหน้าของข้อมูลจำเพาะสาขาของฉันเมื่อตรวจสอบ:

git checkout Feature/f1234

โซลูชัน # 2:

เพิ่ม-bพารามิเตอร์ที่สร้างสาขาท้องถิ่นจากระยะไกล

git checkout -b origin/Feature/f1234 หรือ

git checkout -b Feature/f1234 มันจะถอยกลับไปที่จุดเริ่มต้นโดยอัตโนมัติ


14
นี่เป็นคำตอบที่ดีมาก แต่ไม่สามารถอธิบายได้ว่าทำไมคุณถึงเข้าสู่สถานะผู้นำเดี่ยว
Goose

5
ฉันเห็นด้วย แต่มันมีวิธีแก้ปัญหาที่ฉันมองหา ขอบคุณ !!
Kilmazing

ผมเห็นในนี้คำตอบอื่น ๆที่git checkout -b Feature/f1234<=> และgit branch Feature/f1234 git checkout Feature/f1234
Armfoot

1
โดยค่าเริ่มต้นมันจะมีจุดเริ่มต้นดังนั้นเมื่อคุณให้origin/branchnameมัน origin/origin/branchnameจะบอกว่าชื่อแรกคือชื่อระยะไกลที่คุณใช้-bถ้าคุณไม่สร้างanonymousสาขาที่แยกออก ในทำนองเดียวกันสำหรับการตรวจสอบจากระยะไกลที่แตกต่างกันคุณจะต้องพูดถึงพารามิเตอร์มิฉะนั้นคอมไพล์ไม่ได้มีวิธีการที่จะรู้ว่ามันเป็นจากระยะไกลใหม่ก็จะมองหา-b origin/remote/branchname
garg10may

คุณเป็นนักบุญ!
ฮาร์วีย์หลิน

12

ลอง

git reflog 

สิ่งนี้ทำให้คุณมีประวัติว่าหัวหน้าและตัวชี้สาขาของคุณเคลื่อนไหวอย่างไร

เช่น :

88ea06b HEAD @ {0}: เช็คเอาต์: ย้ายจากการพัฒนาไปยังรีโมท / แหล่งกำเนิด / SomeNiceFeature e47bf80 HEAD @ {1}: การดึงที่มาการพัฒนา: กรอไปข้างหน้า

ด้านบนของรายการนี้เป็นอีกครั้งหนึ่งที่อาจพบรัฐถอดหัว ... ตรวจสอบสาขาติดตามระยะไกล


7

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

คุณสามารถดูผลลัพธ์ของgit log- คุณสามารถวางส่วนท้ายของบันทึกที่นี่นับตั้งแต่การกระทำที่ประสบความสำเร็จครั้งล่าสุดและเราทุกคนสามารถเห็นสิ่งที่คุณทำ หรือคุณสามารถวางถังขยะและถามอย่างเป็นทางการ#gitบน freenode IRC


5

มันสามารถเกิดขึ้นได้หากคุณมีแท็กชื่อเหมือนสาขา

ตัวอย่าง: หาก "release / 0.1" เป็นชื่อแท็ก

git checkout release/0.1

สร้าง HEAD เดี่ยวที่ "release / 0.1" หากคุณคาดว่ารุ่น / 0.1 จะเป็นชื่อสาขาคุณจะสับสน


1
ใช่. แต่คุณจะแก้ไขได้อย่างไร คุณจะตรวจสอบสาขาได้อย่างไร?
Martin

5

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

บางสถานการณ์ที่จะทำให้เกิดDetached HEADสถานะ:

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

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

    git checkout -b new_branch_nameเมื่อคุณต้องการที่จะกลับไปและชำระเงินที่เฉพาะเจาะจงกระทำหรือแท็กจะเริ่มต้นทำงานจากที่นั่นคุณสามารถสร้างต้นกำเนิดใหม่สาขาจากที่กระทำและสวิทช์ได้โดย สิ่งนี้จะป้องกันDetached HEADรัฐในขณะที่คุณมีสาขาที่ชำระเงินแล้วและไม่ใช่การกระทำ


3

วิธีง่ายๆในอุบัติเหตุคือการทำตามที่พิมพ์ผิดของgit checkout headHEAD

ลองสิ่งนี้:

git init
touch Readme.md
git add Readme.md
git commit
git checkout head

ซึ่งจะช่วยให้

Note: checking out 'head'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

  git checkout -b <new-branch-name>

HEAD is now at 9354043... Readme

ยังกล่าวถึงในlongair.net/blog/2012/05/07/the-most-confusing-git-terminology (มองหา "" HEAD "และ" head "")
VonC

@VonC: ขอบคุณสำหรับลิงค์นั้น ฉันกำลังเตรียมการฝึกอบรม Git และฉันต้องการที่จะชี้ให้เห็นว่าทำไมบางครั้งมันจึงสับสน ฉันมีตัวอย่างจำนวนมากอยู่แล้ว (เช่นcheckout -bซึ่งดูเหมือนว่าเช็คเอ้าท์ แต่จริง ๆ แล้วสาขา) แต่ยินดีต้อนรับรายการอื่น
โทมัสเวลเลอร์

2

อีกวิธีหนึ่งที่จะเข้าสู่สถานะผู้นำที่แยกออกจากคอมไพล์ได้คือพยายามที่จะส่งมอบให้กับสาขาระยะไกล สิ่งที่ต้องการ:

git fetch
git checkout origin/foo
vi bar
git commit -a -m 'changed bar'

โปรดทราบว่าหากคุณทำเช่นนี้ความพยายามในการชำระเงินเพิ่มเติมแหล่งกำเนิดสินค้า / foo จะทำให้คุณกลับสู่สถานะผู้นำเดี่ยว!

วิธีการแก้ปัญหาคือการสร้างสาขา foo ในท้องถิ่นของคุณที่ติดตามต้นฉบับ / foo จากนั้นเลือกที่จะพุช

นี่อาจจะไม่เกี่ยวข้องกับปัญหาดั้งเดิมของคุณ แต่หน้านี้สูงใน google hits สำหรับ "หัวหน้า git แฝด" และสถานการณ์นี้มีเอกสารไม่ครบ


สถานการณ์นี้น่าจะเป็นสิ่งที่คำตอบของโอเว่นพูดถึงข้างต้นซึ่งการตัดและวาง "ต้นกำเนิด / ฟู" ทำให้คิดว่ามันเป็น "ต้นกำเนิด / ต้นกำเนิด / ฟู"
mvanle

1

เมื่อคุณชำระเงินไปยังการส่งgit checkout <commit-hash>หรือสาขาระยะไกลหัวของคุณจะถูกถอดออกและพยายามสร้างการส่งมอบใหม่

คำมั่นสัญญาที่ไม่สามารถเข้าถึงได้โดยสาขาหรือแท็กใด ๆ จะเป็นการรวบรวมและลบขยะออกจากที่เก็บหลังจาก 30 วัน

อีกวิธีในการแก้ไขปัญหานี้คือการสร้างสาขาใหม่สำหรับการคอมมิทและการชำระเงินที่สร้างขึ้นใหม่ git checkout -b <branch-name> <commit-hash>

บทความนี้แสดงวิธีที่คุณสามารถไปยังสถานะHEAD เดี่ยว

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