จะเปลี่ยน“ git rm -r.” กลับคืนได้อย่างไร?


378

ฉัน accidentely git rm -r .กล่าวว่า ฉันจะกู้คืนจากสิ่งนี้ได้อย่างไร

ฉันไม่ได้กระทำ

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

แก้ไข:ฉันสามารถ (ถ้าฉันรู้ว่าคำสั่ง) กลับไปใช้ความมุ่งมั่นล่าสุด git rm -r .แต่มันอาจจะดีขึ้นมากถ้าฉันเพียงแค่อาจจะยกเลิกการ git rm -r .เพราะฉันไม่ได้จริงๆว่าสิ่งที่ฉันได้หลังจากที่ผ่านมากระทำและก่อนที่จะ


3
สำหรับคำถามนี้ให้รีเซ็ต - ฮาร์ดเป็นทางออกที่ดี ... มีอยู่แล้วในรายการดังนั้นฉันจะพูดถึงในความคิดเห็นนี้ว่าคุณอาจต้องการตรวจสอบเอกสารสำหรับ git-reflog
วิลเลียม Pursell

8
โปรดทราบว่าเนื่องจากคุณไม่ได้จัดหา-fให้กับgit rmgit จะไม่ได้ลบไฟล์ใด ๆ ที่มีการเปลี่ยนแปลงตามขั้นตอนหรือไม่มีการเปลี่ยนแปลงดังนั้น a git reset; git checkout .ควรกู้คืนทุกสิ่ง
CB Bailey

เพียงระวัง - ชำระเงินคอมไพล์ จะลบล้างการเปลี่ยนแปลงที่ไม่ได้จัดทำทั้งหมด
PeterB

1
ฉันเพิ่งทำอะไรแบบนี้และฉันไม่เข้าใจว่าทำไมไฟล์ในเครื่องของฉันถึงที่ไหนที่ถูกลบ (และอย่าง OP ฉันยังไม่ได้ทำ)
Xonatron

ด้วย Git 2.23+ (สิงหาคม 2019) คุณจะเรียกคืนไฟล์ที่มี:git restore git restore -s@ -SW -- .ดูคำตอบของฉันด้านล่าง
VonC

คำตอบ:


468
git reset HEAD

ควรทำอย่างไร หากคุณไม่มีการเปลี่ยนแปลงใด ๆ ที่คุณไม่สนใจ

git reset --hard HEAD

ควรบังคับให้ทุกอย่างรีเซ็ตเป็นการกระทำครั้งสุดท้ายของคุณ หากคุณมีการเปลี่ยนแปลงแบบไม่มีข้อผูกมัด แต่คำสั่งแรกไม่ทำงานให้บันทึกการเปลี่ยนแปลงแบบไม่มีข้อผูกมัดด้วยgit stash:

git stash
git reset --hard HEAD
git stash pop

22
โปรดทราบว่าgit reset --hard HEADจะทำลายการเปลี่ยนแปลงที่เป็นประโยชน์ใด ๆ ที่คุณทำในไดเรกทอรีหลักของไดเรกทอรีการทำงานปัจจุบัน
Alex Brown

10
@ อ่อน: ฉันยังคงสวมเหงื่อเย็น!
hoipolloi

6
ฉันไม่ได้ลงคะแนน แต่ฉันเพียงแค่พยายามสะสมรีเซ็ตฮาร์ดป๊อปและสูญเสียการเปลี่ยนแปลงล่าสุดทั้งหมดของฉัน บางทีฉันอาจตอบผิด
Greg M. Krsak

1
มันใช้งานไม่ค่อยได้สำหรับฉันและฉันดีใจที่ฉันทำงานในโฟลเดอร์ Dropbox รูปร่างแย่ แต่ช่วยฉันทุกครั้ง ...
นูบี้

3
เมื่อฉันทำคอมไพล์ stash pop มันเพิ่งลบไฟล์อีกครั้งแน่นอนเพราะมันหยุดความจริงที่ว่าฉัน (บังเอิญ) ลบไฟล์บางไฟล์ คำตอบนี้ใช้ไม่ได้หากคุณมีการเปลี่ยนแปลงที่คุณไม่ต้องการ
sudo

252

ฉัน git-rm'd ไฟล์ไม่กี่และดำเนินการเปลี่ยนแปลงก่อนที่จะกระทำต่อไปของฉันเมื่อฉันรู้ว่าฉันต้องการบางไฟล์เหล่านั้นกลับมา แทนที่จะซ่อนและรีเซ็ตคุณสามารถเช็คเอาต์แต่ละไฟล์ที่คุณพลาด / ลบได้ถ้าคุณต้องการ:

git checkout HEAD path/to/file path/to/another_file

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


6
สิ่งนี้ช่วยได้เพราะฉันมีการเปลี่ยนแปลงอื่น ๆ ที่ไม่มีข้อผูกมัด
ด่าน

4
คำตอบนี้จะช่วยให้สำหรับพวกเราที่เจอคำถามนี้มองย้อนกลับไปที่เดียวgit rmมากกว่า git rm -rrecursive สำหรับการลบแบบเรียกซ้ำทั้งหมดโซลูชันอื่นอาจดีกว่าขึ้นอยู่กับจำนวนไฟล์ที่ถูกลบ
tresf

คุณคนของฉันสมควรได้รับรางวัล
ซาลามิต

ถ้าฉันสามารถฉันจะคลิกมันขึ้นมา 100.Times !!!
Wagner Braga

57

ในการเรียกคืนไฟล์หรือโฟลเดอร์บางไฟล์อาจใช้สิ่งต่อไปนี้

git reset -- path/to/file
git checkout -- path/to/file

