คอมไพล์กู้คืนไฟล์ที่ถูกลบโดยที่ไม่ได้กระทำหลังจากลบ


812

ฉันลบบางไฟล์

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

ฉันต้องการรีเซ็ตพื้นที่ทำงานของฉันเพื่อกู้คืนไฟล์

git checkout .ผม

แต่ไฟล์ที่ถูกลบยังคงหายไป

และgit statusแสดงให้เห็นว่า:

# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   deleted:    cc.properties
#   deleted:    store/README
#   deleted:    store/cc.properties
#

ทำไมไม่git checkout .ตั้งค่าพื้นที่ทำงานเพื่อHEAD?


16
หากคุณไม่ได้จัดเตรียมการเปลี่ยนแปลงหลังจากลบแล้วgit checkout .ก็น่าจะใช้ได้ดี
faizal

10
@faizal และคุณจะสูญเสียการเปลี่ยนแปลงหากคุณทำเช่นนั้น
Vasiliy Yorkin

1
เพียงกด Ctrl-J ใน git gui บนรายการที่ถูกลบ
ajeh

git checkout - cc.properties store / README store / cc.properties
Vinod Pasi

ดูคำตอบนี้: quora.com/…
รักสด

คำตอบ:


787

ผลลัพธ์จะบอกคุณว่าคุณต้องทำอะไร git reset HEAD cc.propertiesเป็นต้น

นี่จะเป็นการหยุดการทำงานของ rm หลังจากนั้นการเรียกใช้git statusอีกครั้งจะบอกคุณว่าคุณต้องทำgit checkout -- cc.propertiesเพื่อให้ได้ไฟล์กลับมา

อัปเดต: ฉันมีสิ่งนี้ในไฟล์ปรับแต่งของฉัน

$ git config alias.unstage
reset HEAD

ซึ่งฉันมักจะใช้เพื่อแสดงความไม่แน่นอน


5
คุณจะทำเช่นนี้สำหรับไฟล์ที่ถูกลบหลาย ๆ ไฟล์ได้อย่างไร การเรียกใช้การรีเซ็ต git HEAD <<filename>> หลาย ๆ ครั้งจะยุ่งยากวิธีที่มีประสิทธิภาพในการทำให้เสร็จหรือไม่
SubSul

70
git reset HEAD \*แล้วgit checkout -- .
Noufal Ibrahim

3
แต่ฉันมีไฟล์ที่แก้ไขแล้ว
Jiang YD

@RauliRajande เป็นไปได้ว่าสถานการณ์ของคุณจะแตกต่างจากที่อธิบายไว้ในคำถามเดิม
Noufal Ibrahim

1
rm -r ./engines- อ๊ะ git reset engines; git checkout enginesตอนนี้
กริช

209

คุณได้ลบขั้นตอนแล้วดังนั้นคุณต้องทำ:

git checkout HEAD cc.properties store/README store/cc.properties

git checkout . เช็กเอาต์จากดัชนีที่การลบถูกจัดฉากแล้วเท่านั้น


177

แค่ทำ git checkout path/to/file-I-want-to-bring-back.txt


8
ใช้งานได้เฉพาะเมื่อไฟล์ไม่ได้รับการยืนยันและส่ง
mahen3d

23
ไม่ได้ผลสำหรับฉัน git กล่าวว่าไม่ทราบชื่อไฟล์แม้ว่าไฟล์นั้นจะถูกติดตาม ฉันไม่ได้ทำเช่นนั้นฉันเพียงลบไฟล์โดยใช้เมนูบริบทของ netbeans อย่างไม่เหมาะสม
Zelphir Kaltstahl

4
@Zelphir +1error: pathspec 'file.ext' did not match any file(s) known to git.
Ivan Borshchov

@ user3479125 ฉันเดาว่าไฟล์ของคุณไม่เคยได้รับคำตอบ มันgit statusพูดเกี่ยวกับอะไร?
ki92

12
สถานะ Git แสดงเป็นสีเขียว "ไฟล์ที่ถูกลบแล้ว" git checkout HEAD -- file.extช่วยในการกู้คืน
Ivan Borshchov

143

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

git ls-files -z -d | xargs -0 git checkout --

ในการกู้คืนการลบที่จัดฉากทั้งหมดในคราวเดียวโดยอัตโนมัติโดยไม่ระบุแต่ละพา ธ :

git status | grep 'deleted:' | awk '{print $2}' | xargs git checkout --

12
ฉันลบไฟล์มากกว่า 500 ไฟล์โดยไม่ตั้งใจและนี่เป็นวิธีการรักษาเพราะมันยังเก็บการเปลี่ยนแปลงที่ถูกต้องทั้งหมดของฉันไว้ (บรรทัดแรกคือสิ่งที่ฉันใช้) ขอบคุณ
Guy Lowe

