Khôi phục thư mục đã xóa trong kho Git


101

Tôi đã xóa tất cả nội dung bên trong một thư mục và thư mục đó trống. Tôi vẫn có một bản sao trong kho lưu trữ từ xa của mình. Nhưng khi tôi làm git pullđiều đó, nó không đặt lại các tệp đã xóa không phải là để làm điều đó?

Vì vậy, tôi đã thực hiện một số nghiên cứu và thấy rằng bạn có thể hoàn nguyên tệp bằng cách git checkout <revision> -- <name of file>

Nhưng điều đó chỉ hoạt động trên các tệp.

Làm cách nào để truy xuất tất cả các tệp bên trong thư mục?


1
git statussẽ cung cấp cho bạn một gợi ý về lệnh gì (s) để chạy
Tavian Barnes

1
Có vẻ như bạn vẫn có thư mục cũ trong repo từ xa của mình (và thậm chí có thể có nó trong repo cục bộ của bạn). ĐỀ XUẤT MẠNH MẼ: 1) Thực hiện "kéo" từ repo từ xa của bạn sang repo MỚI (không làm hỏng thêm repo cục bộ của bạn). 2) Thử "kiểm tra" ... hoặc thậm chí "hoàn nguyên" trong repo mới, cục bộ của bạn: atlassian.com/git/tutorials/undoing-changes/git-revert . 3) Cập nhật repo từ xa khi bạn chắc chắn rằng mọi thứ đều ổn.
paulsm4

Câu trả lời:


255

Mọi thứ bạn có thể làm với một tệp, bạn cũng có thể làm với một thư mục.

Cũng lưu ý Tìm và khôi phục tệp đã xóa trong kho lưu trữ Git


Các tệp bị xóa khỏi cây làm việc nhưng chưa được cam kết:

Nếu bạn chưa lập chỉ mục ( git add) các thay đổi của mình, bạn có thể hoàn nguyên nội dung của một thư mục:

git checkout -- path/to/folder

Nếu việc xóa đã được lập chỉ mục, trước tiên bạn nên đặt lại:

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


Khôi phục toàn bộ cây làm việc (không phải một thư mục duy nhất), nhưng mất tất cả các thay đổi chưa cam kết

git reset --hard HEAD


Khi các tệp bị xóa trong một số cam kết trước đây:

Tìm cam kết cuối cùng ảnh hưởng đến đường dẫn đã cho. Vì tệp không có trong cam kết HEAD, 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>


Khôi phục toàn bộ cây làm việc từ một cam kết xa

git reset --hard <revision> 

1
git checkout -- path/to/folder/* không làm việc Lưu ý: câu hỏi là làm thế nào để khôi phục lại một thư mục không phải là một tập tin
GMAN

@gman How can I retrieve all the files inside the directorycó nghĩa là cả thư mục và các tệp của nó. Nhưng lệnh surprizingly cũng không hoạt động với tôi. Tôi nhớ nó đã làm một năm trước.
Nick Volynkin

2
@gman nhưng nó hoạt động giống như git checkout -- pathhoặc git checkout -- 'path/*'. Trong ví dụ của bạn, bạn xóa git rmmà OP dường như không làm. Tôi đã thêm hướng dẫn cho trường hợp như vậy. Cảm ơn!
Nick Volynkin

3
Trên Windows, bạn cần đặt các dấu ngoặc kép như sau:git checkout "<deleting_commit>^" -- <file_path>
Maor

Nó đã loại bỏ một loạt nội dung trong toàn bộ repo mặc dù tôi đã chỉ định một thư mục trên lệnh đặt lại. Điều này có ý nghĩa là gì? Khi tôi chạy kiểm tra, có vẻ như nó đã khôi phục thư mục của tôi. Tôi không biết điều gì đã làm với phần còn lại của mã của tôi, à niềm vui của một người quản lý kho lưu trữ ngang hàng được sử dụng cho các kho lưu trữ tập trung, thở dài.
Paul Kenjora

5

Nếu bạn chưa cam kết các thay đổi của mình, bạn có thể hoàn nguyên nội dung hoặc thư mục:

git checkout -- removed_directory

Nếu bạn muốn hoàn nguyên tất cả các thay đổi, hãy làm như sau:

git reset --hard HEAD

3
git checkout -- removed_directory không hoạt động
gman

git checkout -- removed_directoryđã làm việc cho tôi, nhưng tôi đã tạo thư mục này trước đây (bởi checkoutmột trong các tệp trong thư mục đó). Sau khi tạo tất cả các tệp đã được khôi phục trong thư mục bằng lệnh này.
Boolean_Type

5

Bạn có thể khôi phục tệp hoặc thư mục bằng khôi phục git.

git restore --source master~1 "PATH_IN_YOUR_REPO"

Tại đây, master ~ 1 hoàn nguyên thư mục của bạn về bản sửa đổi "1" từ nhánh master của bạn.

Nguồn: https://git-scm.com/docs/git-restore


4

Điều duy nhất phù hợp với tôi là kiểm tra repo trong một thư mục khác. Giả sử repo hiện tại đang ở trong /home/me/current.

Sau đó tôi đã làm

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

Điều này tạo một bản sao riêng của repo trong /home/me/temp

Bây giờ tôi có thể đi đến /home/me/tempvà làm bất cứ điều gì tôi muốn. Ví dụ

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

Bây giờ tôi có thể sao chép lại thư mục tệp đã xóa

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

Và xóa thư mục tạm thời

rm -rf /home/me/temp

Các ví dụ của

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

ĐỪNG LÀM VIỆC

$ 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.

Các ví dụ khác như

git reset --hard HEAD

là phá hoại ngoài các tệp đã xóa. Mọi thay đổi khác cũng sẽ bị mất.

Tương tự

git reset --hard some-commit

sẽ mất bất kỳ cam kết nào sau khi some-commit


2

Kể từ git 2.24.0, có một lệnh git mới thử nghiệm: git restore

git restore --staged some/deleted/folder

Nó hiển thị cho tôi git: 'restore' không phải là lệnh git
Ahmed C

0

Nếu bạn không chỉ định một tệp cụ thể, bạn sẽ có thể lấy toàn bộ nội dung của một cam kết cụ thể. Giống như: git checkout 264794319e9695ba843cd6(giả sử hàm băm đó có tất cả các tệp của bạn ở trạng thái phù hợp).

Lý do pullkhông khôi phục tệp là git coi việc xóa của bạn là thay đổi gần đây hơn, áp dụng điều đó trên bất kỳ thứ gì bạn đang kéo.

(Tôi khuyên bạn nên thử nghiệm ở một chi nhánh mới.)


0

Nếu bạn chỉ muốn khôi phục một thư mục đã xóa và bạn có các cam kết khác sau khi xóa, thì bạn cũng có thể truy cập dự án của mình trên github.com.

Từ github.com, chuyển bạn đến bản cam kết cuối cùng có thư mục của bạn. Bạn sẽ thấy thông báo cam kết và ở bên phải có một nút có nhãn "Duyệt qua tệp". Nhấp vào đây sẽ đưa bạn đến tất cả các tệp từ giai đoạn cam kết đó.

Từ đó, bạn có thể sao chép mã hoặc chỉ tải mã dưới dạng zip.


-1

để xóa không giới hạn, nó đơn giản như sau:

git reset HEAD rel / path / to / Delete / directory / *

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.