Làm thế nào tôi có thể phục hồi từ một cú đẩy git tình cờ -f?


13

Tôi chỉ chạy git push -fnhầm, do đó ghi đè lên một chi nhánh từ xa.

Nguyên:

(remote origin:)
    branch master -> commit aaaaaaa
    branch foo    -> commit bbbbbbb

(local)
    branch master -> commit ccccccc
    branch foo    -> commit ddddddd

Sau git push -f:

(remote origin:)
    branch master -> commit ccccccc
    branch foo    -> commit ddddddd

Trong kho lưu trữ cục bộ của tôi, tôi đang làm việc trên masterchi nhánh, vì vậy tôi có thể khôi phục chi nhánh masterđể cam kết aaaaaaa, vì tôi có thể nhận được cam kết aaaaaaatừ đó git reflog. Tuy nhiên, tôi không thể nhận được cam kết bbbbbbbvì trước đây tôi không kéo git push -f.

Tôi đã thử git reflogtrong kho lưu trữ từ xa, nhưng không có gì hữu ích trong việc reflog trong kho lưu trữ trần.

Làm thế nào tôi có thể khôi phục lại chi nhánh foođể cam kết bbbbbbbtrong kho lưu trữ từ xa?

(PS tôi không biết giá trị thực tế của bbbbbbb.)


Nhưng repo từ xa là một repo trần.
Xiè Jìléi

Câu trả lời:


12

Thử đi:

  1. Kết nối với điều khiển từ xa qua SSH.

  2. Tạo một bản sao lưu của toàn bộ kho lưu trữ từ xa.

    tar cvzf project-backup.tgz /path/to/project.git
    
  3. Nếu bạn biết ít nhất một vài ký tự đầu tiên bbbbbbb, hãy sử dụng git show bbbbbbvà / hoặc git log bbbbbbđể tìm ra hàm băm đầy đủ. (Nếu bạn chỉ cần băm, git rev-parse bbbbbbcũng sẽ hoạt động, nhưng luôn luôn tốt hơn để kiểm tra.)

    Nếu bạn không biết giá trị tại tất cả , chạy git fsckvà bạn sẽ nhận được một danh sách các "cam treo lủng lẳng". Kiểm tra từng cam kết bằng cách sử dụng git show <hash>git log <hash>cho đến khi bạn tìm thấy đúng.

  4. Cập nhật các tài liệu tham khảo chi nhánh:

    echo aaaaaaaaaaaaaaa.... > refs/heads/master
    echo bbbbbbbbbbbbbbb.... > refs/heads/foo
    
  5. Sử dụng git log mastergit log foođể đảm bảo rằng bạn đã khôi phục các nhánh chính xác.


Cảm ơn, tôi đã lưu chi nhánh lơ lửng với git fsck.
Xiè Jìléi

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.