1
ลบเนื้อหาทั้งหมดของ repo โดยไม่ได้ตั้งใจหลังจากสร้างสำเร็จ คำสั่งแรกบันทึกเบคอนของฉัน
MonaLisaOverdrive

2
git status --long | grep 'deleted:' | awk '{print $2}' | xargs git reset HEAD --ก่อนหน้านี้จะทำงานสำหรับฉันฉันต้องวิ่ง
Ian Dunn

1
มีประโยชน์มากต้องการเก็บไฟล์ที่ไม่ได้ติดตาม แต่กำจัดลบและแก้ไขเพียงแค่เปลี่ยน -d เป็น -m สำหรับจัดการการแก้ไข
RaisinBranCrunch

5
หมายเหตุสิ่งนี้ไม่ทำงานหากคุณมีช่องว่างในชื่อไฟล์ / พา ธ ฉันคิดว่าgit ls-files -d | sed -e "s/\(.*\)/'\1'/" | xargs git checkout --จะทำงาน
parsley72

79

เนื่องจากคุณกำลังทำอยู่git checkout .ดูเหมือนว่าคุณกำลังพยายามกู้คืนสาขาของคุณกลับไปสู่สถานะการส่งมอบครั้งล่าสุด

คุณสามารถบรรลุเป้าหมายนี้ได้ด้วย git reset HEAD --hard

คำเตือน

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


39
Woww !! ระวังเรื่องนี้ !!!! คุณอาจพูดถูก แต่ใครบางคนอาจสับสนและระเบิดรหัสทั้งหมดของพวกเขา มันจะเจ๋งถ้าคุณเพิ่มคำเตือนที่ใหญ่กว่า
santiagobasulto

3
นี่คือสิ่งที่ฉันต้องการ ไม่ระเบิดรหัสทั้งหมดของคุณ - เพียงแค่นำคุณกลับสู่การกระทำครั้งล่าสุดของคุณ
Andrew Hendrie

2
ฉันจบด้วยไฟล์ที่หายไปหลายร้อยไฟล์ในคราวเดียว นี่เป็นวิธีการปฏิบัติที่สามารถแก้ไขปัญหาได้ ขอบคุณ!
Jonathan Benn

66

ถ้าคุณใช้

git rm filename

เพื่อลบไฟล์

git checkout path/to/filename

ไม่ทำงานดังนั้นในกรณีนี้

git checkout HEAD^ path/to/filename

ควรทำงาน


2
ฉันชอบคำตอบนี้ ไม่ต้องสงสัยเลยว่าคุณกำลังส่งผลกระทบต่อเพียงเฉพาะไฟล์ที่คุณถอดออก 1) เส้นทางเช็คเอาต์คอมไพล์ / ถึง / ชื่อไฟล์ 2) เช็คเอาต์คอมไพล์ - เส้นทาง / ถึง / ชื่อไฟล์
Ed of the Mountain

ยอดเยี่ยม git checkout HEAD^ path/to/filenameทำงานให้ฉันตั้งแต่ฉันไม่ได้ยืนยันไฟล์
โมเสส Ndeda

29

นี่คือคำสั่งที่ช่วยฉันใน mac ของฉัน ฉันพยายามแก้ไขปัญหาอื่น ๆ สองสามข้อ แต่ไม่ได้ผลสำหรับฉัน

เวอร์ชัน Git บน OSX Mavericks

mac-pro:main chris$ git version
git version 1.8.5.2 (Apple Git-48)

คำสั่ง

git checkout HEAD -- path/to/file/file.cc


18

ใช้git ls-filesเพื่อลบไฟล์ที่ลบ (-d) หรือแก้ไข (-m)

git checkout $(git ls-files -d)

ดูฉันจะกู้คืนเฉพาะไฟล์ที่แก้ไขในการชำระเงิน git ได้อย่างไร


ดีกว่าและเรียบง่ายกว่าโซลูชันอื่น ๆ
joshi123

1
git ls-files -d | xargs -I{} git checkout "{}"ถ้าบางไฟล์มีพื้นที่ที่คุณสามารถทำได้
Jean Paul

17

หากคุณต้องการกู้คืนไฟล์ทั้งหมดในครั้งเดียว

จำไว้ว่าให้ใช้ช่วงเวลาเพราะจะบอกให้คอมไพล์ทำการคว้าไฟล์ทั้งหมด

คำสั่งนี้จะรีเซ็ตหัวและยกเลิกการเปลี่ยนแปลงทั้งหมด:

$ git reset HEAD . 

จากนั้นเรียกใช้สิ่งนี้เพื่อกู้คืนไฟล์ทั้งหมด:

