git recovery tập tin bị xóa trong đó không có cam kết nào được thực hiện sau khi xóa


812

Tôi đã xóa một số tập tin.

Tôi chưa cam kết.

Tôi muốn đặt lại không gian làm việc của mình để khôi phục các tập tin.

Tôi đã làm một git checkout ..

Nhưng các tập tin bị xóa vẫn còn thiếu.

git statuscho thấy:

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

Tại sao không git checkout .thiết lập lại không gian làm việc HEAD?


16
nếu bạn không tổ chức các thay đổi của mình sau khi xóa, git checkout .sẽ hoạt động tốt.
faizal

10
@faizal và bạn sẽ mất những thay đổi nếu bạn làm điều đó.
Vasiliy Yorkin

1
Chỉ cần nhấn Ctrl-J trong git gui trên mục đã xóa.
ajeh

kiểm tra git - cửa hàng cc.properies / cửa hàng README / cc.properies
Vinod Pasi

Xem câu trả lời này: quora.com/ Kẻ
sống tình yêu

Câu trả lời:


787

Đầu ra cho bạn biết những gì bạn cần làm. git reset HEAD cc.propertiesVân vân.

Điều này sẽ bỏ qua hoạt động rm. Sau đó, chạy git statuslại sẽ cho bạn biết rằng bạn cần phải làm một git checkout -- cc.propertiesđể lấy lại tệp.

Cập nhật: Tôi có cái này trong tập tin cấu hình của tôi

$ git config alias.unstage
reset HEAD

mà tôi thường sử dụng để unstage công cụ.


5
Làm thế nào để bạn làm điều này cho nhiều tập tin bị xóa? Chạy git reset ĐẦU << tên tệp >> nhiều lần sẽ cồng kềnh, có cách nào hiệu quả để hoàn thành nó không?
SubSul

70
git reset HEAD \*và sau đógit checkout -- .
Noufal Ibrahim

3
nhưng tôi đã sửa đổi tập tin.
Giang YD

@RauliRajande Có thể tình huống của bạn khác với tình huống được mô tả trong câu hỏi ban đầu.
Noufal Ibrahim

1
rm -r ./engines- Giáo sư. Bây giờ git reset engines; git checkout engines.
Kris

209

Bạn đã dàn dựng phần xóa nên bạn cần thực hiện:

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

git checkout . chỉ kiểm tra từ chỉ mục nơi việc xóa đã được tổ chức.


177

Cứ làm đi git checkout path/to/file-I-want-to-bring-back.txt


8
chỉ hoạt động nếu các tập tin chưa được cam kết và đẩy.
mahen3d

23
Không làm việc cho tôi, git nói rằng nó không biết bất kỳ tệp nào theo tên đó, mặc dù tệp được theo dõi. Tôi cũng không cam kết, tôi chỉ xóa một tệp bằng menu ngữ cảnh của netbeans.
Zelphir Kaltstahl

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

@ user3479125 Tôi đoán tập tin của bạn không bao giờ được cam kết. Nó git statusnói gì về nó?
ki92

12
Trạng thái Git hiển thị "delated file.ext" màu xanh lá cây git checkout HEAD -- file.extđã giúp khôi phục nó.
Ivan Borshchov

144

Để khôi phục tất cả unstaged xóa cùng một lúc, tự động, mà không chỉ định mỗi con đường duy nhất:

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

Để tự động khôi phục tất cả các thao tác xóa theo giai đoạn , mà không chỉ định từng đường dẫn đơn lẻ:

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

12
Tôi đã vô tình xóa hơn 500 tệp và điều này có hiệu quả vì nó cũng giữ tất cả các thay đổi hợp lệ của tôi (dòng đầu tiên là những gì tôi đã sử dụng). Cảm ơn.
Guy Lowe

1
Vô tình xóa tất cả nội dung của một repo ngay sau khi xây dựng thành công. Lệnh đầu tiên đã cứu thịt xông khói của tôi.
MonaLisaOverdrive

2
Trước khi điều này làm việc cho tôi, tôi phải chạy git status --long | grep 'deleted:' | awk '{print $2}' | xargs git reset HEAD --.
Ian Dunn

1
Rất hữu ích, muốn giữ các tệp không bị theo dõi nhưng thoát khỏi bị xóa và sửa đổi, chỉ cần thay đổi -d thành -m để xử lý sửa đổi.
RaisinBranCrunch

5
Lưu ý điều này không hoạt động nếu bạn có khoảng trắng trong tên tệp / đường dẫn. Tôi nghĩ rằng git ls-files -d | sed -e "s/\(.*\)/'\1'/" | xargs git checkout --sẽ làm việc.
Parsley72

79

Vì bạn đang thực hiện git checkout ., có vẻ như bạn đang cố gắng khôi phục chi nhánh của mình trở lại trạng thái cam kết cuối cùng.

Bạn có thể đạt được điều này với một git reset HEAD --hard

Cảnh báo

Làm điều này có thể loại bỏ tất cả các sửa đổi mới nhất của bạn và bỏ qua các sửa đổi của bạn, ví dụ, bạn có thể mất việc. Nó có thể là những gì bạn muốn, nhưng kiểm tra các tài liệu để đảm bảo.


