กู้คืนโฟลเดอร์ที่ถูกลบใน Git repo


101

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

ดังนั้นฉันจึงทำการค้นคว้าและเห็นว่าคุณสามารถเปลี่ยนไฟล์กลับคืนมาได้โดยทำ git checkout <revision> -- <name of file>

แต่ใช้ได้กับไฟล์เท่านั้น

ฉันจะดึงไฟล์ทั้งหมดในไดเร็กทอรีได้อย่างไร?


1
git statusจะให้คำแนะนำเกี่ยวกับคำสั่งที่จะเรียกใช้
Tavian Barnes

1
ดูเหมือนว่าคุณยังมีไดเร็กทอรีเก่าใน repo ระยะไกลของคุณ (และอาจมีอยู่ใน repo ในพื้นที่ของคุณด้วย) คำแนะนำที่แข็งแกร่ง: 1) ทำการ "ดึง" จาก repo ระยะไกลของคุณไปยังrepo ใหม่ (อย่าสร้างความเสียหายให้กับ repo ในพื้นที่ของคุณอีกต่อไป) 2) ลอง "เช็คเอาต์" ... หรือแม้แต่ "ย้อนกลับ" ในใหม่ของคุณท้องถิ่น repo: atlassian.com/git/tutorials/undoing-changes/git-revert 3) อัปเดต repo ระยะไกลเมื่อคุณแน่ใจว่าทุกอย่างเรียบร้อย
paulsm4

คำตอบ:


255

ทุกสิ่งที่คุณทำได้กับไฟล์คุณสามารถทำกับโฟลเดอร์ได้เช่นกัน

โปรดทราบว่าค้นหาและกู้คืนไฟล์ที่ถูกลบในที่เก็บ Git


ไฟล์จะถูกลบออกจากโครงสร้างการทำงาน แต่ยังไม่ได้คอมมิต:

หากคุณยังไม่ได้สร้างดัชนี ( git add) การเปลี่ยนแปลงของคุณคุณสามารถเปลี่ยนกลับเนื้อหาของไดเร็กทอรีได้:

git checkout -- path/to/folder

หากการลบถูกจัดทำดัชนีไว้แล้วคุณควรรีเซ็ตก่อน:

git reset -- path/to/folder
git checkout -- path/to/folder


กู้คืนโครงสร้างการทำงานทั้งหมด (ไม่ใช่โฟลเดอร์เดียว) แต่สูญเสียการเปลี่ยนแปลงที่ไม่ได้กำหนดไว้ทั้งหมด

git reset --hard HEAD


เมื่อไฟล์ถูกลบในการกระทำบางอย่างในอดีต:

ค้นหาการกระทำสุดท้ายที่ส่งผลต่อเส้นทางที่กำหนด เนื่องจากไฟล์ไม่ได้อยู่ในคอมมิต HEAD คอมมิตนี้จึงต้องลบทิ้ง

git rev-list -n 1 HEAD -- <file_path>

จากนั้นเช็คเอาต์เวอร์ชันที่คอมมิตก่อนโดยใช้^สัญลักษณ์คาเร็ต ( ):

git checkout <deleting_commit>^ -- <file_path>


เรียกคืนแผนผังการทำงานเต็มรูปแบบจากคอมมิตที่อยู่ห่างไกล

git reset --hard <revision> 