$ git checkout .

จากนั้นทำสถานะคอมไพล์คุณจะได้รับ:

$ git status
On branch master
Your branch is up-to-date with 'origin/master'.

นี่เป็นวิธีการแก้ปัญหาที่ง่ายที่สุดและทำงานกับไฟล์จำนวนมาก (สมมติว่าคุณลบหลายไฟล์ / โฟลเดอร์) good job dude +
Gkiokan

9

คุณอยากเห็นไหม สิ่งนี้

ที่ไปสำหรับกรณีที่คุณใช้

git checkout -- .

ก่อนที่คุณจะทำอะไรสักอย่าง

คุณอาจต้องการกำจัดไฟล์ที่สร้างขึ้นซึ่งยังไม่ได้สร้างขึ้น และคุณไม่ต้องการพวกเขา ด้วย:

git reset -- .

คุณไม่ได้รายงานคำตอบที่คุณคัดลอกอย่างสมบูรณ์ ในความเป็นจริงไม่ได้ช่วยในการกู้คืนไฟล์ที่ถูกลบและเทียบเท่ากับสิ่งที่พยายามถาม:git checkout -- . git checkout .ส่วนที่สามารถทำงานได้คือชิ้นส่วนที่คุณไม่ได้คัดลอก: git checkout <file_path>.
Jean Paul

6

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

$ git reset <commitid#-where-file.cpp-existed> file.cpp

ฉันต้องทำอีกขั้นตอนหนึ่งนอกเหนือจากการรีเซ็ตเพื่อนำไฟล์กลับมา:

$ git checkout -- file.cpp

4

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

git stash
git stash clear
git clean 

การวางมันลงบนสแต็กสแต็กไม่ใช่วิธีแก้ปัญหา มันเป็นแฮ็ค
Robert Dolca

2
นี่เป็นทางออกที่ดีเพราะคุณสามารถลบออกจากที่เก็บ ถ้าแฮ็คหรือไม่มันเป็นเรื่องของรสนิยม ความคิดทั้งหมดของการสะสมเป็นแฮ็คที่ฉลาด
Eino Mäkitalo

@ EinoMäkitaloดีใจที่มันอาจจะช่วยให้คุณ :)
ริก

ฉันชอบวิธีนี้ดีที่สุดของทั้งหมดที่ระบุไว้
ckapilla


3

นี่คือกรณีที่แตกต่างกันเป็นข้อมูลอ้างอิงเพื่อช่วยเหลือผู้อื่น:

หากการลบยังไม่ได้รับการยืนยันคำสั่งด้านล่างจะคืนค่าไฟล์ที่ถูกลบในแผนผังการทำงาน

$ git checkout -- <file>

คุณสามารถรับรายชื่อของไฟล์ที่ถูกลบทั้งหมดในแผนผังการทำงานโดยใช้คำสั่งด้านล่าง

$ git ls-files --deleted

หากการลบถูกคอมมิตให้ค้นหาการคอมมิชชันที่เกิดขึ้นจากนั้นกู้คืนไฟล์จากการคอมมิชชันนี้

#find the commit hash where it had this file deleted
$ git rev-list -n 1 HEAD -- <file>

มันควรให้อะไรกับc46e81aa403ecb8a0f7a323a358068345คุณตอนนี้ใช้ commit # ที่นี่

$ git checkout <commit>^ -- <file>

บางสิ่งเช่นนี้: $ git checkout c46e81aa403ecb8a0f7a323a358068345 -

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

$ git log --diff-filter=D --summary

หากคุณต้องการแสดงรายการไฟล์:

git log --diff-filter=D --summary | grep "delete mode"

2

สำหรับฉันทำงานอะไรได้ git checkout {SHA1 of commit with version to restore} "{path to file to restore}"

ตัวอย่างเช่น git checkout 5a6b3179e58edff9c90326b9a04284b02fd67bd0 "src-ui/views/includes/radar.pug"

(ดำเนินการในสาขาที่เราต้องการให้ไฟล์เข้าไป)

หลังจากคำสั่งนั้นดำเนินการไฟล์ที่กู้คืนจะมีอยู่ในตำแหน่งเดิม (ซึ่งจะต้องมี comited)


และ / หรือเพียงแค่git checkout master path/to/the/file.binให้คุณยกเลิกการลบไฟล์นั้นโดยไม่สูญเสียการเปลี่ยนแปลงอื่น ๆ ที่คุณทำ PS: นี่ควรเป็นคำตอบที่ได้รับการยอมรับ ...
Edoardo

1

หากคุณติดตั้ง ToroiseGIT แล้วให้เลือกรายการเมนู "ย้อนกลับ ... " สำหรับป๊อปอัพโฟลเดอร์หลัก


