Bagaimana saya bisa pulih dari git push -f yang tidak disengaja?


13

Saya hanya berlari git push -fkarena kesalahan, sehingga menimpa cabang jauh.

Asli:

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

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

Setelah git push -f:

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

Di repositori lokal saya, saya sedang mengerjakan mastercabang, jadi saya bisa mengembalikan cabang masteruntuk komit aaaaaaa, karena saya bisa mendapatkan komit aaaaaaadari git reflog. Namun, saya tidak bisa mendapatkan komitmen bbbbbbbkarena saya tidak menarik sebelumnya git push -f.

Saya sudah mencoba git reflogdi repositori jarak jauh, tetapi tidak ada yang berguna di reflog di repositori kosong.

Bagaimana saya bisa mengembalikan cabang fookembali untuk melakukan bbbbbbbdi repositori jarak jauh?

(PS Saya tidak tahu nilai sebenarnya bbbbbbb.)


Tetapi repo jarak jauh adalah repo kosong.
Xiè Jìléi

Jawaban:


12

Coba ini:

  1. Hubungkan ke remote melalui SSH.

  2. Buat cadangan seluruh repositori jarak jauh.

    tar cvzf project-backup.tgz /path/to/project.git
    
  3. Jika Anda tahu setidaknya beberapa karakter pertama bbbbbbb, gunakan git show bbbbbbdan / atau git log bbbbbbuntuk mengetahui hash komit penuh. (Jika Anda hanya perlu hash, git rev-parse bbbbbbjuga akan berfungsi, tetapi selalu lebih baik untuk memeriksa.)

    Jika Anda tidak tahu nilainya sama sekali , jalankan git fsckdan Anda harus mendapatkan daftar "komit menggantung". Periksa setiap komit menggunakan git show <hash>dan git log <hash>sampai Anda menemukan yang benar.

  4. Perbarui referensi cabang:

    echo aaaaaaaaaaaaaaa.... > refs/heads/master
    echo bbbbbbbbbbbbbbb.... > refs/heads/foo
    
  5. Gunakan git log masterdan git log foountuk memastikan bahwa Anda memulihkan cabang yang benar.


Terima kasih, saya telah menyelamatkan cabang yang menggantung git fsck.
Xiè Jìléi

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.