ฉันสามารถกู้คืนไฟล์ที่ถูกลบ (เลิกทำ `git clean -fdx`) ได้หรือไม่


119

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


2
ฉันไม่รู้แน่ชัด แต่ฉันไม่คิดว่ามันจะเป็นไปได้ด้วยคอมไพล์ อย่างไรก็ตามยูทิลิตี้การยกเลิกการลบสำหรับระบบไฟล์ของคุณอาจทำเคล็ดลับได้
static_rtti

9
ที่น่าสนใจGit Community Bookยังแนะนำgit clean -fdxโดยไม่มีการเตือนว่าการดำเนินการนั้นอันตรายมาก ฉันสงสัยว่ามีกี่คนที่ทำลายไฟล์โดยไม่สามารถเพิกถอนได้ด้วยคำแนะนำที่ดูเหมือนไร้เดียงสานี้
catpnosis

5
อย่าลืมตรวจสอบว่า IDE ของคุณมี "Local History" เช่น Eclipse หรือ IntelliJ IDE หรือไม่ ซึ่งจะช่วยให้คุณไม่ต้องปวดใจกับการgit cleanโทรโดยไม่ได้ตั้งใจ นอกจากนี้พยายามออกจากนิสัยการทำความสะอาดโดยไม่ตรวจสอบ สร้างสคริปต์ Powershell หรือ Bash ที่สามารถเรียกได้ว่าจะทำงานgit clean -fdxnพร้อมกับข้อความยืนยันก่อนที่คุณจะรันการล้างที่ทำลายล้างอย่างไม่น่าเชื่อ
Josh Burgess

คำตอบ:


129

ไม่ได้ไฟล์เหล่านั้นหายไป

(เพิ่งตรวจสอบบน Linux: git clean โทรunlink()และไม่ได้สำรองข้อมูลอะไรไว้ล่วงหน้า)


32
หากคุณใช้ IDE ขั้นสูงเช่น RubyMine, Eclipse และอื่น ๆ โอกาสที่จะมีประวัติของไฟล์ที่ถูกลบและคุณอาจสามารถกู้คืนได้
Usman

1
@Usman ในกรณีของฉันgit cleanได้ลบการเปลี่ยนแปลงที่.ideaซ่อนอยู่ในโฟลเดอร์ที่ซ่อนโดยไม่ได้ตั้งใจและ Local History ช่วยฉันไว้
emkman

2
เคล็ดลับดีๆโดย @Usman ด้วย Eclipse ฉันสามารถนำไฟล์ของฉันกลับมาได้ด้วยตัวเลือก "กู้คืนจากประวัติท้องถิ่น ... ": i.imgur.com/XWNLOk5.gifv
brandizzi

1
จริงๆแล้วนี่เป็นไปได้ แต่ด้วยวิธีการแฮ็ก ดูคำตอบนี้: stackoverflow.com/questions/6267180/can-i-undo-a-git-clean-fdx/…
Just Shadow

4
ใน PyCharm คุณสามารถกู้คืนได้ คลิกขวาในโฟลเดอร์ที่มีคลิกในประวัติท้องถิ่นค้นหาการลบและคลิกเปลี่ยนกลับ
Juanjo Conti

48
git clean -fdxn

จะดำเนินการแบบแห้งและแสดงให้คุณเห็นว่าไฟล์ใดบ้างที่จะถูกลบหากคุณวิ่ง

git clean -fdx

(แน่นอนว่านี่จะมีประโยชน์ก็ต่อเมื่อคุณรู้ล่วงหน้า แต่ในครั้งหน้า)


7
ในการเพิ่มสิ่งนี้ให้-nทำงานกับคำสั่ง git ส่วนใหญ่ (และคำสั่ง * nix อื่น ๆ อีกมากมาย)
Nick McCurdy

23

IntelliJ / Android Studio ช่วยให้การเรียกคืนไฟล์จากประวัติศาสตร์ท้องถิ่น


3
PyCharm รองรับสิ่งนี้ด้วย! ขอบคุณสำหรับคำตอบนี้ ฉันดีใจมากที่ได้อ่านคำตอบที่เหลือหลังจาก 3 อันดับแรกคือ "ไม่เสียใจที่คุณโชคไม่ดี"
Bryson

18

ไม่ "git clean -fdx" จะลบไฟล์และไดเร็กทอรีทั้งหมดที่ git ไม่ได้ติดตามจากไดเรกทอรีการทำงานของคุณ เนื่องจาก Git ไม่ติดตามไฟล์เหล่านี้จึงไม่มีการสำรองข้อมูลใด ๆ ของไฟล์เหล่านี้ อย่างน้อยก็ไม่ปกติ

หากคุณได้ทำการ "เพิ่มคอมไพล์" ในไฟล์เหล่านี้เมื่อไม่นานมานี้ (แต่ถูกยกเลิกการคอมมิต) มีโอกาสที่คุณจะพบมันด้วย 'git fsck --lost-found' มันคุ้มค่าที่จะลอง แต่อย่าตั้งความหวังไว้มากเกินไป

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


