Tìm và khôi phục tệp đã xóa trong kho Git


2802

Nói rằng tôi đang ở trong kho Git. Tôi xóa một tập tin và cam kết thay đổi đó. Tôi tiếp tục làm việc và thực hiện một số cam kết hơn. Sau đó, tôi thấy tôi cần khôi phục tập tin đó.

Tôi biết tôi có thể kiểm tra một tệp bằng cách sử dụng git checkout HEAD^ foo.bar, nhưng tôi thực sự không biết khi nào tệp đó bị xóa.

  1. Điều gì sẽ là cách nhanh nhất để tìm ra cam kết đã xóa một tên tệp đã cho?
  2. Điều gì sẽ là cách dễ nhất để đưa tập tin đó trở lại bản sao làm việc của tôi?

Tôi hy vọng tôi không phải duyệt thủ công nhật ký của mình, kiểm tra toàn bộ dự án cho một SHA cụ thể và sau đó sao chép thủ công tệp đó vào kiểm tra dự án ban đầu của tôi.


39
lưu ý rằng nhận xét trước đó trả lời câu hỏi trong tiêu đề, không phải trong phần thân - bao gồm tìm hiểu khi tệp bị xóa.
avdgaag

8
Để tìm cam kết, một tập tin đã bị xóa trong:git log --diff-filter=D -- path/to/file
titandecoy



54
@hhh git checkout deletedFilesẽ phục hồi deletedFilenếu nó bị xóa nhưng việc xóa đó vẫn chưa được dàn dựng hoặc cam kết . Đó không phải là những gì câu hỏi ở đây đang yêu cầu; câu hỏi này là về cách khôi phục một tập tin mà việc xóa đã được cam kết nhiều lần trước.
Đánh dấu Amery

Câu trả lời:


3150

Tìm cam kết cuối cùng đã ảnh hưởng đến đường dẫn đã cho. Vì tệp không nằm trong cam kết CHÍNH, nên cam kết này phải xóa nó.

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

Sau đó kiểm tra phiên bản tại cam kết trước đó, sử dụng ^biểu tượng dấu mũ ( ):

git checkout <deleting_commit>^ -- <file_path>

Hoặc trong một lệnh, nếu $filelà tệp trong câu hỏi.

git checkout $(git rev-list -n 1 HEAD -- "$file")^ -- "$file"

Nếu bạn đang sử dụng zsh và bật tùy chọn EXTENDED_GLOB, biểu tượng dấu mũ sẽ không hoạt động. Bạn có thể sử dụng ~1thay thế.

git checkout $(git rev-list -n 1 HEAD -- "$file")~1 -- "$file"

94
Một mẹo nhỏ là kiểm tra cam kết TRƯỚC, sử dụng hậu tố ^. Cảm ơn.
Christian Oudard

4
Vì một số lý do, điều này sẽ không hoạt động trong zsh. ± git checkout $(git rev-list -n 1 HEAD "spec/Sporkfile_example.rb")^ -- "spec/Sporkfile_example.rb" zsh: no matches found: b71c152d8f38dcd23ad7600a93f261a7252c59e9^ Tôi đã chuyển sang bash và nó hoạt động tốt mặc dù.
zoras

20
Từ dòng lệnh windows tôi gặp lỗi. error: pathspec <filename> did not match any file(s) known to git.. Giải pháp là sử dụng git bash.
donturner

56
@zoras zsh có bản mở rộng của riêng nó trên '^' Tôi tin, nhưng bạn có thể sử dụng cú pháp thay thế của '~ 1': git checkout <deleting-commit>~1 -- <file-path> ~ X cho phép bạn chỉ định các cam kết X trước khi xác định, vì vậy ~ 1 là cam kết trước, ~ 2 là hai lần cam kết trước, v.v.
Nils Luxton

