เรียกดูการกระทำที่ถูกทอดทิ้งใน Git


102

ที่เก็บ git ของฉันหายไปอย่างใดอย่างหนึ่ง - ฉันโหลด msysgit เมื่อเช้านี้และแทนที่จะแสดงชื่อสาขาหลังไดเร็กทอรีปัจจุบันมันขึ้นว่า "((ref: re ... ))", 'git status' รายงานทุกอย่างเป็น a ไฟล์ใหม่ 'git log' และ 'git reflog' บอกฉันว่า "fatal: bad default revision" HEAD "และอื่น ๆ

การทำ 'git reflog --all' หรือ 'gitk --all' แสดงให้ฉันเห็นว่าพื้นที่เก็บข้อมูลที่เหลือยังคงอยู่ แต่ดูเหมือนว่าสาขาที่ฉันกำลังทำอยู่จะหายไปซึ่งอธิบายได้ว่าทำไม HEAD ดูเหมือนไม่มีอยู่ / ชี้ไปที่อะไรก็ได้

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

แก้ไข: โอ้ที่รัก ฉันค้นพบ "git fsck" และ "git fsck --full" รายงาน "fatal: object 03ca4 ... is corrupted" ปีศาจสามารถทำอะไรได้บ้าง?

แก้ไข: โอ้ที่รักโอ้ที่รัก ฉันตรวจสอบสาขาอื่นจากนั้นพยายามสร้างสาขาเดิมอีกครั้งโดยใช้ชื่อเดียวกันโดยใช้ "git checkout -b lostbranchname" และ git ระบุว่า "error: ไม่สามารถแก้ไขการอ้างอิง refs / head / lostbranchname: ไม่มีข้อผิดพลาดร้ายแรง: ล้มเหลว เพื่อล็อคการอ้างอิงสำหรับการอัปเดต: ไม่มีข้อผิดพลาด " "ไม่มีข้อผิดพลาด" ต้องเป็นข้อผิดพลาดที่น่ารังเกียจอย่างยิ่ง ดูเหมือนว่ามันยังคงแขวนอยู่รอบ ๆ แต่ไม่สามารถใช้งานได้และไม่สามารถถูกฆ่าได้

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


เกี่ยวกับgit checkout -b lostbranchname- หากคุณสนใจเฉพาะชื่อของสาขา (ไม่ใช่เนื้อหาของสาขา) คุณสามารถลบ (หรือเปลี่ยนชื่อ) ด้วยตนเอง.git/refs/heads/lostbranchname- ซึ่งหวังว่าจะเป็นเคล็ดลับ
Antony Hatchkins

1
และคุณยังไม่ได้อัปสตรีมที่คุณดันโฟลเดอร์ git นี้ไป?
Lakshman Prasad

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

7
ฉันลังเลที่จะบอกว่าคอมไพล์ทำให้คุณ "จัดการกับเรื่องแบบนี้" หรือว่ามันเสียหายไปเอง ไม่มีสิ่งใดนอกจากการสำรองข้อมูลที่สามารถป้องกันข้อมูลสูญหายได้อย่างสมบูรณ์
Cascabel

1
ฉันรู้จริงๆฉันแค่ (โดยธรรมชาติ) นิดหน่อยที่ฉันสูญเสียประวัติที่สวยงามของฉันไป ไม่ใช่ความผิดของคอมไพล์ระบบอื่น ๆ จะทำงานเหมือนกันกับข้อผิดพลาดระบบไฟล์
Ben Hymers

คำตอบ:


135

แทนที่จะปล่อยไว้ฉันคิดว่าฉันจะให้คำตอบสำหรับคำถามของตัวเอง การใช้git reflog --allเป็นวิธีที่ดีในการเรียกดูการกระทำที่ถูกละเลย - และการใช้แฮช SHA1 เพื่อให้คุณสามารถสร้างประวัติศาสตร์ใหม่ได้

ในกรณีของฉันที่เก็บเสียหายจึงไม่ได้ช่วยอะไร git fsckสามารถช่วยคุณค้นหาและแก้ไขข้อผิดพลาดในที่เก็บได้ในบางครั้ง


3
ขอบคุณ. นี่เป็นที่เดียวที่ฉันพบข้อมูลนี้เมื่อพยายามดึงคำขอดึงที่ไม่มีที่มาบน github แก้ไขปัญหาของฉัน
SystemParadox

