การกู้คืนไฟล์และคอมมิทจาก“ ไม่มีสาขา” ในคอมไพล์


11

ฉันเริ่มทำงานกับไฟล์บางไฟล์ที่ฉันมีใน submodule คอมไพล์ภายใต้โครงการอื่น อย่างไรก็ตามเนื่องจากมันเป็น submodule คอมไพล์มันไม่เคยตรวจสอบ "master" และเพียงแค่ตรวจสอบจากหัวและวางไฟล์ทั้งหมดในโฟลเดอร์ใน "no branch"

ตอนนี้ฉันได้ทำการเปลี่ยนแปลงโดยไม่ตั้งใจกับไฟล์เหล่านี้ฉันเพิ่งรู้ว่าฉันกำลังทำงานใน "ไม่มีสาขา" submodule ของโครงการของฉัน

ฉันจะนำไฟล์เหล่านั้นไปไว้ในสาขา (เช่นหลัก) เพื่อให้สามารถช่วยเหลือพวกเขาได้อย่างไร?

คำตอบ:


28

คุณสามารถใช้git reflogเพื่อค้นหาคำว่า "หลงทาง":

$ cd submodule_dir
$ git reflog          # Find the commit
$ git checkout master
$ git cherry-pick $SHA_OF_MISSING_CMMIT

ใช่มันใช้งานได้ดีมาก! ยกเว้นฉันทำgit merge $COMMIT_SHAครั้งเดียวที่ฉันอยู่ในสาขาอื่น
Xeoncross

3

สถานะ“ ไม่มีสาขา” เรียกว่า HEAD เดี่ยว มันถูกเรียกว่าสิ่งนี้เพราะการอ้างอิง HEAD ไม่ได้เชื่อมต่อกับสาขาใด ๆ แต่จะถูกชี้ไปที่การส่งมอบโดยตรง git checkout -b branchnameการแนบมุ่งหน้าไปยังสาขาที่ชี้ไปยังหัวปัจจุบันกระทำการใช้งาน

คุณสามารถอัปเดตสาขาที่มีอยู่อย่างปลอดภัยเพื่อรวมการคอมมิทที่ HEAD ด้วยลำดับนี้:

git branch temp
git checkout branchname
git merge temp
git branch -d temp

หรือใช้วิธีการอ้างอิงHEAD@{1}เพื่อหลีกเลี่ยงการทำสาขาชั่วคราว:

git checkout branchname
git merge HEAD@{1}

การใช้สาขาชั่วคราวจะเป็นความคิดที่ดีหากคุณไม่ได้ทำการผสานทันที

git branch -f branchname && git checkout branchnameหากคุณต้องการที่จะบังคับให้เขียนทับสาขาที่มีอยู่ไปยังจุดที่จะกระทำที่หัวคุณสามารถใช้ หากการกระทำที่ HEAD ไม่ได้อิงจากคำแนะนำปัจจุบันของbranchnameสิ่งนี้จะส่งผลให้เกิดการเปลี่ยนแปลงอย่างรวดเร็วไปข้างหน้าสู่branchnameซึ่งโดยปกติคุณต้องการหลีกเลี่ยง (มันถูกมองว่าเป็นประวัติการเขียนใหม่)


หมายเหตุคำตอบนี้สันนิษฐานว่า HEAD ยังคงชี้ไปที่การกระทำครั้งสุดท้ายที่ไม่ได้เป็นสาขา หากคุณได้ย้าย HEAD ตั้งแต่นั้นมาและตอนนี้ก็รู้ว่าเกิดอะไรขึ้นคุณอาจต้องมองหาการกระทำที่หายไปใน reflog (ดูคำตอบของ mipadi)
LarsH

1

วิธีเพิ่มคำตอบก่อนหน้า:

ขณะที่คุณยังอยู่ใน HEAD เดี่ยวคุณสามารถเพิ่มแท็ก:

git tag <some-tag>

สิ่งนี้จะเพิ่มแท็กในการส่งมอบซึ่งจะทำให้สามารถมองเห็นได้ในgitkและเครื่องมืออื่น ๆ

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