GIT กู้คืน HEAD ที่แยกออกมาล่าสุด


87

ได้โปรดฉันมีปัญหาใหญ่ในโครงการของฉันนี่คือสถานการณ์ ฉันมีโครงการ xcode ภายใต้ GIT วันนี้ฉันตระหนักว่าการกระทำครั้งสุดท้ายทำให้การทดสอบบางอย่างขัดข้องดังนั้นฉันจึงตรวจสอบการกระทำก่อนหน้านี้ ฉันใช้ SourceTree และนี่คือคำเตือน

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

ฉันทำงานมาทั้งวันและในตอนท้ายฉันก็มุ่งมั่นทุกอย่าง ดังนั้นฉันต้องรวมงานของฉันกับสาขาการพัฒนาดังนั้นฉันจึงเช็คเอาต์สาขาการพัฒนาและ ... งานของฉันหายไปทันที :(

ฉันรู้ว่ามันผิดที่ถอด HEAD และ Sourcetree เตือนฉัน ... แต่มีวิธีคืนค่างานของฉันไหม?


เธรดที่เกี่ยวข้องสำหรับปัญหาเดียวกันที่นี่และเทคนิคว่ามันเกิดขึ้นที่นี่ได้อย่างไร
RBT

คำตอบ:


259

หากคุณพิมพ์git reflogมันจะแสดงประวัติของการแก้ไขที่HEADชี้ไปที่ หัวที่แยกออกมาของคุณควรอยู่ในนั้น เมื่อคุณพบแล้วให้ทำgit checkout -b my-new-branch abc123หรือgit branch my-new-branch abc123( abc123SHA-1 ของ HEAD ที่แยกออกมาอยู่ที่ไหน) เพื่อสร้างสาขาใหม่ที่ชี้ไปที่หัวที่แยกออกของคุณ ตอนนี้คุณสามารถรวมสาขานั้นได้ตามอัธยาศัย

โดยทั่วไปหากคุณตรวจสอบสาขาหลังจากทำงานบนหัวแยก Git ควรแจ้งให้คุณทราบถึงการกระทำจากส่วนหัวที่แยกออกมาที่คุณใช้งานอยู่เพื่อให้คุณสามารถกู้คืนได้หากต้องการ ฉันไม่เคยใช้ SourceTree ดังนั้นฉันจึงไม่รู้ว่ามันถ่ายทอดข้อความนั้นหรือไม่ แต่ถ้ามันแสดงข้อความนั้นคุณควรจะสามารถใช้สิ่งนั้นเพื่อค้นหาคอมมิตและใช้อีกครั้งgit checkout -bหรือgit branchเพื่อสร้างสาขาจากคอมมิตนั้น


5
ขอบคุณไบรอัน คุณช่วยวันของฉัน
Muzammil

ไบรอันคุณช่วยชีวิตฉันไว้! ขอบคุณ !!
cldrr

ฉันเพิ่งเริ่มใช้คอมไพล์ .. ฉันได้รับfatal: A branch named 'mybranch' already exists.วิธีการเพิ่มในสาขาที่มีอยู่?
Ramesh Murugesan

1
ในฐานะ PSA สำหรับทุกคนที่ขอบคุณ Brian: หากคุณทำงานที่คุณไม่ต้องการสูญเสียให้กดไปที่รีโมต (เช่น github) ทุกๆสองสามชั่วโมง เมื่อดาวตกตกลงบนคอมพิวเตอร์ของคุณคุณจะดีใจที่ได้ทำ หากคุณยังไม่พร้อมที่จะแบ่งปันกับผู้ทำงานร่วมกันให้วางไว้ในสาขาที่ไม่มีใครรู้จักในตอนนี้แล้วตั้งฐานใหม่เป็นหลักในภายหลัง
MatrixManAtYrService

1
นอกจากนี้ถ้ามันหายไปเพียงครั้งเดียวกระทำที่เพิ่งหายไปและคุณจะพบว่ามีคุณสามารถนำกลับมาพร้อมกับgit cherry-pick e5b2f7bที่e5b2f7bเป็น SHA-1 ของการกระทำมี
Aidin

10

ใน Sourcetree คุณสามารถทำได้โดยใช้ GUI

ขั้นแรกให้ค้นหาคอมมิต "สูญหาย" โดยค้นหาข้อความในประวัติคำสั่ง (มุมมอง: แสดงเอาต์พุตคำสั่ง) มันอาจจะอยู่ในคำสั่ง "Switching Branch" หลังจากคอมมิตที่คุณทำหาย ในข้อความนั้นหวังว่าคุณจะเห็นคอมเมนต์คอมมิตที่มีรหัสคอมมิต 1234567

นำ Commit ID นั้นไปยังขั้นตอนถัดไป

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

ใส่คำอธิบายภาพที่นี่


ใช้งานได้จริง ตรวจสอบให้แน่ใจว่าคุณเห็นความคิดเห็นที่ถูกต้องพร้อมรหัสการกระทำ
Hammad Khan

@blalond สวัสดีหลังจากอ่านคำตอบของคุณฉันมีคำถามเล็กน้อย: เมื่ออยู่ใน SourceTree ฉันดับเบิลคลิกที่การกระทำก่อนหน้านี้ (เพื่อตรวจสอบ) ฉันได้รับข้อความเดียวกันว่าสิ่งนี้จะทำให้เกิดการแยกออกจากกันดังนั้นฉันจึงสงสัย หมายความว่าอย่างไรเมื่อมีคนบอกว่าคุณสามารถย้อนกลับไปยังการแก้ไขก่อนหน้าด้วยคอมไพล์ได้? ฉันจะย้อนกลับไปที่การกระทำเฉพาะได้อย่างไร ขอบคุณ

5

หากคุณไม่ต้องการเก็บการเปลี่ยนแปลงของ HEAD ที่แยกออกมาและต้องการไปที่การกระทำสาขาล่าสุดให้ใช้คำสั่งด้านล่างโดยตรง

git checkout - 

หมายเหตุ: ฉันจะลบการเปลี่ยนแปลงทั้งหมดของคุณใน HEAD ที่แยกออกมา


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

1

เพื่อนร่วมงานของฉันเพิ่งมีสถานการณ์เช่นนี้ ในกรณีของเขามีการกระทำที่แยกออกจากกัน - พวกเขาทำงานใน R-Studio - และเครื่องมือได้เตือนพวกเขาว่าพวกเขาสามารถสร้างสาขาด้วยสิ่งนี้และการอ้างอิง SHA นั้น ... แต่เนื่องจากตัวเลือกเดียวคือ "ปิด" - ดุ !! มันเป็นกล่องข้อมูล - พวกเขาปิดบทสนทนาและสูญเสียข้อมูลไปตลอดกาล ...

ต้องขอบคุณreflogคำสั่งที่เราเห็นว่าการเปลี่ยนแปลงไม่สูญหายไป แต่ในกรณีของเราgit branchมันไม่ได้ผลตามที่คาดหวัง ... หรือขาเข้าgit pullทำให้มันยุ่ง เราต้องตกปลาการเปลี่ยนแปลงจาก reflog ไปยังสาขาที่สร้างขึ้นใหม่:

 git cherry-pick 0b823d42..3cce27fc

ซึ่งวางคอมมิตทั้งหมดที่เราต้องการในสาขา จากนั้นเราสามารถรวมสาขาเข้าdevelopโดยไม่มีปัญหา

เพียง แต่ในกรณีนี้เป็นข้อมูลสำหรับทุกคนที่เราไม่แจ้งกระทำบนหัวเดี่ยวในreflogโดยดูที่ผู้ที่อยู่ในระหว่างที่มีเครื่องหมาย "เช็คเอาต์" (ซึ่งระบุสาขาขยับ):

e09f183b HEAD@{3}: pull: Fast-forward
b5bf3e1d HEAD@{4}: checkout: moving from lost_changes to develop
b5bf3e1d HEAD@{5}: checkout: moving from 3cce27fca50177a288df0252f02edd5da5ee64fd to lost_changes
3cce27fc HEAD@{6}: commit: add statistics
417a99a4 HEAD@{7}: commit: add test
0b823d42 HEAD@{8}: commit: new utility class
d9ea8a63 HEAD@{9}: checkout: moving from develop to d9ea8a635d4c2349fcb05b3339a6d7fad5ae2a09
b5bf3e1d HEAD@{10}: pull: Fast-forward

คนที่เราอยากได้HEAD@{8}ไปHEAD@{6}(ทั้งรวม) ดังนั้นเราจึงได้มาโดย:

git cherry-pick 0b823d42..3cce27fc

จากนั้นการแก้ปัญหาการผสานตามปกติและการคอมมิตขั้นสุดท้ายทำให้เรามี branch lost_changes ซึ่งโฮสต์งานแยกส่วนที่เราคิดว่าหายไป การรวมสิ่งนั้นเข้ากับการพัฒนาเป็นไปอย่างรวดเร็วในครั้งนี้


0

ฉันลองใช้สถานการณ์นี้และพบว่าคอมไพล์บอกฉันว่า SHA-1 ของการกระทำล่าสุด:

vors@localhost:~/git-test$ git checkout master 
Warning: you are leaving 1 commit behind, not connected to
any of your branches:

  ec600e6 333

If you want to keep them by creating a new branch, this may be a good time
to do so with:

 git branch new_branch_name ec600e6eb2473dd4f3732539c5c1fa5829f631b7

Switched to branch 'master'

คุณเห็นข้อความนี้ไหม


ไม่. หรือบางทีฉันอาจจะไม่ใส่ใจ ฉันกำลังหาข้อมูลสำรองใน timemachine; (
IgnazioC

1
@IgnazioC คุณไม่จำเป็นต้องดูข้อมูลสำรอง คุณลองดูคำตอบของฉันหรือไม่? git reflogควรแสดงสิ่งที่คุณต้องการ
Brian Campbell

0

หัวแยกสามารถใช้ได้ตราบเท่าที่คุณต้องการไม่เปลี่ยนแปลง

หากคุณต้องการเปลี่ยนกลับคอมมิตคุณสามารถใช้ git revert ในสาขาที่ต้องการได้

หากคุณต้องการลดความคิดที่แยกออกจากกันและกระทำ สร้างสาขาใหม่ (และรวมในภายหลัง);


ใช่ เรารู้กฎ แต่เมื่อเพื่อนร่วมงานเลิกทำตัวหัวปักหัวปำแล้วเดินออกจากการกระทำเหล่านั้นพวกเขาจะขอคำตอบไม่ใช่กฎเกณฑ์
manuelvigarcia

0
  1. ขั้นแรกให้เรียกใช้git reflogเพื่อดูประวัติ
  2. การแก้ไขที่เก่าที่สุดจะเป็นครั้งสุดท้ายในรายการ
  3. เปลี่ยนเป็นคอมมิตที่คุณต้องการโดยใช้git checkout -b temp e35d2b3ที่นี่ e35dd23 คือค่าแฮชของคอมมิตของคุณ
  4. แค่นั้นแหละ. ตอนนี้เพียงแค่ทำการเพิ่มคอมไพล์ ฯลฯ ....

ยอมรับเป็นคำตอบหากสามารถแก้ปัญหาของคุณได้ มิฉะนั้นโปรดแบ่งปันความคิดเห็นของคุณ

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