Pertanyaan Temukan dan pulihkan file yang terhapus dalam repositori Git


Katakanlah saya berada di repositori Git. Saya menghapus file dan melakukan perubahan itu. Saya terus bekerja dan membuat beberapa komitmen lagi. Kemudian, saya merasa perlu memulihkan file itu.

Saya tahu saya dapat memeriksa file menggunakan git checkout HEAD^ foo.bar, tapi saya tidak tahu kapan file itu dihapus.

  1. Apa cara tercepat untuk menemukan commit yang menghapus nama file yang diberikan?
  2. Apa cara termudah untuk mengembalikan file itu ke dalam copy pekerjaan saya?

Saya berharap saya tidak harus secara manual menelusuri log saya, checkout seluruh proyek untuk SHA yang diberikan dan kemudian secara manual menyalin file itu ke checkout proyek asli saya.


2382
2018-06-04 22:40


asal


Jawaban:


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

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

Kemudian checkout versi pada commit sebelumnya, menggunakan tanda sisipan (^) simbol:

git checkout <deleting_commit>^ -- <file_path>

Atau dalam satu perintah, jika $file adalah file yang dimaksud.

git checkout $(git rev-list -n 1 HEAD -- "$file")^ -- "$file"

Jika Anda menggunakan zsh dan mengaktifkan opsi EXTENDED_GLOB, simbol tanda aksen tidak akan berfungsi. Kamu dapat memakai ~1 sebagai gantinya.

git checkout $(git rev-list -n 1 HEAD -- "$file")~1 -- "$file"

2718
2017-07-11 07:12



  1. Menggunakan git log --diff-filter=D --summary untuk mendapatkan semua komit yang telah menghapus file dan file yang dihapus;
  2. Menggunakan git checkout $commit~1 filename untuk mengembalikan file yang dihapus.

Dimana $commit adalah nilai komitmen yang Anda temukan pada langkah 1, mis. e4cf499627


723
2018-06-04 23:10



Untuk mengembalikan semua file yang terhapus dalam folder, masukkan perintah berikut.

git ls-files -d | xargs git checkout --

301
2017-12-02 06:11



Saya sampai pada pertanyaan ini untuk mengembalikan file yang baru saya hapus tetapi saya belum melakukan perubahan. Kalau-kalau Anda menemukan diri Anda dalam situasi ini, yang perlu Anda lakukan adalah sebagai berikut:

git checkout HEAD -- path/to/file.ext


99
2018-04-10 00:03



Jika Anda gila, gunakan git-bisect. Inilah yang harus dilakukan:

git bisect start
git bisect bad
git bisect good <some commit where you know the file existed>

Sekarang saatnya untuk menjalankan tes otomatis. Perintah shell '[ -e foo.bar ]' akan mengembalikan 0 jika foo.bar ada, dan 1 sebaliknya. Perintah "jalankan" dari git-bisect akan menggunakan pencarian biner untuk secara otomatis mencari commit pertama di mana tes gagal. Ini dimulai di tengah-tengah rentang yang diberikan (dari baik ke buruk) dan memotongnya menjadi setengah berdasarkan hasil tes yang ditentukan.

git bisect run '[ -e foo.bar ]'

Sekarang Anda berada di komit yang menghapusnya. Dari sini, Anda dapat melompat kembali ke masa depan dan menggunakannya git-revert untuk membatalkan perubahan,

git bisect reset
git revert <the offending commit>

atau Anda dapat kembali melakukan satu commit dan memeriksa kerusakan secara manual:

git checkout HEAD^
cp foo.bar /tmp
git bisect reset
cp /tmp/foo.bar .

82
2018-06-04 22:46



Alias ​​favorit baru saya, berdasarkan bonyiii's menjawab (upvoted), dan jawaban saya sendiri tentang "Berikan argumen ke perintah alias Git":

git config alias.restore '!f() { git checkout $(git rev-list -n 1 HEAD -- $1)~1 -- $(git diff --name-status $(git rev-list -n 1 HEAD -- $1)~1 | grep '^D' | cut -f 2); }; f'

Saya telah kehilangan file, dihapus oleh kesalahan beberapa commit yang lalu?
Cepat:

git restore my_deleted_file

Krisis dihindari.


Robert Dailey mengusulkan di komentar alias berikut:

restore-file = !git checkout $(git rev-list -n 1 HEAD -- "$1")^ -- "$1"

Dan jegan tambah di komentar:

Untuk mengatur alias dari baris perintah, saya menggunakan perintah ini:

git config --global alias.restore "\!git checkout \$(git rev-list -n 1 HEAD -- \"\$1\")^ -- \"\$1\"" 

61
2018-02-17 15:33



Jika Anda tahu nama file, ini adalah cara mudah dengan perintah dasar:

Daftar semua commit untuk file itu.

git log -- path/to/file

Komit terakhir (paling atas) adalah yang menghapus file. Jadi, Anda perlu mengembalikan komit kedua hingga terakhir.

git checkout {second to last commit} -- path/to/file

42
2018-02-27 01:50



Untuk mengembalikan file yang dihapus dan dikomitmenkan:

git reset HEAD some/path
git checkout -- some/path

Itu diuji pada Git versi 1.7.5.4.


27
2017-07-04 04:39



Jika Anda hanya membuat perubahan dan menghapus file, tetapi tidak melakukannya, dan sekarang Anda putus dengan perubahan Anda

git checkout -- .

tetapi file yang dihapus tidak kembali, Anda cukup melakukan perintah berikut:

git checkout <file_path>

Dan presto, file Anda sudah kembali.


21
2017-09-02 15:30