ฉันจะกู้คืนจากการกด git โดยไม่ตั้งใจได้อย่างไร


13

ฉันวิ่งไปgit push -fโดยไม่ตั้งใจดังนั้นจึงเขียนทับสาขาที่อยู่ห่างไกล

เดิม:

(remote origin:)
    branch master -> commit aaaaaaa
    branch foo    -> commit bbbbbbb

(local)
    branch master -> commit ccccccc
    branch foo    -> commit ddddddd

หลังgit push -f:

(remote origin:)
    branch master -> commit ccccccc
    branch foo    -> commit ddddddd

ในพื้นที่เก็บข้อมูลในท้องถิ่นของฉันฉันทำงานในmasterสาขาดังนั้นฉันสามารถเรียกคืนสาขาmasterที่จะกระทำaaaaaaaเพราะผมจะได้รับการกระทำจากaaaaaaa git reflogแต่ผมไม่สามารถรับกระทำเพราะผมไม่ได้ดึงก่อนbbbbbbbgit push -f

ฉันลองgit reflogในที่เก็บระยะไกลแล้ว แต่ไม่มีประโยชน์ในการอ้างอิงในที่เก็บข้อมูลเปลือย

ฉันจะคืนค่าสาขาfooกลับสู่การส่งข้อมูลbbbbbbbในที่เก็บระยะไกลได้อย่างไร

(PS ฉันไม่ทราบมูลค่าที่แท้จริงของbbbbbbb)


แต่ repo ระยะไกลเป็น repo เปล่า
XièJìléi

คำตอบ:


12

ลองสิ่งนี้:

  1. เชื่อมต่อกับรีโมตผ่าน SSH

  2. ทำการสำรองข้อมูลของที่เก็บระยะไกลทั้งหมด

    tar cvzf project-backup.tgz /path/to/project.git
    
  3. หากคุณรู้ว่าอย่างน้อยสองสามตัวแรกของตัวอักษรbbbbbbbใช้git show bbbbbbและ / หรือgit log bbbbbbเพื่อหาแฮชการกระทำแบบเต็ม (หากคุณต้องการแฮชเพียงอย่างเดียวgit rev-parse bbbbbbก็สามารถใช้งานได้ แต่จะดีกว่าเสมอในการตรวจสอบ)

    หากคุณไม่ทราบค่าเลยให้เรียกใช้git fsckแล้วคุณจะได้รับรายการ "dangling commits" ตรวจสอบแต่ละคอมมิชชันที่ใช้git show <hash>และgit log <hash>จนกว่าคุณจะพบสิ่งที่ถูกต้อง

  4. อัปเดตข้อมูลอ้างอิงสาขา:

    echo aaaaaaaaaaaaaaa.... > refs/heads/master
    echo bbbbbbbbbbbbbbb.... > refs/heads/foo
    
  5. ใช้git log masterและgit log fooเพื่อให้แน่ใจว่าคุณกู้คืนสาขาที่ถูกต้อง


git fsckขอบคุณที่ฉันได้บันทึกไว้ห้อยกับสาขา
XièJìléi

0
  • Gerrit ให้ reflog เซิร์ฟเวอร์ผ่านREST API
  • Github นอกจากนี้ยังมีบันทึกเหตุการณ์ repo มีความเป็นHOWTOยัง

เป็นไปได้ว่าบริการอื่น ๆ มันเป็นตัวช่วยวัน

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