22
Trên dấu nhắc cmd của windows, ^ký tự là ký tự thoát! Do đó, trên cmd, bạn phải gõ ^^để nói với cmd bạn muốn một chữ ^ và rằng bạn không thoát khỏi thứ khác sau nó. Điều đang xảy ra với nhiều người là cái ^được theo sau bởi một khoảng trống. Vì vậy, cmd nghĩ rằng bạn đang thoát khỏi không gian - chỉ mang lại một nhân vật không gian. Vì vậy, đến lúc git có được các đối số cli, nó sẽ thấy SHA1không SHA1^ . Nó thực sự phiền phức. ~không phải là một nhân vật thoát, vì vậy đó là lý do tại sao nó vẫn hoạt động. (PS. Nếu bạn nghĩ rằng nhân viên của Google sẽ muốn có thông tin này, vui lòng phản hồi nhận xét này)
Alexander Bird

875
  1. Sử dụng git log --diff-filter=D --summaryđể có được tất cả các cam kết đã xóa các tệp và các tệp đã bị xóa;
  2. Sử dụng git checkout $commit~1 path/to/file.extđể khôi phục các tập tin đã xóa.

Ở đâu $commitlà giá trị của cam kết bạn đã tìm thấy ở bước 1, ví dụ nhưe4cf499627


10
tò mò, ~ 1 đề cập đến cái gì?
Tommy chheng

7
@tommy - thông số kỹ thuật dấu ngã sẽ cung cấp cho bạn cháu thứ n của cam kết được đặt tên. Xem book.git-scm.com/4_git_treeishes.html để biết thêm chi tiết.
Robert Munteanu

5
đây là cách tiếp cận dễ dàng và trực quan nhất. git log -- *PartOfMyFileName*. Cảm ơn vì$commit~1
bss

3
các git checkout $commit~1 filenamecú pháp hoạt động hoàn hảo cho các tập tin cá nhân, và cũng làm việc cho toàn bộ thư mục. tức là: để khôi phục tất cả các hình ảnh đã xóa trong ./images từ sha 12345 : git checkout 12345~1 images. cảm ơn vì câu trả lời này
tham gia

34
@Alexar $commit~1có nghĩa là bạn nên thêm tên của cam kết. Một cái gì đó giống như 1d0c9ef6eb4e39488490543570c31c2ff594426cở đâu $commit.
Eugene

319

Để khôi phục tất cả các tệp đã xóa trong một thư mục, hãy nhập lệnh sau.

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

1
Các tập tin được dẫn đến đâu? Tôi thấy không có thay đổi.
William Grand

21
Đây có lẽ là phương pháp dễ nhất. Nó biến thái khó khăn như thế nào gitđã thực hiện ngay cả nhiệm vụ đơn giản nhất.
jww

kiểm tra git - [tệp] sẽ hoàn nguyên các thay đổi trong [tệp]. Đường ống sẽ thay thế [tệp] bằng tên của các tệp đã bị xóa.
Manu

6
Lệnh ls-filesphụ rất tiện dụng, nhưng dường như không hoạt động đối với các tệp đã bị xóa với git rmnghĩa là được dàn dựng, chứ chưa nói đến cam kết, đó là những gì OP yêu cầu.
MarkHu

Điều này làm việc để khôi phục các tệp đã bị xóa, nhưng làm cách nào tôi có thể cập nhật các tệp đã thay đổi và hiển thị như M myChangedFilesau git checkout?
libby

124

Tôi đã đến câu hỏi này để tìm cách khôi phục một tập tin tôi vừa xóa nhưng tôi chưa cam kết thay đổi. Chỉ trong trường hợp bạn thấy mình trong tình huống này, tất cả những gì bạn cần làm là như sau:

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


93

Nếu bạn đang điên, hãy sử dụng git-bisect. Đây là những gì để làm:

git bisect start
git bisect bad
git bisect good <some commit where you know the file existed>

Bây giờ là lúc để chạy thử nghiệm tự động. Lệnh shell '[ -e foo.bar ]'sẽ trả về 0 nếu foo.bartồn tại và 1 nếu không. Lệnh "chạy" git-bisectsẽ sử dụng tìm kiếm nhị phân để tự động tìm cam kết đầu tiên trong đó thử nghiệm thất bại. Nó bắt đầu một nửa trong phạm vi được đưa ra (từ tốt đến xấu) và cắt nó một nửa dựa trên kết quả của bài kiểm tra được chỉ định.

git bisect run '[ -e foo.bar ]'

