ที่เก็บ Git เสียหลังจากคอมพิวเตอร์เสียชีวิต


96

คอมพิวเตอร์ของฉันเสียชีวิตและตอนนี้ที่เก็บข้อมูลคอมไพล์ของฉันเสีย เมื่อฉันพยายามชำระเงินมาสเตอร์มันบอกฉันว่า:

warning: ignoring broken ref refs/heads/master.
error: Your local changes to the following files would be overwritten by checkout:
        com.vainolo.jdraw2d.releng.p2/pom.xml
Please, commit your changes or stash them before you can switch branches.
Aborting

เมื่อฉันดำเนินการgit stashฉันจะได้รับ:

fatal: bad revision 'HEAD'
fatal: bad revision 'HEAD'
fatal: Needed a single revision
You do not have the initial commit yet

ฉันจะทำอย่างไรดี?

อัปเดต ผลลัพธ์ของgit reflog:

fatal: bad default revision 'HEAD'

ไม่ค่อยมีแนวโน้ม ... ผลลัพธ์ของgit fsck:

error: Invalid HEAD
Checking object directories: 100% (256/256), done.
error: unable to unpack 59551f96b4e87a1c14293c19eb548ce6fa1f196f header
error: inflateEnd: stream consistency error (no message)
fatal: loose object 59551f96b4e87a1c14293c19eb548ce6fa1f196f (stored in .git/objects/59/551f96b4e87a1c14293c19eb548ce6fa1f196f) is corrupt

คุณสามารถตรวจสอบว่า.git/refs/heads/masterมีอยู่หรือไม่และเนื้อหานั้นเป็นคอมมิตแฮชที่ถูกต้องของที่เก็บของคุณหรือไม่ (คุณสามารถตรวจสอบได้เช่นใช้git show <hash>)
โผล่

ฉันรู้ว่าสิ่งนี้ชัดเจน แต่ยังคงถาม - คุณมี repos ระยะไกลของ git repo เดียวกันหรือไม่?
Tuxdude

@poke เนื้อหา.git/refs/heads/master/เป็นพวง^@
vainolo

@Tuxdude ใช่ แต่ไม่ได้อัปเดตการเปลี่ยนแปลงล่าสุดของฉัน
vainolo

1
สิ่งที่ไม่git reflogบอกคุณ? คุณลองวิ่งแล้วgit fsckหรือยัง?
kynan

คำตอบ:


175

ฉันสามารถกู้คืนผ่าน:

rm .git/refs/remotes/origin/HEAD
git fetch --all

ในกรณีของฉันมันเกิดขึ้นเนื่องจากฉันลบสาขาภายในและระยะไกลบางส่วน (อย่างไรก็ตามไฟล์. git / refs / remotes / origin / HEAD ยังคงอยู่ในสถานะที่ไม่สอดคล้องกัน) การเปลี่ยนเนื้อหาของไฟล์ที่กล่าวถึงข้างต้นเพื่อชี้ไปยังสาขาภายในที่มีอยู่ (เช่น ref: refs / remotes / origin / master) ช่วยแก้ปัญหานี้ได้ อย่างไรก็ตามแนวทางข้างต้นอาจดีกว่าเนื่องจาก HEAD อาจชี้ไปที่การกระทำที่ไม่ได้อยู่ในสาขาปัจจุบัน
crissdev

ในกรณีที่ปัญหาเกิดขึ้นกับโมดูลย่อย git ที่เฉพาะเจาะจงคำสั่งแรกจะเปลี่ยนไปเล็กน้อยrm <root repository path>/.git/modules/<path to the submodule>/refs/remotes/origin/HEAD
Gobe

1
ฉันต้องทำrm -rf .git/refs/remotes/originแต่คุณชี้ให้ฉันไปถูกทาง
Jacka

24