ปัญหาที่แท้จริงคือไดเร็กทอรีไม่ควรเป็นที่เก็บเช่นกัน เมื่อมองย้อนกลับไปที่บันทึกปรากฎว่าฉันลืม cd ไปยังไดเรกทอรี repo ใหม่หลังจากmkdirนั้น
Eric

1
ไม่นานหลังจากอ่านคำถามนี้ฉันได้เขียนโปรแกรมแก้ไขไปยัง Git ซึ่งเพิ่มตัวแปรการกำหนดค่าเพื่อสำรองไฟล์ที่ถูกลบแต่ละไฟล์ บางทีอาจเป็นประโยชน์สำหรับคนอื่น ๆ ? github.com/kusma/git/tree/work/clean-backup
kusma

1
วันนี้โชคดี !!! ขอบคุณข้อมูล "git fsck --lost-found" ฉันใช้สิ่งต่อไปนี้เพื่อรับการเปลี่ยนแปลงทั้งหมด: git fsck | awk '{print $ 3}' | xargs git show | ที searchresults.log เนื่องจากฉันต้องการไฟล์ทั้งหมดที่ฉันได้เพิ่มและลบออกไปแล้วฉันสามารถรับได้จากบันทึก :)
Marcello de Sales

11

ดังที่ @kusma ได้กล่าวไว้ข้างต้นหากคุณโชคดี (ถ้าคุณเคยทำ "git add") คุณสามารถใช้สิ่งต่อไปนี้เพื่อแยกวัตถุทั้งหมด:

git fsck | awk '{print $3}' | xargs git show | tee searchresults.log

ด้วยวิธีนี้มันจะค้นหาทุกประเภทรวบรวมส่วนต่างทั้งหมดและเพิ่มลงในไฟล์ที่คุณสามารถแตกไฟล์ที่หายไปได้ ในกรณีของฉันฉันสูญเสียคลาส Java ทั้งหมด


8

หากคุณใช้ Jetbrains IDE ใด ๆ จะมีตัวเลือกในการดูประวัติไฟล์ในเครื่อง ในกรณีที่คุณทำเสร็จgit cleanแล้วคุณสามารถสร้างไฟล์ขึ้นใหม่และตรวจสอบประวัติภายในของไฟล์และกู้คืนจากที่นั่น

ทำงานให้ฉันสำหรับไฟล์เดียว สำหรับไดเร็กทอรีที่สมบูรณ์ฉันไม่รู้ว่าจะทำอย่างไร


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

1
ฉันรอดแล้ว ขอบคุณ.
Scott

ไม่จำเป็นต้องคัดลอกเนื้อหาของไฟล์เพียงคลิกขวาที่ไฟล์แล้วคลิก 'ย้อนกลับ' เพื่อกู้คืนกลับเป็นเวอร์ชันนั้น (แม้ว่าคุณจะลบไปแล้วก็ตาม)
n00b

7

วันนี้ฉันมีปัญหานี้

อย่างที่คนอื่นบอก git ไม่เก็บไฟล์

วิธีเดียวที่จะเลิกทำได้คือยูทิลิตี้ยกเลิกการลบ ฉันใช้ "extundelete" และกู้คืนทุกอย่าง แต่ระยะทาง / ระบบไฟล์ของคุณอาจแตกต่างกันไป


7

หากคุณกำลังทำงานกับ Eclipse หนึ่งในวิธีแก้ปัญหาที่เป็นไปได้คือการกู้คืนจากประวัติท้องถิ่นของ Eclipse


2
ฉันใช้ PyCharm และประวัติศาสตร์ท้องถิ่นช่วยฉันไว้
psychok7

1
สิ่งเดียวกันใน IntelliJ IDEA!
arthurakay

RubyMine ยังมีประวัติศาสตร์ท้องถิ่น ช่วยฉันด้วย!
Usman

เบราว์เซอร์ IntelliJ ทั้งหมดมีประวัติท้องถิ่น ขอบคุณ ฉันใช้ WebStorm และมีอาการโป่งพองก่อนที่จะพบว่า 3 วันที่หมดไปกับการทำงาน 12 ชั่วโมงและฉันคิดอย่างจริงจังว่าจะกระดกเหล้าหนัก ๆ สักขวดที่โต๊ะทำงาน
Josh Burgess

7

จริงใช่ ! เป็นไปได้! แต่ไม่ต้องใช้คำสั่ง git
ทั้งหมดที่เราต้องเป็นเพียงเครื่องมือการกู้คืนไฟล์เช่นRecuva
เพียงแค่พูดถึงเส้นทางจากตำแหน่งที่ถูกลบและปล่อยให้กู้คืนไฟล์