Bây giờ bạn đang ở cam kết đã xóa nó. Từ đây, bạn có thể quay lại tương lai và sử dụng git-revertđể hoàn tác thay đổi,

git bisect reset
git revert <the offending commit>

hoặc bạn có thể quay lại một lần cam kết và tự kiểm tra thiệt hại:

git checkout HEAD^
cp foo.bar /tmp
git bisect reset
cp /tmp/foo.bar .

2
Bạn có thể giải thích về git bisect run '[ -e foo.bar ]'?
avdgaag

Bạn cũng có thể sử dụng tốt và xấu theo cách thủ công, nếu đó là thứ không thể tự động kiểm tra. Xem trang người đàn ông bisect.
Josh Lee

1
@avdgaag git bisect runbảo Git tự động chia đôi bằng cách chạy lệnh theo từ 'run' trong đó lệnh phải trả về 0cho một goodphiên bản (xem git help bisectđể biết chi tiết). Đây '[ -e foo.bar ]'là một biểu thức chuẩn để kiểm tra nếu tệp foo.bartồn tại (việc triển khai thường nằm trong tệp /usr/bin/[thường được liên kết cứng /usr/bin/test) và các dấu ngoặc đơn được sử dụng để đặt tất cả dưới dạng một đối số dòng lệnh.
Mikko Rantalainen

Ý tưởng tuyệt vời. Tôi đã thử cách tiếp cận này và nó đã xác định một cam kết trước khi xóa, nhưng không phải là cam kết thực sự xóa tệp. Và trong một thử nghiệm khác, nó đã xác định được 2 lần xác nhận trước khi xóa.
Michael Osofsky

Điên? Có lẽ. Nhưng bisect là một cách tuyệt vời để giúp tìm ra lỗi được giới thiệu ở đâu và vì vậy dù sao đó cũng là một kỹ năng quý giá để học. Vì vậy, mặc dù có thể không phải là cách 'chính xác' hay 'chính xác nhất' ở đây, đây vẫn là một ý tưởng hay và đáng giá +1!
Pryftan

77

Bí danh yêu thích mới của tôi, dựa trên câu trả lời của bonyiii (được nêu lên) và câu trả lời của riêng tôi về "Truyền đối số cho lệnh bí danh Git ":

git config alias.restore '!f() { git checkout $(git rev-list -n 1 HEAD -- $1)~1 -- $(git diff --name-status $(git rev-list -n 1 HEAD -- $1)~1 | grep '^D' | cut -f 2); }; f'

Tôi đã bị mất một tập tin, bị xóa do nhầm lẫn một vài lần xác nhận trước đây?
Nhanh chóng:

git restore my_deleted_file

Ngăn chặn khủng hoảng.

Cảnh báo, với Git 2.23 (Q3 2019) xuất hiện lệnh thử nghiệm có tên git restore(!).
Vì vậy, đổi tên bí danh này (như hiển thị bên dưới).


Robert Tweetsey đề xuất trong các ý kiến các bí danh sau:

restore-file = !git checkout $(git rev-list -n 1 HEAD -- "$1")^ -- "$1"

jegan thêm vào trong các ý kiến :

Để đặt bí danh từ dòng lệnh, tôi đã sử dụng lệnh này:

git config --global alias.restore "\!git checkout \$(git rev-list -n 1 HEAD -- \"\$1\")^ -- \"\$1\"" 

7
Điều này khôi phục toàn bộ cam kết, không chỉ các tệp được yêu cầu.
Daniel Bang

5
Đây là bí danh của tôi, hoạt động tuyệt vời:restore-file = !git checkout $(git rev-list -n 1 HEAD -- "$1")^ -- "$1"
void.pulum

1
@RobertDailey Trông thật tuyệt! Tôi đã bao gồm bí danh của bạn trong câu trả lời để dễ nhìn hơn.
VonC

1
Để đặt bí danh từ dòng lệnh, tôi đã sử dụng lệnh này:git config --global alias.restore "\!git checkout \$(git rev-list -n 1 HEAD -- \"\$1\")^ -- \"\$1\""
jegan

2
Expansion of alias 'restore' failed; '!git' is not a git command
Karl Morrison

55

Nếu bạn biết tên tệp, đây là một cách dễ dàng với các lệnh cơ bản:

Liệt kê tất cả các cam kết cho tập tin đó.

git log -- path/to/file

Cam kết cuối cùng (trên cùng) là lần xóa tệp. Vì vậy, bạn cần khôi phục lại lần thứ hai để cam kết cuối cùng.

git checkout {second to last commit} -- path/to/file

Chỉ cần sử dụng giải pháp này và không có cam kết xóa. Tôi đã có thể khôi phục tập tin bằng cách sử dụng id xác nhận gần đây nhất.
Adam

Không phải cam kết tiếp theo cuối cùng (cam kết xóa trước đó) có chứa phiên bản mới nhất của tệp bị xóa không? Thứ hai đến cuối cùng (cam kết trước khi cam kết xóa trước đó) có thể bị lỗi thời một cách vô vọng.
Suncat2000

1
Đây là giải pháp đầu tiên tôi thấy đủ đơn giản để tôi không phải quay lại đây để tìm nó lần sau. Có lẽ.
Eloff

@ Suncat2000 "thứ hai đến cuối cùng" có nghĩa là "cam kết trước đó để xóa", giống như "bên cạnh cuối cùng". en.wiktionary.org/wiki/penultimate#Synonyms
wisbucky

Cảm ơn một triệu lần cho câu trả lời này !!!!!
Rakesh Bk

29

Để khôi phục một tập tin đã xóa và cam kết:

git reset HEAD some/path
git checkout -- some/path

Nó đã được thử nghiệm trên phiên bản Git 1.7.5.4.


1
Điều đó đã không làm việc cho tôi. Sau khi thanh toán, tôi nhận được error: pathspec 'foo' did not match any file(s) known to git.rằng tôi chắc chắn rằng tên tệp là chính xác. Phiên bản Git 2.7.0
wvducky 27/2/2016

-1; cái này sai. Các lệnh này sẽ hoàn tác việc xóa chưa được thực hiện (lệnh đầu tiên sẽ hủy bỏ việc xóa, nếu lệnh này được thực hiện và lệnh thứ hai sẽ loại bỏ các thay đổi không được thực hiện đối với tệp), nhưng bạn tuyên bố ở đây rằng chúng sẽ khôi phục lại cam kết xóa tệp, đơn giản là không đúng sự thật và sẽ thất bại với lỗi như trong nhận xét của @ wvducky ở trên.
Đánh dấu Amery

@MarkAmery Thật vậy, tôi nghĩ rằng lệnh này hoạt động tốt cho những nhà phát triển, những người không thực hiện dàn dựng rõ ràng để cam kết xóa các tệp với git add -A, nhưng vì vậy tệp được khôi phục vẫn ở giai đoạn không cam kết.
Fedir RYKHTIK

25

Nếu bạn chỉ thực hiện thay đổi và xóa một tệp, nhưng không cam kết và bây giờ bạn đã chia tay với các thay đổi của mình

git checkout -- .

nhưng các tệp đã xóa của bạn không trả về, bạn chỉ cần thực hiện lệnh sau:

git checkout <file_path>

Và thế là, tập tin của bạn đã trở lại.


24

Tôi đã có giải pháp này .

  1. Lấy id của cam kết nơi tệp đã bị xóa bằng một trong những cách dưới đây.

    • git log --grep=*word*
    • git log -Sword
    • git log | grep --context=5 *word*
    • git log --stat | grep --context=5 *word* # đề nghị nếu bạn khó nhớ bất cứ điều gì
  2. Bạn sẽ nhận được một cái gì đó như:

cam kết bfe68bd117e1091c96d2976c99b3bcc8310bebe7 Tác giả: Alexander Orlov Ngày: Thu 12 tháng 12 23:44:27 2011 +0200

replaced deprecated GWT class
- gwtI18nKeySync.sh, an outdated (?, replaced by a Maven goal) I18n generation script

cam kết 3ea4e3af253ac6fd1691ff6bb89c964f54802302 Tác giả: Alexander Orlov Ngày: Thu ngày 12 tháng 5 22:10:22 2011 +0200

3 . Bây giờ sử dụng id id bfe68bd117e1091c96d2976c99b3bcc8310bebe7 làm:

git checkout bfe68bd117e1091c96d2976c99b3bcc8310bebe7^1 yourDeletedFile.java

Vì id xác thực tham chiếu cam kết nơi tệp đã bị xóa, bạn cần tham chiếu cam kết ngay trước bfe68b mà bạn có thể thực hiện bằng cách nối thêm ^1. Điều này có nghĩa là: đưa cho tôi cam kết ngay trước bfe68b.


Đây là cách tiếp cận tương tự như câu trả lời được chấp nhận, nhưng với một số cách khác để tìm cam kết xóa. Tôi vẫn thích cách tiếp cận được đưa ra trong câu trả lời được chấp nhận, nhưng đây là những lựa chọn thay thế tốt. Cảm ơn!
avdgaag

Tôi giả sử rằng trước tiên hãy kiểm tra tệp đã bị xóa và sau đó (không thay đổi nó) cam kết nó không tạo ra một bản sao của tệp. Đúng? (Tôi cần làm điều này với hình ảnh và một bản sao sẽ làm cho kho lưu trữ lớn hơn)
Stonecrusher


12

git undelete path/to/file.ext

  1. Đặt cái này vào .bash_profile(hoặc tệp có liên quan khác tải khi bạn mở shell lệnh):

    git config --global alias.undelete '!sh -c "git checkout $(git rev-list -n 1 HEAD -- $1)^ -- $1" -'
    
  2. Sau đó sử dụng:

    git undelete path/to/file.ext
    

Bí danh này trước tiên kiểm tra để tìm ra lần xác nhận cuối cùng nơi tệp này tồn tại và sau đó thực hiện kiểm tra Git của đường dẫn tệp đó từ lần xác nhận cuối cùng nơi tệp này tồn tại. Nguồn .


11

Trong nhiều trường hợp, có thể hữu ích khi sử dụng coreutils (grep, sed, v.v.) kết hợp với Git. Tôi đã biết các công cụ này khá tốt, nhưng Git ít như vậy. Nếu tôi muốn thực hiện tìm kiếm một tập tin bị xóa, tôi sẽ làm như sau:

git log --raw | grep -B 30 $'D\t.*deleted_file.c'

Khi tôi tìm thấy sửa đổi / cam kết:

git checkout <rev>^ -- path/to/refound/deleted_file.c

Giống như những người khác đã tuyên bố trước tôi.

Bây giờ các tập tin sẽ được khôi phục về trạng thái trước khi loại bỏ. Nhớ gắn lại nó với cây làm việc nếu bạn muốn giữ nó xung quanh.


7

Tôi đã phải khôi phục một loạt các tệp đã bị xóa từ một cam kết cụ thể và tôi đã quản lý nó bằng hai lệnh:

git show <rev> --diff-filter=D --summary --name-only --no-commit-id | xargs git checkout <rev>^ -- 
git show <rev> --diff-filter=D --summary --name-only --no-commit-id | xargs git reset HEAD 

(Lưu ý khoảng trống ở cuối mỗi lệnh.)

Các tệp đã được thêm vào tệp .gitignore và sau đó bị xóa bằng git rm. Tôi cần phải khôi phục các tập tin, nhưng sau đó bỏ qua chúng. Tôi đã có hàng trăm tệp để khôi phục và nhập mọi thứ theo cách thủ công cho mỗi tệp vì trong các ví dụ khác sẽ quá chậm.


7

Trên thực tế, câu hỏi này là trực tiếp về Git, nhưng ai đó như tôi làm việc với các công cụ GUI như WebStorm VCS ngoài việc biết về các lệnh Git CLI.

Tôi nhấp chuột phải vào đường dẫn chứa tệp đã xóa, rồi đi đến Git và sau đó nhấp vào Hiển thị Lịch sử .

Nhập mô tả hình ảnh ở đây

Các công cụ VCS hiển thị tất cả các phiên bản đào tạo và tôi có thể thấy tất cả các cam kết và thay đổi của từng trong số chúng.

Nhập mô tả hình ảnh ở đây

Sau đó, tôi chọn các cam kết mà bạn tôi xóa PostAd.jstệp. bây giờ xem bên dưới:

Nhập mô tả hình ảnh ở đây

Và bây giờ, tôi có thể thấy tập tin mong muốn của tôi bị xóa. Tôi chỉ cần nhấp đúp vào tên tệp và nó phục hồi.

Nhập mô tả hình ảnh ở đây

Tôi biết câu trả lời của tôi không phải là lệnh Git, nhưng nó nhanh, đáng tin cậy và dễ dàng cho các nhà phát triển mới bắt đầu và chuyên nghiệp. Các công cụ WebSorm VCS rất tuyệt vời và hoàn hảo để làm việc với Git và nó không cần bất kỳ plugin hay công cụ nào khác.


1
Điều này thật tuyệt! Cảm ơn bạn. Chắc chắn là một giải pháp dễ dàng hơn cho những người sử dụng bất kỳ IDE nào của JetBrains.
Fabiano Arruda

Làm thế nào để chúng tôi khôi phục tập tin nếu đó là hình ảnh?
Nodirabegimxonoyim

Kính gửi @FabianoArruda, IDE JetBrains là công cụ mạnh mẽ để phát triển. cảm ơn vì nhận xét đáng yêu của bạn
AmerllicA

Cảm ơn bạn thân yêu @PeterMortensen cho phiên bản.
AmerllicA

6

Tôi đã có cùng một câu hỏi. Không biết điều đó, tôi đã tạo ra một cam kết lơ lửng .

Danh sách cam kết lơ lửng

git fsck --lost-found

Kiểm tra từng cam kết

git reset --hard <commit id>

Các tập tin của tôi xuất hiện trở lại khi tôi chuyển đến cam kết lơ lửng.

git status với lý do:

“HEAD detached from <commit id where it detached>”


2
Cảm ơn rât nhiều. Bạn đã giúp tôi khôi phục hàng ngàn dòng mã.
Reuben

5
user@bsd:~/work/git$ rm slides.tex
user@bsd:~/work/git$ git pull 
Already up-to-date.
user@bsd:~/work/git$ ls slides.tex
ls: slides.tex: No such file or directory

Khôi phục tệp đã xóa:

user@bsd:~/work/git$ git checkout
D       .slides.tex.swp
D       slides.tex
user@bsd:~/work/git$ git checkout slides.tex 
user@bsd:~/work/git$ ls slides.tex
slides.tex

2
Câu hỏi là về việc khôi phục một tập tin sau khi nó đã bị xóa và thay đổi đã được cam kết. Câu trả lời này là về việc khôi phục một tập tin đã bị xóa chỉ trong thư mục làm việc.
akaihola

Đó là sự thật, và đó là những gì tôi đang tìm kiếm.
Hola Soy Edu Feliz Navidad

4

Nếu bạn biết cam kết đã xóa (các) tệp, hãy chạy lệnh <SHA1_deletion>này trong đó cam kết đã xóa tệp:

git diff --diff-filter=D --name-only <SHA1_deletion>~1 <SHA1_deletion> | xargs git checkout <SHA1_deletion>~1 --

Phần trước đường ống liệt kê tất cả các tệp đã bị xóa trong cam kết; tất cả họ đều thanh toán từ cam kết trước đó để khôi phục chúng.


4

Tìm cam kết đã xóa tệp của bạn:

git log --diff-filter=D --oneline -- path/to/file | cut -f -d ' '

Đầu ra mẫu:

4711174

Kể từ Git 2.23 thực sự có một restorelệnh. Nó vẫn đang thử nghiệm nhưng để khôi phục thứ bạn đã xóa trong một cam kết (4711174 trong trường hợp này), bạn có thể nhập:

git restore --source=4711174^ path/to/file

Lưu ý ^ sau id xác nhận vì chúng tôi muốn khôi phục một cái gì đó từ cam kết trước xóa tệp.

Đối --sourcesố nói vớirestore lệnh cần tìm (các) tệp để khôi phục và nó có thể là bất kỳ cam kết nào và thậm chí là chỉ mục.

Xem: git-restore doc cho git 2.23.0


4

Trong trường hợp của chúng tôi, chúng tôi đã vô tình xóa các tệp trong một cam kết và một số cam kết sau đó chúng tôi đã nhận ra lỗi của mình và muốn lấy lại tất cả các tệp đã bị xóa, nhưng không phải các tệp đã bị sửa đổi.

Dựa trên câu trả lời tuyệt vời của Charles Bailey, đây là tài liệu của tôi:

git co $(git rev-list -n 1 HEAD -- <file_path>)~1 -- $(git diff --name-status $(git rev-list -n 1 HEAD -- <file_path>)~1 head | grep '^D' | cut -f 2)

2

Đơn giản và chính xác-

Trước hết, hãy nhận một cam kết ổn định mới nhất mà bạn có tệp đó bằng cách -

git log 

Giả sử bạn tìm thấy $ commit 1234567 ..., sau đó

git checkout <$commitid> $fileName

Điều này sẽ khôi phục phiên bản tập tin đã được cam kết.


1

Đối với cách tốt nhất để làm điều đó, hãy thử nó.


Đầu tiên, tìm id xác nhận của cam kết đã xóa tệp của bạn. Nó sẽ cung cấp cho bạn một bản tóm tắt các cam kết đã xóa các tập tin.

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

kiểm tra git 84sdhfddbdddf ~ 1

Lưu ý: 84sdhfddbdddlà của bạncommit id

Thông qua đó bạn có thể dễ dàng phục hồi tất cả các tập tin bị xóa.


1

Bạn luôn có thể git revertcam kết đã xóa các tập tin. ( Điều này giả định rằng việc xóa là thay đổi duy nhất trong cam kết. )

> git log
commit 2994bda49cd97ce49099953fc3f76f7d3c35d1d3
Author: Dave <dave@domain.com>
Date:   Thu May 9 11:11:06 2019 -0700

    deleted readme.md

Và nếu bạn tiếp tục làm việc và sau đó nhận ra rằng bạn không muốn thực hiện cam kết xóa đó, bạn có thể hoàn nguyên nó bằng cách sử dụng:

> git revert 2994bd

Bây giờ git logcho thấy:

> git log
Author: Dave <dave@domain.com>
Date:   Thu May 9 11:17:41 2019 -0700

    Revert "deleted readme"

    This reverts commit 2994bda49cd97ce49099953fc3f76f7d3c35d1d3.

readme.mdđã được khôi phục vào kho lưu trữ.


Vì câu hỏi cho rằng một số cam kết đã được thực hiện sau khi tệp bị xóa và vì không có dấu hiệu nào cho thấy các cam kết tiếp theo là không mong muốn, nên điều này dường như không giúp ích gì cho OP trong tình huống được mô tả.
Jonathan Leffler

1
Vâng! Bạn có thể thực hiện các xác nhận tiếp theo và vẫn hoàn nguyên các cam kết xóa. Vì vậy, nếu cam kết 111 xóa tệp và cam kết 222, 333, 444, thêm / sửa đổi mọi thứ, bạn vẫn có thể hoàn nguyên cam kết 111 để hoàn tác xóa và nó sẽ trở thành cam kết 555
Dave Baghdanov

0

Tôi cũng gặp vấn đề này khi sử dụng đoạn mã dưới đây để truy xuất tệp trước đó vào thư mục cục bộ:

git checkout <file path with name>

Ví dụ dưới đây đang làm việc cho tôi:

git checkout resources/views/usaSchools.blade.php


Vui lòng đề cập đến vấn đề là gì
Akbor

Việc xóa đã được cam kết. Bạn cần chỉ định cam kết để khôi phục trong trường hợp này.
sba


-1

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.

$ git rev-list -n 1 HEAD -- <file>
$ git checkout <commit>^ -- <file>

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

-1

Để khôi phục tất cả các tệp đã xóa bằng Git, bạn cũng có thể làm:

git checkout $(git ls-files --deleted)

Nơi git ls-files --deletedliệt kê tất cả các tệp đã xóa và git checkout $(git command)khôi phục danh sách các tệp trong một tham số.

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.