1
git checkout -- path/to/folder/* ใช้งานไม่ได้ หมายเหตุ: คำถามคือวิธีกู้คืนโฟลเดอร์ไม่ใช่ไฟล์
gman

@gman How can I retrieve all the files inside the directoryหมายถึงทั้งไดเร็กทอรีและไฟล์ แต่คำสั่งที่น่าสยดสยองก็ไม่ได้ผลสำหรับฉันเช่นกัน ฉันจำได้ว่าปีที่แล้ว
Nick Volynkin

2
@gman แต่มันใช้งานได้เหมือนgit checkout -- pathหรือgit checkout -- 'path/*'. ในตัวอย่างของคุณคุณลบโดยgit rmที่ OP ไม่ได้ทำ ฉันได้เพิ่มคำแนะนำสำหรับกรณีดังกล่าวแล้ว ขอบคุณ!
Nick Volynkin

3
ใน Windows คุณต้องใส่เครื่องหมายคำพูดดังนี้git checkout "<deleting_commit>^" -- <file_path>
Maor

มันยกเลิกการจัดเตรียมหลาย ๆ อย่างใน repo ทั้งหมดแม้ว่าฉันจะระบุโฟลเดอร์ในคำสั่งรีเซ็ต สิ่งนี้สมเหตุสมผลอย่างไร เมื่อฉันเรียกใช้การชำระเงินดูเหมือนว่าจะกู้คืนโฟลเดอร์ของฉัน ฉันไม่รู้ว่าขั้นตอนที่เหลือทำอะไรกับโค้ดที่เหลือของฉันอ่าความสุขของการจัดการพื้นที่เก็บข้อมูลแบบเพียร์ทูเพียร์ที่ใช้สำหรับที่เก็บข้อมูลส่วนกลางถอนหายใจ
Paul Kenjora

5

หากคุณยังไม่ได้ยอมรับการเปลี่ยนแปลงของคุณคุณสามารถเปลี่ยนกลับเนื้อหาหรือไดเรกทอรี:

git checkout -- removed_directory

หากคุณต้องการยกเลิกการเปลี่ยนแปลงทั้งหมดให้ทำดังนี้

git reset --hard HEAD

3
git checkout -- removed_directory ไม่ทำงาน
gman

git checkout -- removed_directoryได้ผลสำหรับฉัน แต่ฉันเคยสร้างไดเร็กทอรีนี้มาก่อน (โดยcheckoutไฟล์ใดไฟล์หนึ่งในไดเร็กทอรีนั้น) หลังจากสร้างไฟล์ทั้งหมดถูกกู้คืนในโฟลเดอร์โดยคำสั่งนี้
Boolean_Type

5

คุณสามารถกู้คืนไฟล์หรือโฟลเดอร์ด้วย git restore

git restore --source master~1 "PATH_IN_YOUR_REPO"

ที่นี่ master ~ 1 เปลี่ยนโฟลเดอร์ของคุณเป็นการแก้ไข "1" จากสาขาหลักของคุณ

ที่มา: https://git-scm.com/docs/git-restore


4

สิ่งเดียวที่ใช้ได้ผลสำหรับฉันคือการชำระเงิน repo ในโฟลเดอร์อื่น สมมติ repo /home/me/currentปัจจุบันอยู่ใน

แล้วฉันก็ทำ

git clone /home/me/current /home/me/temp

สิ่งนี้สร้างโคลนแยกต่างหากของ repo in /home/me/temp

ตอนนี้ฉันสามารถไป/home/me/tempและทำอะไรก็ได้ที่ฉันต้องการ ตัวอย่างเช่น

git reset --hard commit-hash-before-delete

ตอนนี้ฉันสามารถคัดลอกโฟลเดอร์ไฟล์ที่ถูกลบกลับได้

cp -r /home/me/temp/some/deleted/folder /home/me/current/some/deleted/folder

และลบโฟลเดอร์ temp

rm -rf /home/me/temp

ตัวอย่างของ

git checkout -- some/deleted/folder
git checkout -- some/deleted/folder/*

ไม่ทำงาน

$ git checkout -- some/deleted/folder/*
zsh: no matches found: some/deleted/folder/*
$ git checkout -- some/deleted/folder
error: pathspec 'some/deleted/folder' did not match any file(s) known to git.

ตัวอย่างอื่น ๆ เช่น

git reset --hard HEAD

จะทำลายมากกว่าแค่ไฟล์ที่ถูกลบ การเปลี่ยนแปลงอื่น ๆ จะสูญหายไปด้วย

ในทำนองเดียวกัน

git reset --hard some-commit

จะสูญเสียการกระทำใด ๆ หลังจากนั้น some-commit


2

ตั้งแต่ git 2.24.0 มีคำสั่ง git ใหม่ทดลอง: git restore

git restore --staged some/deleted/folder

มันแสดงให้ฉันเห็นคอมไพล์: 'restore' ไม่ใช่คำสั่ง git
Ahmed C

0

หากคุณไม่ระบุไฟล์ใดไฟล์หนึ่งคุณควรจะดึงเนื้อหาทั้งหมดของคอมมิตเฉพาะได้ ชอบ: git checkout 264794319e9695ba843cd6(สมมติว่าแฮชมีไฟล์ทั้งหมดของคุณในสถานะที่ถูกต้อง)

เหตุผลที่pullไม่กู้คืนไฟล์คือ git มองว่าการลบของคุณเป็นการเปลี่ยนแปลงล่าสุดโดยใช้สิ่งนั้นกับสิ่งที่คุณกำลังดึง

(ขอแนะนำให้ทดลองในสาขาใหม่)


0

หากคุณต้องการกู้คืนโฟลเดอร์ที่ถูกลบและคุณมีข้อตกลงอื่น ๆ หลังจากการลบคุณสามารถไปที่โครงการของคุณได้ที่ github.com

จาก github.com ไปที่คอมมิตสุดท้ายที่มีโฟลเดอร์ของคุณ คุณควรเห็นข้อความคอมมิตและทางด้านขวาจะมีปุ่ม "เรียกดูไฟล์" การคลิกสิ่งนี้จะนำคุณไปยังไฟล์ทั้งหมดจากขั้นตอนการคอมมิตนั้น

จากนั้นคุณสามารถโคลนรหัสหรือเพียงแค่ดาวน์โหลดรหัสเป็น zip


-1

สำหรับการลบโดยไม่ได้รับคำสั่งมันง่ายอย่างนี้:

git รีเซ็ต HEAD rel / path / to / delete / directory / *

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