จะทำอย่างไรกับความมุ่งมั่นที่ทำในหัวเดี่ยว


279

การใช้คอมไพล์ฉันทำอะไรแบบนี้

git clone
git checkout {a rev number tree rev before} (here I started to be in a detached head state)
//hacking
git commit
//hacking
git commit
(some commit where made on origin/master)
git pull (which does complete because there was some error due to the fact that I'm no more on master)

เพราะมันบอกกับฉันว่าฉันยังคงสามารถกระทำเมื่ออยู่ในสถานะผู้นำเดี่ยวฉันทำเช่นนั้น แต่ตอนนี้ฉันต้องการผสานสาขาที่แยกออกมาของฉันและสาขาหลักในพื้นที่ของฉันแล้วผลักดันการเปลี่ยนแปลงไปยังที่มา / หลัก

ดังนั้นคำถามของฉันคือฉันจะผสานสาขาหลักเข้ากับสถานะที่แท้จริงของฉันได้อย่างไร (หัวเดี่ยว)



ฉันสามารถเพิ่มภาพหน้าจอของทรีคอมมิตในสถานะนี้ (ลักษณะการคอมมิตบนเฮดเดอร์เดี่ยวมีลักษณะเป็น gitk หรือ SourceTree) ซึ่งจะทำให้คำถามนี้ดียิ่งขึ้น
florisla

โชคไม่ดีในตอนนี้ที่ฉันทำไม่ได้ แต่ถ้าคุณให้ได้ฉันก็ยินดีที่จะเห็นมันที่นี่ แม้ว่ามันจะต้องเสมอกันมันก็จะทำให้ชัดเจนขึ้น
benzen

คำตอบ:


476

สร้างสาขาที่คุณอยู่จากนั้นเปลี่ยนไปเป็นหลักและผสาน:

git branch my-temporary-work
git checkout master
git merge my-temporary-work

12
เราจะหลีกเลี่ยงการถอดหัวในอนาคตได้อย่างไร?
ycomp

ฉันทำสิ่งนี้และพบว่าตัวเองอยู่ข้างหน้าของจุดเริ่มต้น 5 คอมมิชชัน ในกรณีนั้นคุณเพียงแค่ทำคอมไพล์ดันหรือไม่?
Winnemucca

5
แปลกฉันได้รับ "ทันสมัยแล้ว" เมื่อรวมงานชั่วคราวของฉันเข้าด้วยกัน
Robert Sinclair

10
อย่าลืมลบงานชั่วคราวด้วย "git branch -d งานชั่วคราว"
Captain Lepton

5
@ ycomp "ส่วนหัวแฝด" เกิดขึ้นเมื่อคุณแก้ไขไฟล์ของการคอมมิชชันเก่าและคอมมิทที่ไม่มีสาขาเพื่ออ้างอิงการคอมมิทใหม่นี้ในภายหลัง หากต้องการหลีกเลี่ยงการถอดแยกชิ้นส่วนโปรดอย่าชำระค่าคอมมิชชันเก่า หากคุณยังต้องการไฟล์ทั้งหมดจากที่นั่น แต่เป็นการกระทำใหม่คุณสามารถเช็คเอาต์ไดเรกทอรีจากการส่งแทนที่จะส่งข้อมูลเอง ดูคำตอบนี้
lucidbrot

96

คุณสามารถทำอะไรเช่นนี้

# Create temporary branch for your detached head
git branch tmp

# Go to master
git checkout master

# Merge in commits from previously detached head
git merge tmp

# Delete temporary branch
git branch -d tmp

แม้จะง่ายกว่า

git checkout master
git merge HEAD@{1}

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


4
ฉันรู้ว่านี่คือหลายปีต่อมา แต่ขอบคุณสำหรับคำตอบนี้ ฉันไม่คิดว่าตัวเองทำการค้นหาด้วยคำตอบที่ยอมรับได้ที่นี่เพราะฉันไม่ต้องการออกจากสาขาชั่วคราวและคำตอบนี้มีคำสั่งให้ลบ
Jeremy Pridemore

8
หากคุณตัดสินใจที่จะใช้คำสั่งgit merge HEAD@{1}คุณควรแน่ใจว่าเป็นคำสั่งที่คุณต้องการใช้git reflog
Michael Stramel

3
ความสามารถในการผสาน HEAD @ {1} ช่วยชีวิตฉันตั้งแต่ฉันได้ตรวจสอบอาจารย์ชั้นนำก่อนแล้ว
juil

แปลกฉันได้รับ "ทันสมัยแล้ว" เมื่อทำการรวม tmp (แต่ไฟล์จะแตกต่างกัน)
Robert Sinclair

18

นี่คือสิ่งที่ฉันทำ:

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

สิ่งแรกที่คุณต้องทำคือdetached HEADตั้งชื่อให้ คุณสามารถทำมันได้อย่างง่ายดายในขณะที่ทำสิ่งนี้detached HEAD:

git checkout -b some-new-branch

ตอนนี้คุณสามารถผลักมันไปที่ระยะไกลได้เหมือนสาขาอื่น ๆ

ในกรณีของฉันฉันยังต้องการส่งต่อสาขานี้อย่างรวดเร็วเพื่อเป็นผู้เชี่ยวชาญพร้อมกับความมุ่งมั่นที่ฉันทำในdetached HEAD(ตอนนี้some-new-branch) ทั้งหมดที่ฉันทำคือ

git checkout master

git pull # To make sure my local copy of master is up to date

git checkout some-new-branch

git merge master // This added current state of master to my changes

masterแน่นอนฉันรวมภายหลังการ

เกี่ยวกับมัน.


1
คำตอบนี้ใช้ได้สำหรับฉันในที่ที่คนอื่นไม่ได้ git checkout -b new-branchทำงานให้ฉัน ข้อเสนอแนะอื่น ๆ เรียกร้องgit branch new-branchแต่นั่นทำให้ฉันยังอยู่ในหัวที่ถูกแยกออกและสาขาใหม่ไม่ได้รับการเปลี่ยนแปลงของฉัน
Jesse Patel

17

คุณสามารถทำได้git merge <commit-number>หรือgit cherry-pick <commit> <commit> ...

ตามที่ Ryan Stewart แนะนำคุณอาจสร้างสาขาจาก HEAD ปัจจุบัน:

git branch brand-name

หรือเพียงแค่แท็ก:

git tag tag-name

คุณสามารถค้นหาหมายเลขการกระทำของคุณบนหัวเดี่ยวโดยgit rev-parse HEAD
KOGI

6

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

git branch  temp
git checkout master
git merge temp

3

git checkout -b <branch-name> <commit-hash>แก้ไขได้ง่ายเป็นเพียงการสร้างสาขาใหม่ที่มอบความไว้วางใจและชำระเงินไป:

ด้วยวิธีนี้การเปลี่ยนแปลงทั้งหมดที่คุณทำจะถูกบันทึกไว้ในสาขานั้น git reset --hard masterในกรณีที่คุณจำเป็นต้องทำความสะอาดสาขาหลักของคุณจากที่เหลือกระทำให้แน่ใจว่าจะวิ่ง

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


1

อาจจะไม่ได้เป็นทางออกที่ดีที่สุด (จะเขียนประวัติศาสตร์) git reset --hard <hash of detached head commit>แต่คุณยังสามารถทำ

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