เริ่มต้นด้วยการทำตามขั้นตอนที่แนะนำในการกู้คืนที่เก็บ git ที่ใช้งานไม่ได้ :

  • ตรวจสอบว่า.git/refsยังมีสิ่งที่เป็นประโยชน์หรือไม่
  • ตรวจสอบgit reflogและล้มเหลวว่าเนื้อหาของ.git/logs/refs/heads/masterหรือสาขาใดก็ตามที่คุณอยู่ล่าสุด
  • เรียกใช้git fsckอาจมี--unreachableหรือ--lost-found

หวังว่าจะช่วยให้คุณทราบได้ว่าmasterref ควรเป็นอย่างไรเพื่อให้คุณสามารถกู้คืนได้ (เช่นใส่ SHA1 ที่ถูกต้อง.git/refs/heads/master)

ในกรณีที่ออบเจ็กต์ใด ๆ ที่อยู่ในคอมมิตนั้นเสียหายอย่างแท้จริงคุณไม่สามารถกู้คืนคอมHEADมิตของคุณได้ สมมติว่าโครงสร้างการทำงานและ / หรือดัชนีของคุณยังคงอยู่คุณสามารถลองgit reset --soft(หรือล้มเหลว a git reset) กับการกระทำก่อนหน้านี้แล้วทำการคอมมิตใหม่อีกครั้ง หลีกเลี่ยงการดำเนินการใด ๆ ที่มีการเปลี่ยนแปลง SA ต้นไม้การทำงานของคุณหรือgit checkout -fgit reset --hard


.git/logs/refs/heads/mybranchผมมองไปที่ มันแสดงให้เห็นถึงประวัติบางอย่างของความมุ่งมั่นในสาขานี้ ขุดผ่านที่ฉันเลือก SHA และพยายามแสดงด้วยgit show. (แต่ละคอมมิตมีสอง SHA ฉันเลือกอันที่สองก่อนชื่อผู้แต่ง) อันสุดท้ายเสียหาย แต่อันสุดท้ายอาจเป็นgit shown และฉันก็สามารถดันมันgit push origin abcdef:mybranchได้
Ed Avis

13

ฉันมีปัญหาที่คล้ายกันหลังจากหน้าจอสีน้ำเงินแห่งความตายบน windows 8.1

ฉันมีไฟล์อยู่ในตำแหน่งนี้ ...

C:\www\<project>\.git\refs\remotes\origin\<problem-branch>

และมันว่างเปล่าในขณะที่ไฟล์สาขาอื่น ๆ ในโฟลเดอร์นี้มีสตริงยาว ๆ อยู่ข้างใน

หมายเหตุฉันไม่มีการเปลี่ยนแปลง / กระทำใด ๆ

  • ฉันสำรอง<problem-branch>ไฟล์ไว้
  • ลบไฟล์แล้ว
  • git fetch --all เพื่อรับสาขาอีกครั้ง

จากนั้นการเติมแท็บอัตโนมัติก็เริ่มทำงานอีกครั้ง


6

หากไม่มีไฟล์ที่แก้ไขจำนวนมากฉันคิดว่าวิธีที่สะดวกสบายในการแก้ปัญหานี้คือ:

  1. สำรองไฟล์ที่คุณแก้ไขใน repo
  2. ลบ repo ที่มีอยู่ของคุณ
  3. โคลนใหม่จากเซิร์ฟเวอร์
  4. วางไฟล์จากขั้นตอนที่ 1 ไปยัง repo และ git commit -a

ใช่ไม่มีใครคิดจะโคลนนิ่งขึ้นมาใหม่ ข้อเสนอแนะที่ดี
Selman Genç

5

ฉันจัดการเพื่อแก้ปัญหานี้ด้วยการลบไฟล์หลักในไดเร็กทอรี git \ refs \ head


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

4

git fatal: your current branch appears to be brokenหลังจากแช่แข็งคอมพิวเตอร์และความผิดพลาดสาขาคอมไพล์ของฉันได้รับความเสียหายด้วยข้อความ: ฉันไม่สามารถทำอะไรได้