นอกจากนี้ยังมีบันทึกย่อที่เป็นประโยชน์สำหรับการใช้แอพนั้น

  1. ฉันขอแนะนำให้คุณทำเครื่องหมายในช่องนี้ก่อนที่จะกู้คืนไฟล์ (เมื่อไฟล์ที่ถูกลบปรากฏในหน้าต่างการกู้คืน):
    Advanced Mode-> Options-> Actions-> Restore folder structure
    ด้วยสิ่งนี้ไฟล์ทั้งหมดของคุณจะได้รับการกู้คืนโดยการรักษาโครงสร้างโฟลเดอร์ดังนั้นมันจะง่ายขึ้นมาก เพียงลากและวางโฟลเดอร์นั้นไปยังเส้นทางจากจุดที่ถูกลบ
  2. ติดตั้งเครื่องมือการกู้คืนบนอุปกรณ์ USB เป็นที่นิยมมาก (เนื่องจากคำเตือนด้านล่าง)
  3. ในขณะที่ระบุตำแหน่งที่จะกู้คืนไฟล์ให้หลีกเลี่ยงการเลือกไดรฟ์เดียวกันจากที่ที่ไฟล์ถูกลบ (อีกครั้งเนื่องจากคำเตือนที่ระบุไว้ด้านล่าง) เนื่องจากไฟล์ที่กู้คืนในปัจจุบันอาจเขียนทับไฟล์อื่นที่ถูกลบซึ่งยังไม่ได้รับการกู้คืน การกู้คืนไฟล์ลงในไดรฟ์ USB เป็นวิธีแก้ปัญหาที่ดีเสมอ

คำเตือน! ทันทีที่คุณสูญเสีย (ลบโดยไม่ได้ตั้งใจ) ไฟล์ใด ๆ พยายามอย่าแตะ (เพิ่ม / แก้ไขไฟล์) ไดรฟ์จากจุดที่ถูกลบเพื่อเพิ่มความเป็นไปได้ในการกู้คืนที่สำเร็จ มิฉะนั้นคุณอาจสูญเสียไฟล์นั้นไปโดยสิ้นเชิง

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


1
ขอบคุณที่ช่วยชีวิตฉัน ฉันไม่รู้ว่ามันเป็นคำตอบที่ถูกต้องหรือไม่ฉันไม่สามารถกู้คืนทุกอย่างได้ แต่ฉันโชคดีที่ได้ไฟล์ที่สำคัญที่สุดที่ฉันต้องการ
XzaR

2

ฉันใช้รหัสฉันควรจะเพิ่มลงในที่เก็บของฉันและฉันล้างด้วย -dfx ฉันสามารถกู้คืนไฟล์ได้

ฉันพยายามใช้ debugfs ดูและเชื่อมโยงจาก inodes, testdisk และเครื่องมืออื่น ๆ อีกมากมายที่ปรากฏขึ้นและไม่มีใครพบไดเร็กทอรีที่เขียนโง่ ๆ นี้ได้ถูกลบโดยไม่ได้ตั้งใจ

ดาวน์โหลดextundeleteจาก sourceforge
คุณอาจจะต้องติดตั้งแพคเกจ e2fslibs-dev
Run

$ ./configure 
$ make 

มันจะสร้างไบนารีสำหรับ extundelete ภายในโฟลเดอร์ src ในกรณีของฉันฉันลบโฟลเดอร์ผิด เรียกว่า FOOBAR

ฉันเพิ่งวิ่ง:

$  sudo ./extundelete --restore-directory <full path to FOOBAR > <the partition> 


และสร้างโฟลเดอร์ชื่อ RESTORED_FOLDERS


ว้าว! แม้ว่าจะไม่สามารถกู้คืนไฟล์ที่ฉันต้องการได้ แต่ก็เป็นสิ่งที่ฉันจะจดบันทึกไว้ - จะมีประโยชน์อย่างแน่นอน!
vyom

1

หากคุณกำลังใช้คอมไพล์กับ MSBuild git clean -xdfฉันสร้างเป้าหมายที่สำเนาไฟล์ทั้งหมดและจากนั้นไม่ได้ ด้วยวิธีนี้คุณสามารถกู้คืนไฟล์ได้อย่างง่ายดายหากคุณทราบว่าคุณได้ลบสิ่งที่คุณไม่ต้องการลบ ดูที่นี่: http://blog.3d-logic.com/2012/11/04/safe-git-clean-with-msbuild/


1

หากคุณใช้ mac และสำรองข้อมูลด้วย a Time Machineคุณสามารถกู้คืนได้


0

โชคดีที่ฉันทำผิดพลาดขณะใช้ Windows 7 ไปที่ถังรีไซเคิลไฮไลต์ไฟล์ที่ถูกลบทั้งหมดแล้วคลิก "คืนค่า" เสร็จสิ้น


6
คุณหมายถึงอะไร? git cleanไม่ย้ายไฟล์ไปที่ถังรีไซเคิล
MEMark

0

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

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