1

1. ค้นหาข้อผูกพันที่คุณต้องการเปลี่ยนกลับโดยใช้:

   git log
This command will give you a list of commits done by you .

2. คำนึงถึงการกระทำโดยใช้:

    git revert <commit id> 

ตอนนี้คุณสาขาท้องถิ่นจะมีไฟล์ทั้งหมดโดยเฉพาะ


มันจะทำงานถ้าคุณได้ยอมรับการเปลี่ยนแปลงของคุณแล้ว
รักสด

1

ข้อควรระวัง: กระทำการใด ๆ ที่คุณต้องการเก็บไว้ก่อน

คุณสามารถรีเซ็ตพื้นที่ทำงานของคุณ (และกู้คืนไฟล์ที่ถูกลบ)

git checkout ./*

2
FYI ... คำสั่งนี้ลบไฟล์ทำงานทั้งหมดของฉันและไม่ได้กู้คืนไฟล์ที่ถูกลบ .. ระวัง
hendr1x

นั่นคือเหตุผลที่คุณใช้คำสั่งนี้เพื่อรีเซ็ตพื้นที่ทำงานของคุณ ฉันคิดว่ามันจะอธิบายตัวเอง
Henrique Florêncio

1
./*คำสั่งที่ไม่ได้ทำงานเพราะถ้าไฟล์ถูกลบออกก็จะไม่ถูกจับโดย
Jean Paul

@JeanPaul บางทีฉันอาจเข้าใจผิด แต่มันทำให้พื้นที่ทำงานของฉันอยู่ในสถานะเดิม (ปัจจุบันมีการลบไฟล์)
Marc

@ Marc มันสามารถทำงานได้ แต่ถ้าไม่มีไฟล์ที่มองเห็นในไดเรกทอรีเพราะมิฉะนั้น./*จะถูกขยายโดย bash เพื่อจับคู่ไฟล์เหล่านั้นก่อนที่จะถูกส่งไปยังคอมไพล์
Jean Paul

0

ฉันมีปัญหาเดียวกัน แต่ไม่มีวิธีแก้ไขปัญหาใดที่ได้ผลสำหรับฉัน สิ่งที่ฉันทำคือ:
- สร้างไฟล์ว่างที่มีชื่อเดียวกัน
- เปรียบเทียบไฟล์นี้กับประวัติท้องถิ่น
- คัดลอกประวัติข้ามเป็นไฟล์ว่างเปล่า


-1

ฉันมีปัญหาเดียวกันและไม่มีคำตอบที่นี่ฉันพยายามทำงานให้ฉันด้วย ฉันใช้ Intellij และฉันได้ตรวจสอบสาขาใหม่git checkout -b minimalExampleเพื่อสร้าง "ตัวอย่างน้อยที่สุด" ในสาขาใหม่ของปัญหาบางอย่างโดยการลบไฟล์จำนวนมากและแก้ไขกลุ่มอื่น ๆ ในโครงการ แต่ถึงแม้ว่าฉันจะไม่ยอมรับการเปลี่ยนแปลงใด ๆ ในสาขา "ตัวอย่างเล็ก ๆ น้อย ๆ " ใหม่เมื่อฉันตรวจสอบสาขา "ดั้งเดิม" ของฉันอีกครั้งการเปลี่ยนแปลงและการลบทั้งหมดจากสาขา "ตัวอย่างน้อยที่สุด" ได้เกิดขึ้นใน " สาขาเดิม "ด้วย (หรือปรากฏขึ้น) ตามที่git statusไฟล์ที่ถูกลบเพิ่งหายไปจากทั้งสองสาขา

โชคดีแม้ว่า Intellij เตือนฉันว่า "การลบไฟล์เหล่านี้อาจไม่สามารถกู้คืนได้อย่างสมบูรณ์" แต่ฉันสามารถกู้คืนไฟล์เหล่านั้นได้ (ในสาขาตัวอย่างน้อยที่สุดที่พวกเขาถูกลบจริง) โดยการคลิกขวาที่โครงการและเลือกประวัติท้องถิ่น > แสดงประวัติ (จากนั้นกู้คืนในรายการประวัติล่าสุดที่ฉันต้องการ) หลังจาก Intellij กู้คืนไฟล์ในสาขา "ตัวอย่างน้อยที่สุด" ฉันผลักสาขาให้กำเนิด จากนั้นฉันเปลี่ยนกลับไปเป็นสาขา "ดั้งเดิม" ในท้องถิ่นของฉันและวิ่งgit pull origin minimalExampleไปรับพวกเขากลับมาที่สาขา "ดั้งเดิม" ด้วย

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