39
Wow !! Cẩn thận với điều này !!!! Bạn có thể đúng, nhưng ai đó có thể bị nhầm lẫn và làm nổ tung toàn bộ mã của họ. Sẽ thật tuyệt nếu bạn thêm một cảnh báo lớn hơn.
santiagobasulto

3
Đây chính xác là những gì tôi cần. Không làm nổ tung toàn bộ mã của bạn - chỉ đơn giản là đưa bạn trở lại cam kết gần đây nhất của bạn.
Andrew Hendrie

2
Tôi đã kết thúc với hàng trăm tập tin bị thiếu tại một thời điểm. Đây là cách thực tế duy nhất để khắc phục vấn đề. Cảm ơn!
Jonathan Benn

66

nếu bạn đã sử dụng

git rm filename

để xóa một tập tin sau đó

git checkout path/to/filename

không hoạt động, vì vậy trong trường hợp đó

git checkout HEAD^ path/to/filename

nên làm việc


2
Tôi thích câu trả lời này. Không có nghi ngờ rằng bạn chỉ ảnh hưởng đến các tập tin cụ thể mà bạn đã xóa. 1) git checkout path / to / filename 2) git checkout - path / to / filename
Ed of the Mountain

Thông minh. git checkout HEAD^ path/to/filenamelàm việc cho tôi vì tôi đã không cam kết các tập tin.
Moses Ndeda

29

Đây là lệnh đã giúp tôi trên mac của tôi. Tôi đã thử một vài giải pháp khác nhưng chúng không hiệu quả với tôi.

Phiên bản Git trên OSX Mavericks

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

Chỉ huy

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



17

Nếu bạn muốn khôi phục tất cả các tệp cùng một lúc

Hãy nhớ sử dụng khoảng thời gian vì nó bảo git lấy tất cả các tệp.

Lệnh này sẽ thiết lập lại phần đầu và bỏ qua tất cả các thay đổi:

$ git reset HEAD . 

Sau đó chạy này để khôi phục tất cả các tệp:

$ git checkout .

Sau đó thực hiện trạng thái git, bạn sẽ nhận được:

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

Đây là một giải pháp đơn giản nhất và hoạt động cho nhiều tệp (giả sử bạn đã xóa nhiều tệp / thư mục). làm tốt lắm anh chàng +
Gkiokan

9

Bạn có muốn thấy cái này không

phù hợp với trường hợp bạn sử dụng

git checkout -- .

trước khi bạn cam kết một cái gì đó.

Bạn cũng có thể muốn thoát khỏi các tệp đã tạo chưa được tạo. Và bạn không muốn chúng. Với :

git reset -- .

Bạn đã không báo cáo đầy đủ câu trả lời bạn đã sao chép. Trong thực tế git checkout -- .không giúp phục hồi các tập tin bị xóa và tương đương với những gì người hỏi đã thử : git checkout .. Phần có thể hoạt động là phần bạn không sao chép : git checkout <file_path>.
Jean Paul

6

Tìm thấy bài đăng này trong khi tìm kiếm câu trả lời về cách xóa một tệp đã bị xóa trong thư mục làm việc của tôi sau khi hợp nhất từ ​​chi nhánh của người khác. Không có cam kết nào được thực hiện sau khi hợp nhất. Vì nó là một sự hợp nhất trong tiến trình, tôi không thể thêm nó lại bằng cách sử dụng:

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

Tôi đã phải thực hiện một bước khác ngoài việc thiết lập lại để đưa tập tin trở lại:

$ git checkout -- file.cpp

4

Nếu bạn chưa thực hiện bất kỳ thay đổi nào, tất cả những gì bạn phải làm là bỏ qua những thay đổi đó và bạn sẽ quay lại cam kết làm việc cuối cùng.

git stash
git stash clear
git clean 

Đặt nó vào ngăn xếp không phải là một giải pháp. Đây là một hack.
Robert Dolca

2
Thisc là giải pháp tốt vì bạn có thể loại bỏ nó khỏi stash. Nếu là hack hay không, đó là vấn đề của hương vị. Toàn bộ ý tưởng của stash là hack thông minh.
Eino Mäkitalo

@ EinoMäkitalo rất vui vì nó có thể giúp ích cho bạn :)
Rick

Tôi thích cách tiếp cận này nhất trong tất cả những cách được liệt kê
ckapilla

3

