การดูไฟล์ที่ถูกลบใน Git


106

ฉันได้ลบไฟล์ด้วย Git และทำการคอมมิตแล้วดังนั้นไฟล์จึงไม่อยู่ในสำเนาที่ใช้งานได้อีกต่อไป ฉันต้องการดูเนื้อหาของไฟล์นั้น แต่ไม่สามารถกู้คืนได้จริง ฉันจะทำเช่นนี้ได้อย่างไร?

คำตอบ:


146
git show HEAD^:path/to/file

คุณสามารถใช้ตัวระบุการคอมมิตแบบชัดแจ้งหรือHEAD~nเพื่อดูเวอร์ชันที่เก่ากว่าหรือหากมีการคอมมิตมากกว่าหนึ่งรายการนับตั้งแต่ที่คุณลบไป


6
โปรดทราบว่าpath/to/fileเป็นเส้นทางแบบเต็มจากด้านบนสุดของโครงการ (dir ด้านบนของที่เก็บ)
Jakub Narębski

1
ฉันมีfatal: Invalid object name 'HEAD^'.(ฉันต้องพูดถึงว่าฉันมีเพียง "การกระทำเริ่มต้น")
vladkras

1
หากการลบถูกจัดฉาก แต่ไม่ได้คอมมิตให้ใช้ HEAD แทน HEAD ^ (เนื่องจากมีอยู่ใน HEAD) ตัวอย่างเช่นฉันคิดว่าฉันต้องการไฟล์ดังนั้นฉันจึงเพิ่มมันและมุ่งมั่นที่จะบันทึกงานของฉันจากนั้นจึงลบทิ้งในภายหลังเมื่อฉันคิดวิธีแก้ปัญหาอื่น หากต้องการดูไฟล์ต้นฉบับก่อนที่จะดำเนินการอีกครั้งฉันได้แสดงคำสั่ง HEAD: path / to / file
Tony Wickham

1
ฉันคิดว่าควรค่าแก่การกล่าวถึงว่าจะใช้ได้เฉพาะเมื่อไฟล์ถูกลบในคอมมิตล่าสุด หากไฟล์ถูกลบไปหลายครั้งก่อนหน้านี้คุณจะต้องใช้คำตอบอื่น ๆ
jayhendren

51

หากนี่คือไฟล์ที่คุณได้ลบไปแล้วและไม่ต้องการหาการแก้ไขคุณสามารถใช้ (ไฟล์มีชื่อfooในตัวอย่างนี้คุณสามารถใช้เส้นทางแบบเต็มได้):

git show $(git rev-list --max-count=1 --all -- foo)^:foo

rev-listภาวนารูปลักษณ์สำหรับทุกการแก้ไขของfooแต่รายชื่อเพียงคนเดียว ตั้งแต่rev-listรายการในลำดับย้อนกลับแล้วสิ่งที่มันจะแสดงรายการคือการแก้ไขที่ผ่านมาที่มีการเปลี่ยนแปลงซึ่งจะเป็นกระทำที่ถูกลบfoo foo(นี่เป็นไปตามสมมติฐานที่ว่า git ไม่อนุญาตให้มีการเปลี่ยนแปลงไฟล์ที่ถูกลบและยังคงถูกลบอยู่ ) คุณไม่สามารถใช้การแก้ไขที่rev-listส่งคืนตามที่เป็นอยู่ได้เนื่องจากfooไม่มีอยู่แล้ว คุณต้องขอไฟล์ก่อนหน้าซึ่งมีการแก้ไขล่าสุดของไฟล์ดังนั้น^ในgit showไฟล์.


2
คุณอาจต้องเปลี่ยน foo สุดท้ายเป็น. / foo และสำหรับพวกเขาที่ไม่ใช้ bash ให้รับ id ด้วย "git rev-list --max-count = 1 --all - foo" จากนั้นทำ "git show 5824127a8d99576632a04ac2b5c2344bcf751967: ./ foo" ด้วย id (524 .. is id)
Dror

1
คำตอบที่ดี ฉันต้องใช้ ~ แทน ^ ไม่แน่ใจว่าทำไม และเพื่อให้ผู้คนเข้าใจมันชัดเจน 'foo' ที่นี่ต้องเป็นเส้นทางที่สมบูรณ์จากรากคอมไพล์
pedorro

คุณสามารถเขียนได้**/fooหากคุณไม่ทราบเส้นทาง (สิ่งนี้จะใช้ได้กับคำสั่ง rev-list แต่ไม่ใช่คำสั่ง show อย่างไรก็ตามด้วยการกระทำจากคำสั่ง rev-list คุณจะสามารถค้นหาเส้นทางได้)
Nickolai

10

เนื่องจากคุณอาจจำเส้นทางที่แน่นอนไม่ได้คุณสามารถรับ sha1 จากบันทึกคอมไพล์แทนจากนั้นคุณสามารถออกได้

 git cat-file -p <sha1>

5
ในนามของSamuel Slund : วิธีหนึ่งในการหาผลรวม sha1 ที่จะใช้ข้างต้นคือ: git whatchanged --no-abbrevที่ให้เอาต์พุตคล้ายกับบันทึก git (หรือ svn)
ไร้เสียงรบกวน
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.