หลังจากที่ได้git fsckกล่าวว่าสาขานั้นมีerror: Invalid HEAD. refs/heads/<branch>มีinvalid sha1 pointer.

เมื่อตัวเลือกต่อไปนี้ที่นี่ผมเปิด.git/refs/heads/<branch>ใน Notepad ++ บรรณาธิการและแต่ละตัวละคร sha1 NULได้

โชคดีที่ฉันต้องการรีเซ็ตสาขาเป็นสถานะระยะไกลเท่านั้นและนั่นก็อยู่ใน bitbucket repo ฉันคว้า sha1 จากปลาย repo ระยะไกลและคัดลอกไปยังที่.git/refs/heads/<branch>บันทึกไว้จากนั้นทำ a git reset --hard HEADและทุกอย่างกลับสู่ปกติ


2

ฉันงี่เง่าพอที่จะลืมกดและคอมพิวเตอร์ของฉันก็พังขณะทำการคอมมิต ฉันสามารถกู้คืนทุกอย่างได้ แต่การกระทำครั้งสุดท้ายโดยเปิด. git / logs / refs / head /

ไฟล์นี้มีคอมมิตทั้งหมด (พร้อม SHA) ไปยังสาขาสิ่งที่ฉันกู้คืนคือ:

  • สำรองข้อมูลการเปลี่ยนแปลงล่าสุดไปยังโฟลเดอร์ชั่วคราว
  • ย้ายไปที่ "กระดานชนวนที่สะอาด"
    • git checkout master
    • git reset --hard
  • ชำระเงินครั้งที่สองเพื่อกระทำครั้งสุดท้ายในบันทึก
  • สร้างสาขาจากส่วนหัวที่แยกออกมานี้
  • ผลักดัน
  • เรียกคืนการเปลี่ยนแปลงล่าสุด
  • กระทำอีกครั้ง

ดังนั้นแม้ว่าคุณจะทำพลาดแบบโง่ ๆ คุณก็ไม่ได้กลับมาทำงานด้วยคอมไพล์ทั้งวันในทันที :)


2

ฉันไม่สามารถชำระเงินสาขาหลักของฉันได้เนื่องจากข้อผิดพลาดไม่สามารถล็อคการอ้างอิง ฉันลงเอยด้วยการลบ: .git/refs/remotes/origin/HEAD .git/refs/remotes/origin/master

และเรียกคำสั่ง git นี้:

git fetch --all

1

ฉันรู้ว่ามันเป็นการตอบสนองที่ช้าเกินไป แต่ฉันได้รับข้อผิดพลาดนี้เพราะฉันไม่มีorigin/headไฟล์. git branch -rคุณสามารถค้นหานี้ออกโดยการทำงาน หากคุณไม่เห็นของคุณชี้ไปที่ต้นกำเนิดระยะไกลคุณสามารถตั้งค่านี้โดยการเรียกใช้origin/headgit remote set-head origin {{your branch name}}

ตอนนี้เรียกใช้git branch -rอีกครั้งและคุณจะเห็นสิ่งนี้: origin/HEAD -> origin/develop

ฉันหวังว่านี่จะช่วยคนอื่น ๆ ที่ประสบปัญหานี้


1

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

ในพรอมต์คำสั่งของฉันฉันได้รับข้อผิดพลาดนี้ ป้อนคำอธิบายภาพที่นี่

ฉันรู้ว่าข้อมูลอ้างอิงของฉันเสียและจำเป็นต้องได้รับการแก้ไข สิ่งที่ฉันต้องทำคือ git bash (ใน SourceTree คลิกที่ "terminal") จากนั้นไปที่โฟลเดอร์อ้างอิงเช่นนี้

cd .git
cd refs
cd remotes
cd origin