nếu bạn đang tìm kiếm một thư mục bị xóa.

 git checkout ./pathToDir/*

3

Dưới đây là các trường hợp khác nhau như một tài liệu tham khảo để giúp đỡ người khác:

Nếu việc xóa chưa được thực hiện , lệnh bên dưới sẽ khôi phục tệp đã xóa trong cây làm việc.

$ git checkout -- <file>

Bạn có thể lấy danh sách tất cả các tệp đã xóa trong cây làm việc bằng cách sử dụng lệnh bên dưới.

$ git ls-files --deleted

Nếu việc xóa đã được cam kết , hãy tìm cam kết nơi nó xảy ra, sau đó khôi phục tệp từ cam kết này.

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

Nó sẽ cung cấp cho bạn một cái gì đó như c46e81aa403ecb8a0f7a323a358068345, Bây giờ sử dụng cam kết # ở đây

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

Một cái gì đó như thế này: $ git checkout c46e81aa403ecb8a0f7a323a358068345 -

Trong trường hợp bạn đang tìm đường dẫn của tệp để khôi phục, lệnh sau sẽ hiển thị một bản tóm tắt của tất cả các tệp đã bị xóa.

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

Nếu bạn muốn chỉ hiển thị danh sách các tập tin:

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

2

Đối với tôi những gì đã làm việc là git checkout {SHA1 of commit with version to restore} "{path to file to restore}"

Ví dụ git checkout 5a6b3179e58edff9c90326b9a04284b02fd67bd0 "src-ui/views/includes/radar.pug"

(được thực thi trong nhánh mà chúng tôi muốn tệp đi vào)

Sau khi lệnh đó được thực thi, tệp được khôi phục sẽ tồn tại ở vị trí ban đầu (cần phải được khôi phục)


và / hoặc chỉ đơn giản là git checkout master path/to/the/file.binđể bạn chỉ phục hồi tệp đó mà không mất bất kỳ thay đổi nào khác mà bạn có thể đã thực hiện. Tái bút: đây phải là câu trả lời được chấp nhận ...
Edoardo

1

Nếu bạn đã cài đặt ToroirGIT thì chỉ cần chọn mục menu "Hoàn nguyên ..." cho menu bật lên thư mục mẹ.


1

1.Tìm cam kết cụ thể mà bạn muốn hoàn nguyên bằng:

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

2.Revert để cam kết sử dụng:

    git revert <commit id> 

Bây giờ chi nhánh địa phương của bạn sẽ có tất cả các tệp nói riêng


Điều này hoạt động nếu bạn đã cam kết thay đổi của bạn.
sống tình yêu

1

THẬN TRỌNG: cam kết bất kỳ công việc bạn muốn giữ lại đầu tiên.

Bạn có thể đặt lại không gian làm việc của mình (và khôi phục các tệp đã xóa)

git checkout ./*

2
FYI ... lệnh này đã xóa tất cả các tệp đang hoạt động của tôi và không khôi phục được tệp đã bị xóa..biết
hendr1x

Đó là lý do tại sao bạn sử dụng lệnh này để đặt lại không gian làm việc của bạn. Tôi nghĩ rằng sẽ được tự giải thích.
Henrique Florêncio

1
Lệnh đó không hoạt động vì nếu tệp bị xóa, nó sẽ không bị bắt bởi ./*.
Jean Paul

@JeanPaul có thể tôi hiểu nhầm nhưng nó đặt không gian làm việc của tôi ở trạng thái ban đầu (hiện tại đã xóa tệp).
Marc

@Marc Nó có thể hoạt động nhưng chỉ khi không có tệp hiển thị trong thư mục, vì nếu không ./*sẽ được mở rộng bằng bash để khớp với các tệp đó trước khi được gửi đến git.
Jean Paul

0

Tôi đã có cùng một vấn đề tuy nhiên không có giải pháp nào ở trên làm việc cho tôi. Điều cuối cùng tôi làm là:
- tạo một tệp trống có cùng tên
- so sánh tệp này với lịch sử cục bộ của nó
- sao chép lịch sử qua tệp trống.


-1

Tôi đã có cùng một vấn đề và không có câu trả lời nào ở đây tôi đã cố gắng làm việc cho tôi cả. Tôi đang sử dụng Intellij và tôi đã kiểm tra một nhánh mới git checkout -b minimalExampleđể tạo ra một "ví dụ tối thiểu" trên nhánh mới của một số vấn đề bằng cách xóa một loạt các tệp và sửa đổi một loạt các tệp khác trong dự án. Thật không may, mặc dù tôi đã không thực hiện bất kỳ thay đổi nào trên nhánh "ví dụ tối thiểu" mới, khi tôi kiểm tra lại nhánh "gốc" của mình, tất cả các thay đổi và xóa từ nhánh "ví dụ tối thiểu" đã xảy ra trong " gốc "chi nhánh quá (hoặc vì vậy nó xuất hiện). Dựa theogit status các tập tin bị xóa đã đi từ cả hai chi nhánh.

May mắn thay, mặc dù Intellij đã cảnh báo tôi "xóa các tệp này có thể không phục hồi được hoàn toàn", tôi đã có thể khôi phục chúng (trên nhánh ví dụ tối thiểu mà chúng thực sự đã bị xóa) bằng cách nhấp chuột phải vào dự án và chọn Lịch sử địa phương > Hiển thị Lịch sử (và sau đó Khôi phục trên mục lịch sử gần đây nhất tôi muốn). Sau khi Intellij khôi phục các tệp trong nhánh "ví dụ tối thiểu", tôi đã đẩy nhánh về gốc. Sau đó, tôi chuyển trở lại chi nhánh địa phương "ban đầu" của mình và chạy git pull origin minimalExampleđể đưa họ trở lại chi nhánh "ban đầu".

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.