การทำเช่นนี้จะสร้างรายการดัชนีpath/to/fileขึ้นใหม่และสร้างไฟล์ใหม่เหมือนHEADเดิม

คำแนะนำ: คำสั่งหนึ่งอาจส่งแฮชการคอมมิตไปยังทั้งสองคำสั่งเพื่อสร้างไฟล์จากการคอมมิชชันเก่า ดูgit reset --helpและgit checkout --helpสำหรับรายละเอียด


คำตอบที่ดีที่สุด การผ่าตัด 'เลิกทำ' ง่าย ๆ เพียงครั้งเดียวgit rmโดยไม่ต้องทำการเปลี่ยนแปลงอื่น ๆ
wberry

ช่วยฉันออกไป! คำตอบที่ดีที่สุด
Akram

28

ปรับปรุง:

เนื่องจากgit rm .ลบไฟล์ทั้งหมดในไดเร็กทอรีนี้และไดเร็กทอรีย่อยในเช็กเอาต์ที่ใช้งานได้และในดัชนีคุณต้องเลิกทำการเปลี่ยนแปลงแต่ละรายการดังนี้:

git reset HEAD . # This undoes the index changes
git checkout .   # This checks out files in this and child directories from the HEAD

สิ่งนี้ควรทำในสิ่งที่คุณต้องการ ไม่ส่งผลกระทบกับโฟลเดอร์พาเรนต์ของรหัสหรือดัชนีที่ชำระเงินของคุณ


คำตอบเก่าที่ไม่ได้:

reset HEAD

จะทำเคล็ดลับและจะไม่ลบการเปลี่ยนแปลงใด ๆ ที่คุณไม่ได้ทำกับไฟล์ของคุณ

หลังจากนั้นคุณต้องทำซ้ำใด ๆ git addคำสั่งคุณได้เข้าคิว


1
ขออภัยฉันมักจะติดตั้งgit alias.co="checkout"เพื่อgit coชำระเงิน
Alex Brown

25

หากคุณไม่ได้ทำงานดังกล่าวข้างต้นคุณอาจสามารถดึงข้อมูลโดยใช้คำแนะนำจากที่นี่: http://www.spinics.net/lists/git/msg62499.html

git prune -n
git cat-file -p <blob #>

4 ปีต่อมายังคงเป็นผู้ช่วยชีวิต!
ThievingSix

ฉันเขียนโปรแกรม c ++ เพื่อเชื่อมผลลัพธ์ (ฉันมีวัตถุ 100 ชิ้นที่ห้อยอยู่ใน repo ของฉันทำให้สิ่งนี้จำเป็น) เพียงรวบรวมและเรียกใช้จากนั้นส่งผ่านไดเรกทอรีท้องถิ่นของคุณ git repo raw.githubusercontent.com/bluuman/git-recover-files/master/…
James Meas

14

เลิกทำ rm

git rm file             # delete file & update index
git checkout HEAD file  # restore file & index from HEAD

เลิกคอมไพล์ rm -r

git rm -r dir          # delete tracked files in dir & update index
git checkout HEAD dir  # restore file & index from HEAD

เลิกคอมไพล์ rm -rf

git rm -r dir          # delete tracked files & delete uncommitted changes
not possible           # `uncommitted changes` can not be restored.

Uncommitted changesรวมถึงnot staged changes, staged changes but not committed.


แน่นอนว่าไม่มีสิ่งใดที่สามารถเลิกทำได้git rm -rfเนื่องจากอาจลบไฟล์ที่ไม่ได้ติดตามหรือจัดฉาก (เฉพาะ) เช่นกัน
jpaugh

git rm -rf fileและgit rm -rf dirจะไม่ลบไฟล์ที่ไม่ได้ติดตามใด ๆ
เพลง xu

10

หากคุณยอมรับและผลักดันการเปลี่ยนแปลงคุณสามารถทำได้เพื่อรับไฟล์กลับ

// Replace 2 with the # of commits back before the file was deleted.
git checkout HEAD~2 path/to/file

สิ่งนี้ใช้ได้กับ 'การเปลี่ยนแปลงที่จะเกิดขึ้น:' ซึ่งไฟล์ถูกลบออกจาก git cherry-pick ซึ่งฉันยังต้องการอยู่ฉันลอง git reset HEAD ~ <number> <file> ซึ่งใช้งานไม่ได้
mushcraft

7

มีคำตอบที่ดีอยู่แล้ว แต่ฉันอาจแนะนำให้ใช้ไวยากรณ์เล็กน้อยที่ใช้งานได้ดี แต่มีความชัดเจนมากในสิ่งที่คุณต้องการ (ไม่น่ากลัวหรือลึกลับ)

git checkout <branch>@{"20 minutes ago"} <filename>

3

รับรายการกระทำ

git log  --oneline

ตัวอย่างเช่นการกระทำที่เสถียรมีแฮ: 45ff319c360cd7bd5442c0fbbe14202d20ccdf81

git reset --hard 45ff319c360cd7bd5442c0fbbe14202d20ccdf81
git push -ff origin master

1

ฉันมีสถานการณ์ที่เหมือนกัน ในกรณีของฉันการแก้ปัญหาคือ:

git checkout -- .


-1

ฉันมีปัญหาเดียวกันทั้งหมดนั่นคือการล้างโฟลเดอร์การจัดเรียงและย้ายไฟล์ ผมเข้า: RM และกด Enter; และรู้สึกว่าลำไส้ของฉันคลายน้อยลง โชคดีที่ฉันไม่ได้พิมพ์คอมไพล์เลย -m "" ทันที

อย่างไรก็ตามคำสั่งดังต่อไปนี้

git checkout .

คืนค่าทุกอย่างและช่วยชีวิตฉัน

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