จะมีชื่อไฟล์ masterให้ใช้lsเพื่อดูว่ามีอะไรอยู่ในไดเร็กทอรี จากนั้นก็ลบโดยใช้ rm master

แบมไฟล์ที่เสียหายหายไป ตอนนี้ถ้าคุณออกคำสั่ง git branch -a มันจะส่งออกสิ่งนี้

$ git branch -a
* master
  remotes/origin/master (this in red color -scary :) )

จากนั้นออกคำสั่งนี้และจะแก้ไขการอ้างอิงของคุณ

$ git remote set-head origin master

สรุปได้ว่าหากคุณพยายามดึงรีโมทควรแสดงชื่อรีโมตว่างซึ่งได้รับการแก้ไขแล้ว

ป้อนคำอธิบายภาพที่นี่


0

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


0

ตรวจสอบว่า MSWindows สร้างไฟล์ desktop.ini ที่มีทั้ง git หรือไม่ มันทำเพื่อฉัน เมื่อฉันลบทั้งหมดในโฟลเดอร์ย่อยของไดเร็กทอรี. git มันก็ใช้งานได้


0

ฉันมีปัญหาเดียวกันนี้เมื่อ Android Studio หยุดทำงานกะทันหัน (เนื่องจากสูญเสียพลังงานไปยังคอมพิวเตอร์)

ฉันแก้ไขได้โดยการคัดลอกเนื้อหาของC:\Users\myusername\AndroidStudioProjects\MyBrokenApp\.git\refs\heads\masterไฟล์ไปยังC:\Users\myusername\AndroidStudioProjects\MyBrokenApp\.git\refs\remotes\origin\masterไฟล์ของฉัน

(ก่อนหน้านี้ฉันเปิดตัวเลือก 'Force Push' ใน Android Studio ด้วย แต่ฉันไม่คิดว่านี่เป็นขั้นตอนที่จำเป็น)

บันทึก:

ฉันพบวิธีแก้ปัญหานี้โดยการเปรียบเทียบเนื้อหาของไฟล์ในC:\Users\myusername\AndroidStudioProjects\MyBrokenApp\.git\ไดเร็กทอรีของฉัน(รวมไดเร็กทอรีย่อย) กับไฟล์ที่เกี่ยวข้องของไฟล์ในโปรเจ็กต์อื่นที่ดีต่อสุขภาพเช่นC:\Users\myusername\AndroidStudioProjects\MyHealthyApp\.git\.

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

หากคุณไม่มีโปรเจ็กต์อื่นที่ดีต่อสุขภาพซึ่งได้กำหนดค่าคอมไพล์ไว้คุณอาจคุ้มค่าที่จะสร้างโปรเจ็กต์ง่ายๆแบบเดียวกับที่คุณสร้างโปรเจ็กต์ที่เสียหายเพื่อตรวจสอบเปรียบเทียบและแก้ไข ฯลฯ

PS - ข้อความแสดงข้อผิดพลาดของฉัน (แก้ไข) คือ: warning: ignoring broken refs/remotes/origin/master.fatal bad revision 'refs/remotes/origin/master..refs/heads/master' during executing git -c core.quotepath=false log refs/remotes/origin/master..refs/heads/master --pretty=format --encoding=UTF-8 -M --name-status -c --


0

ยกโทษให้ฉันถ้าฉันจะพูดซ้ำหลังจากใครบางคน (ฉันยังไม่ได้อ่านความคิดเห็นทั้งหมด) ในความคิดของฉันวิธีที่ง่ายที่สุดในการแก้ปัญหาคือการคัดลอกโปรเจ็กต์โดยไม่ใช้. git และ .idea ล้างข้อมูลโคลนจากคอมไพล์ลบทุกอย่างยกเว้นไดเร็กทอรีด้านบนจากนั้นวางสำเนาก่อนหน้าลงใน repo ที่สร้างขึ้นใหม่ด้วย. git และ .idea . หวังว่ามันจะสมเหตุสมผล

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