6
ในกรณีที่ใคร ๆ ก็ต้องการทั้งหมดใน gitk: [alias] orphank = !gitk --all --date-order ``git reflog | cut -c1-7``&(แก้ไข: ลองนึกภาพ backticks สองครั้งที่คนเดียว - การหลบหนีดูเหมือนจะไม่ทำงานที่นี่)
mbx

1
เคล็ดลับสุดเจ๋ง @mbx! มีประโยชน์มากในการดูความเชื่อมโยงระหว่างการกระทำที่เป็นกำพร้าในรูปแบบกราฟิก!
Ben Hymers

@BenHymers จะดีถ้าเราได้เส้นประสำหรับ "rebase / squash" - เหมือนกระทำความสัมพันธ์ด้วย ฉันยังไม่พบวิธีที่จะทำเช่นนั้น
mbx

ฉันไม่รู้เกี่ยวกับ reflog เมื่อฉันเขียนคำตอบด้านบน เป็นเครื่องมือที่มีประโยชน์มาก!
Jamey Hicks

17

ด้วย git 2.9.x / 2.10 (ไตรมาส 3 ปี 2559) คุณจะไม่ต้องใช้git reflog --allอีกต่อไปgit reflogก็เพียงพอแล้ว

ดูกระทำ 71abeb7 (3 มิถุนายน 2016) โดยSzeder Gábor (szeder )
(รวมโดยJunio C Hamano - gitster-ในการกระทำ 7949837 , 6 กรกฎาคม 2016)

reflog: เดินต่อไปตามreflogรูทคอมมิทที่ผ่านมา

หากที่เก็บมีมากกว่าหนึ่งรูทคอมมิตดังนั้นการรีบล็อก HEAD อาจมี "เหตุการณ์การสร้าง" หลายรายการนั่นคือรายการที่มีค่า "จาก" คือ null sha1
การแสดงรายการ reflog ดังกล่าวจะหยุดลงก่อนเวลาอันควรในรายการแรกดังกล่าวแม้ว่า reflog จะยังคงมีรายการที่เก่ากว่า
สิ่งนี้สามารถทำให้ผู้ใช้ตกใจคิดว่า reflog ของพวกเขาถูกตัดทอนหลังจาก ' git checkout --orphan'

ดำเนินการ reflog ต่อไปผ่านเหตุการณ์การสร้างดังกล่าวตามค่า "ใหม่" ของรายการ reflog ที่อยู่ข้างหน้า


4

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

ฉันหวังว่าคุณจะส่งเนื้อหาของที่เก็บนี้ไปยังเครื่องอื่นหรือคุณมีการสำรองข้อมูลเพื่อกู้คืนส่วนที่เสียหาย

ฉันไม่มีประสบการณ์กับคอมไพล์บน windows แต่ไม่เคยเห็นพฤติกรรมแบบนี้กับ git บน Linux หรือ OS X


3

ฉันมักจะพบว่าgit reflogผลลัพธ์นั้นสับสน git log --graph --reflogมันง่ายมากสำหรับผมที่จะเข้าใจการกระทำของกราฟจาก การลบล้างรูปแบบเพื่อแสดงเฉพาะสรุปการคอมมิตยังทำให้กราฟติดตามได้ง่ายขึ้น:

$ git alias graph "log --graph --all --format='%h %s%n        (%an, %ar)%d' --abbrev-commit
$ git graph --reflog

* f06abeb Add feature
|         (Sue Dakota, 4 days ago) (HEAD -> master)
* f126291 Fix the build
|         (Oski M. Wizard, 5 days ago) (origin/master, master)
* 3c4fb9c Break the build
|         (Alyssa P. Hacker, 5 days ago)
| * e3124bf fixup! More work for feature
| |         (Sue Dakota, 4 days ago)
| | * 6a7a52e Lost commit
| |/          (Sue Dakota, 4 days ago)
| * 69d9438 More work for feature
| |         (Sue Dakota, 2 weeks ago)
| * 8f69aba Initial work for feature
|/          (Sue Dakota, 3 weeks ago)
* d824fa9 Fix warnings from the linter
|         (Theo Ristudent, 4 weeks ago)
* 9f782b8 Fix tests flakes
|         (Tess Driven, 5 weeks ago)

จากนั้นเป็นที่ชัดเจนว่าe3124bfและ6a7a52eเป็นเด็กกำพร้าที่ไม่มีการอ้างอิงและมีบริบทจากบรรพบุรุษของพวกเขากระทำ


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