Làm thế nào để khôi phục toàn bộ thư mục từ lịch sử của kho lưu trữ git?


91

Tôi muốn khôi phục toàn bộ thư mục (đệ quy) từ lịch sử của kho lưu trữ git của tôi.

Chỉ có 1 nhánh duy nhất (chính chủ).

Tôi biết cam kết mà lỗi đã được bao gồm.

Tôi có thể sử dụng băm sha1 của cam kết gốc để khôi phục trạng thái của thư mục như trước khi có lỗi không?

Tôi đã nghĩ về điều gì đó như thế này:

git checkout 348ce0aa02d3738e55ac9085080028b548e3d8d3 path/to/the/folder/

nhưng nó đã không hoạt động.


7
hãy thử thêm '-' giữa các bản sửa đổi và đường dẫn:git checkout 348ce0aa02d3738e55ac9085080028b548e3d8d3 -- path/to/the/folder/
Carlos Campderrós

điều này đã giúp. Cảm ơn rât nhiều.
mostwanted

1
@ CarlosCampderrós Viết đó như là một câu trả lời thực tế và thu thập 15 điểm của bạn trước khi ai đó làm nó;)
ralphtheninja

@MagnusSkog Tôi không chắc điều đó sẽ hoạt động, vì vậy tôi đã nhận xét chỉ để kiểm tra. Bây giờ mà tôi chắc chắn rằng nó hoạt động, tôi đã viết nó xuống như câu trả lời :)
Carlos Campderrós

2
Như một gợi ý chung, "nó không hoạt động" không hữu ích lắm. Cho chúng tôi biết lý do tại sao nó không hoạt động, lý tưởng nhất là với đầu ra lỗi (được cắt nếu nó rất dài).
me_and

Câu trả lời:


156

thử thêm '-' giữa các bản sửa đổi và đường dẫn:

git checkout 348ce0aa02d3738e55ac9085080028b548e3d8d3 -- path/to/the/folder/ 

Và nếu bạn muốn khôi phục một thư mục từ cam kết trước đó, bạn có thể thay thế băm cam kết bằng HEAD ~ 1, ví dụ:

git checkout HEAD~1 -- path/to/the/folder/ 

cùng một lệnh, mục đích gần như khác nhau: stackoverflow.com/questions/953481/…
cregox

18
Tuy nhiên, có một vấn đề: OP không chỉ định liệu thư mục có còn tồn tại hay không. Để khôi phục một thư mục hiện có về trạng thái cam kết, trước tiên, nội dung của thư mục phải được xóa. Trong trường hợp khác, các tệp hiện có không tồn tại trong cam kết cũ sẽ không bị xóa.
Alberto

7
+1 @Alberto chắc chắn đồng ý. rm -Rf path/to/the/folderSau đó tôi đã thực hiện git checkout 348ce0aa02d3738e55ac9085080028b548e3d8d3 -- path/to/the/folder/- Kết quả: đường dẫn đó có các tệp giống hệt như trong lần cam kết đó, không có sự khác biệt và không có tệp bổ sung nào được tạo sau lần cam kết này. Đó là những gì tôi muốn.
therobyouknow

2
làm những --gì?
Ray Foss

2
@RayFoss nó cho git biết rằng các tham số sau là tệp (nếu không chúng có thể bị nhầm lẫn với băm cam kết, nhánh hoặc thứ gì đó khác). Thông thường họ không cần thiết nhưng nó không làm tổn thương để đặt chúng
Carlos Campderrós

3

Có hai cách dễ dàng để làm điều này:

Nếu cam kết bao gồm các lỗi chỉ bao gồm các lỗi, hãy sử dụng git revertđể đảo ngược tác động của nó.

Nếu không, con đường dễ dàng là:

  1. git checkout 348…
  2. cp -a path/to/the/folder ../tmp-restore-folder
  3. git checkout HEAD # or whatever
  4. rm -rf path/to/the/folder
  5. mv ../tmp-restore-folder path/to/the/folder
  6. git add path/to/the/folder
  7. git commit -m "revert …"

1

Nếu bạn chỉ đơn giản làm vậy git checkout <SHA-ID>thì nó sẽ tạm thời chuyển bạn đến sha-commit đó.

Mỗi đối tượng cam kết giữ toàn bộ cấu trúc của đĩa tại thời điểm đó, vì vậy nếu bạn có tệp ở đó và cần sao chép chúng ra ngoài, bạn có thể làm như vậy. Tuy nhiên, cảnh báo rằng bạn sẽ không ở trong bất kỳ nhánh nào, vì vậy bạn sẽ phải chuyển về chế độ chính trước khi sao chép tệp vào cây làm việc của bạn và cam kết.


lại "di chuyển trở lại chủ" bạn có nghĩa là tổng thể thanh toán?
Pacerier
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.