Bagaimana cara memulihkan seluruh direktori dari riwayat repositori git?

91

Saya ingin memulihkan seluruh direktori (secara rekursif) dari riwayat repositori git saya.

Hanya ada 1 cabang (master).

Saya tahu komit di mana kesalahan dimasukkan.

Dapatkah saya menggunakan hash sha1 dari komit induk untuk memulihkan status direktori seperti sebelum kesalahan disertakan?

Saya memikirkan sesuatu seperti ini:

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

tapi tidak berhasil.

paling dicari
sumber
7
coba tambahkan '-' antara revisi dan jalur:git checkout 348ce0aa02d3738e55ac9085080028b548e3d8d3 -- path/to/the/folder/
Carlos Campderrós
ini membantu. Terima kasih banyak.
dicari
1
@ CarlosCampderrós Tuliskan itu sebagai jawaban nyata dan kumpulkan 15 poin Anda sebelum orang lain melakukannya;)
ralphtheninja
@MagnusSkog Saya tidak yakin itu akan berhasil, jadi saya membuat komentar hanya untuk memeriksa. Sekarang saya yakin ini berhasil, saya telah menuliskannya sebagai jawaban :)
Carlos Campderrós
2
Sebagai petunjuk umum, "tidak berhasil" tidak terlalu berguna. Beri tahu kami mengapa ini tidak berhasil, idealnya dengan output kesalahan (dipangkas jika sangat panjang).
saya_dan

Jawaban:

156

coba tambahkan '-' antara revisi dan jalur:

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

Dan jika Anda ingin memulihkan direktori dari komit sebelumnya, Anda dapat mengganti hash komit dengan HEAD ~ 1, misalnya:

git checkout HEAD~1 -- path/to/the/folder/ 
Carlos Campderrós
sumber
perintah yang sama, tujuan yang hampir berbeda: stackoverflow.com/questions/953481/…
cregox
18
Namun ada satu masalah: OP tidak menentukan apakah direktori masih ada. Untuk mengembalikan direktori yang ada ke keadaan komit, konten direktori harus dihapus terlebih dahulu. Dalam kasus lain, file yang sudah ada yang tidak ada di komit lama tidak akan dihapus.
Alberto
7
+1 @Alberto pasti setuju. Saya melakukan rm -Rf path/to/the/folderkemudian git checkout 348ce0aa02d3738e55ac9085080028b548e3d8d3 -- path/to/the/folder/- Hasil: jalur itu memiliki file yang persis sama seperti di komit itu, tidak ada perbedaan dan tidak ada file tambahan yang telah dibuat setelah komit ini. Itulah yang saya inginkan.
therobyouknow
2
apa yang --dilakukannya?
Ray Foss
2
@RayFoss ini memberitahu git bahwa parameter berikut adalah file (jika tidak, mereka bisa bingung dengan hash komit, cabang atau yang lainnya). Biasanya mereka tidak dibutuhkan tetapi tidak ada salahnya untuk menempatkannya
Carlos Campderrós
3

Ada dua cara mudah untuk melakukannya:

Jika komit yang menyertakan kesalahan hanya menyertakan kesalahan, gunakan git revertuntuk membalikkan efeknya.

Jika tidak, jalan yang mudah adalah ini:

  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 …"
Daniel Pittman
sumber
1

Jika Anda hanya melakukannya git checkout <SHA-ID>maka itu sementara akan memindahkan Anda ke sha-commit itu.

Setiap objek komit menampung seluruh struktur disk pada saat itu, jadi jika Anda memiliki file di sana dan perlu menyalinnya, Anda dapat melakukannya. Peringatan, Anda tidak akan berada di cabang mana pun, jadi Anda harus kembali ke master sebelum menyalin file ke pohon kerja Anda dan melakukannya.

Mark Fisher
sumber
re "pindah kembali ke master" yang Anda maksud master checkout?
Pacerier