Pulihkan folder yang dihapus di repo Git


105

Saya telah menghapus semua konten di dalam folder dan folder tersebut kosong. Saya masih memiliki salinan di repo jarak jauh saya. Tetapi ketika saya melakukan git pullitu tidak mengembalikan file yang dihapus bukankah seharusnya melakukan itu?

Jadi saya melakukan penelitian dan melihat bahwa Anda dapat mengembalikan file dengan melakukan git checkout <revision> -- <name of file>

Tapi itu hanya berfungsi pada file.

Bagaimana cara mengambil semua file di dalam direktori?


1
git statusakan memberi Anda petunjuk tentang perintah apa yang harus dijalankan
Tavian Barnes

1
Sepertinya Anda masih memiliki direktori lama di repo jarak jauh Anda (dan bahkan mungkin memilikinya di repo lokal Anda juga). SARAN KUAT: 1) Lakukan "penarikan" dari remote repo Anda ke repo BARU (jangan lakukan kerusakan lagi pada repo lokal Anda). 2) Coba "checkout" ... atau bahkan "kembali" di repo lokal Anda yang baru: atlassian.com/git/tutorials/undoing-changes/git-revert . 3) Perbarui repo jarak jauh jika Anda yakin semuanya baik-baik saja.
paulsm4

Jawaban:


262

Semua yang dapat Anda lakukan dengan file, Anda juga dapat melakukannya dengan folder.

Perhatikan juga Temukan dan pulihkan file yang dihapus dalam repositori Git


File dihapus dari pohon kerja tetapi belum dikomit:

Jika Anda belum mengindeks ( git add) perubahan Anda, Anda dapat mengembalikan konten direktori:

git checkout -- path/to/folder

Jika penghapusan sudah diindeks, Anda harus mengatur ulang terlebih dahulu:

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


Pulihkan pohon kerja penuh (bukan satu folder), tetapi hilangkan semua perubahan yang belum dilakukan

git reset --hard HEAD


Ketika file dihapus di beberapa komit di masa lalu:

Temukan komit terakhir yang memengaruhi jalur yang diberikan. Karena file tidak ada dalam komit HEAD, komit ini pasti telah menghapusnya.

git rev-list -n 1 HEAD -- <file_path>

Kemudian periksa versi di komit sebelumnya, menggunakan ^simbol caret ( ):

git checkout <deleting_commit>^ -- <file_path>


Pulihkan pohon kerja penuh dari komit jauh

git reset --hard <revision> 

1
git checkout -- path/to/folder/* tidak berfungsi Catatan: pertanyaannya adalah bagaimana mengembalikan folder, bukan file
gman

@gman How can I retrieve all the files inside the directoryberarti direktori dan file-nya. Tapi perintah itu secara mengejutkan tidak berhasil untukku juga. Saya ingat itu terjadi setahun yang lalu.
Nick Volynkin

2
@gman tetapi berfungsi seperti git checkout -- pathatau git checkout -- 'path/*'. Dalam contoh Anda, Anda menghapus git rmyang tampaknya tidak dilakukan OP. Saya telah menambahkan instruksi untuk kasus seperti itu. Terima kasih!
Nick Volynkin

3
Pada Windows Anda perlu memberi tanda kutip seperti ini:git checkout "<deleting_commit>^" -- <file_path>
Maor

Itu unstaged banyak hal di seluruh repo meskipun saya menentukan folder pada perintah reset. Bagaimana ini masuk akal? Ketika saya menjalankan kasir, sepertinya itu memulihkan folder saya. Saya tidak tahu apa yang dilakukan unstage pada sisa kode saya, ah kegembiraan manajer repositori peer to peer digunakan untuk repositori terpusat, hah.
Paul Kenjora

5

Jika Anda belum melakukan perubahan, Anda dapat mengembalikan konten atau direktori:

git checkout -- removed_directory

Jika Anda ingin mengembalikan semua perubahan lakukan:

git reset --hard HEAD

3
git checkout -- removed_directory tidak bekerja
gman

git checkout -- removed_directorybekerja untuk saya, tetapi saya telah membuat direktori ini sebelumnya (oleh checkoutsalah satu file di direktori itu). Setelah pembuatan semua file dikembalikan ke folder dengan perintah ini.
Boolean_Type


4

Satu-satunya hal yang berhasil bagi saya adalah melakukan checkout repo di folder lain. Asumsikan repo saat ini masuk /home/me/current.

Saya kemudian melakukannya

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

Ini membuat klon terpisah dari repo /home/me/temp

Sekarang saya dapat pergi /home/me/tempdan melakukan apa pun yang saya inginkan. Sebagai contoh

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

Sekarang saya dapat menyalin kembali folder file yang dihapus

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

Dan hapus folder temp

rm -rf /home/me/temp

Contoh dari

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

TIDAK BEKERJA

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

Contoh lain seperti

git reset --hard HEAD

merusak lebih dari sekadar file yang dihapus. Perubahan lainnya juga akan hilang.

Demikian pula

git reset --hard some-commit

akan kehilangan komitmen apa pun setelahnya some-commit


3

Mulai git 2.24.0, ada perintah git baru eksperimental: git restore

git restore --staged some/deleted/folder

0

Jika Anda tidak menentukan file tertentu, Anda harus dapat menarik konten lengkap dari komit tertentu. Seperti: git checkout 264794319e9695ba843cd6(dengan asumsi bahwa hash memiliki semua file Anda di status yang benar).

Alasan pulltidak memulihkan file adalah karena git melihat penghapusan Anda sebagai perubahan terbaru, menerapkannya di atas apa pun yang Anda tarik.

(Saya akan merekomendasikan bereksperimen di cabang baru.)


0

Jika Anda hanya ingin memulihkan folder yang dihapus dan Anda memiliki komit lain setelah penghapusan, Anda juga dapat langsung mengunjungi proyek Anda di github.com.

Dari github.com, arahkan Anda ke komit terakhir yang memiliki folder Anda. Anda harus melihat pesan komit dan di sebelah kanan ada tombol berlabel "Jelajahi File". Mengklik ini akan membawa Anda ke semua file dari tahap komit tersebut.

Dari sana Anda dapat mengkloning kode atau hanya mendownload kode tersebut sebagai zip.


-1

untuk penghapusan tanpa komitmen, Ini sesederhana ini:

git reset HEAD rel / path / ke / dihapus / direktori / *

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.