Menemukan dan memulihkan file yang dihapus dalam repositori Git

Mengatakan I'm di sebuah repositori Git. Aku menghapus file dan melakukan perubahan itu. Saya terus bekerja dan membuat lebih banyak melakukan. Kemudian, saya menemukan saya perlu untuk mengembalikan file tersebut.

Aku tahu aku bisa checkout file menggunakan git checkout KEPALA^ foo.bar`, tapi aku don't benar-benar tahu ketika file yang telah dihapus.

  1. Apa yang akan menjadi cara tercepat untuk menemukan komitmen yang dihapus yang diberi nama file?
  2. Apa yang akan menjadi cara termudah untuk mendapatkan file kembali ke kerja saya copy?

I'm berharap aku don't harus secara manual browsing saya log, checkout seluruh proyek yang diberikan SHA dan kemudian secara manual copy file tersebut ke my asli proyek checkout.

Mengomentari pertanyaan (7)
Larutan

Menemukan komit terakhir yang mempengaruhi diberikan jalan. Sebagai file isn't di KEPALA melakukan, melakukan ini harus dihapus.

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

Kemudian checkout versi yang di lakukan sebelum, menggunakan karet (^) simbol:

git checkout ^ -- <File_path>

Atau dalam satu perintah, jika $file file tersebut.

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

Jika anda menggunakan zsh dan memiliki EXTENDED_GLOB pilihan diaktifkan, karet simbol won't bekerja. Anda dapat menggunakan ~1 sebagai gantinya.

git checkout $(git rev-list -n 1 HEAD -- "$file")~1 -- "$file"
Komentar (20)
  1. Menggunakan git log --diff-filter=D --ringkasan` untuk mendapatkan semua komitmen yang telah dihapus file dan file dihapus;
  2. Menggunakan git checkout $komit~1 path/ke/file.ext` untuk mengembalikan file yang dihapus.

Di mana $melakukan adalah nilai komit anda've ditemukan pada langkah 1, misal e4cf499627

Komentar (11)

Untuk mengembalikan semua file yang dihapus di folder masukkan perintah berikut.

git ls-files -d | xargs git checkout --
Komentar (7)

Aku datang untuk pertanyaan ini yang ingin mengembalikan file yang baru saja dihapus tapi saya tidak't belum dilakukan perubahan. Hanya dalam kasus anda menemukan diri anda dalam situasi ini, semua yang perlu anda lakukan adalah sebagai berikut:

git checkout KEPALA-path/ke/file.ext

Komentar (0)

Jika kau gila, gunakan git-membagi dua. Berikut ini's apa yang harus dilakukan:

git bisect start
git bisect bad
git bisect good 

Sekarang ini's waktu untuk menjalankan tes otomatis. Shell perintah &#39;[ -e foo.bar ]&#39; akan mengembalikan 0 jika foo.bar ada, dan 1 jika tidak. "run" perintah git-membagi dua` akan menggunakan pencarian biner untuk secara otomatis menemukan komit pertama di mana tes gagal. Mulai pertengahan kisaran yang diberikan (dari yang baik sampai yang buruk) dan luka dalam setengah didasarkan pada hasil uji yang ditentukan.

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

Sekarang anda'kembali pada komitmen yang dihapus itu. Dari sini, anda dapat melompat kembali ke masa depan dan menggunakan git-kembalikan untuk membatalkan perubahan,

git bisect reset
git revert 

atau anda bisa kembali satu kali dan secara manual memeriksa kerusakan:

git checkout HEAD^
cp foo.bar /tmp
git bisect reset
cp /tmp/foo.bar .
Komentar (4)

Favorit saya baru alias, berdasarkan bonyiii's jawaban (upvoted), dan saya sendiri jawaban tentang "Lulus argumen untuk Git alias command":

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 yang telah dihapus oleh kesalahan beberapa komitmen yang lalu? Cepat:

git restore my_deleted_file

Krisis dihindari.


Robert Dailey mengusulkan komentar berikut ini alias:

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

Dan jegan menambahkan komentar:

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

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

Jika anda tahu nama file, ini adalah cara yang mudah dengan perintah-perintah dasar:

Daftar semua komit untuk file itu.

git log -- path/to/file

Komit terakhir (paling atas) adalah salah satu yang dihapus file. Jadi, anda perlu untuk mengembalikan kedua untuk komit terakhir.

git checkout {second to last commit} -- path/to/file
Komentar (5)

Untuk memulihkan dihapus dan berkomitmen file:

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

Itu diuji pada versi Git 1.7.5.4.

Komentar (3)

Jika anda hanya membuat perubahan dan menghapus file, tetapi tidak melakukan itu, dan sekarang anda putus dengan perubahan

git checkout -- .

tapi file yang dihapus tidak kembali, anda cukup melakukan perintah berikut:

git checkout <File_path>

Dan presto, file anda kembali.

Komentar (0)

I've got solusi.

  1. Dapatkan id commit mana file yang telah dihapus menggunakan salah satu cara di bawah ini.
  • git log --grep=*kata*
  • git log -Pedang
  • git log | grep --konteks=5 *kata*
  • git log --stat | grep --konteks=5 *kata* # dianjurkan jika anda tidak ingat apa-apa
  1. Anda harus mendapatkan sesuatu seperti:

melakukan bfe68bd117e1091c96d2976c99b3bcc8310bebe7 Penulis: Alexander Orlov alexander.orlov@loxal.net Date: Thu May 12 23:44:27 2011 +0200

menggantikan usang GWT kelas

  • gwtI18nKeySync.sh, usang (?, digantikan oleh Maven tujuan) I18n generasi script

melakukan 3ea4e3af253ac6fd1691ff6bb89c964f54802302 Penulis: Alexander Orlov alexander.orlov@loxal.net Date: Thu May 12 22:10:22 2011 +0200

3. Sekarang menggunakan komit id bfe68bd117e1091c96d2976c99b3bcc8310bebe7 lakukan:

git checkout bfe68bd117e1091c96d2976c99b3bcc8310bebe7^1 yourDeletedFile.java

Sebagai komit id referensi komit mana file sudah dihapus yang anda butuhkan untuk referensi komit sebelum bfe68b yang dapat anda lakukan dengan menambahkan ^1. Ini berarti: memberi saya komit sebelum bfe68b.

Komentar (2)
git checkout /path/to/deleted.file
Komentar (2)

git undelete path/ke/file.ext

  1. Menempatkan ini pada anda .bash_profile (atau lainnya yang relevan file yang akan terbuka bila anda membuka command shell):

git config --global alias.undelete '!sh -c "git checkout $(git rev-daftar -n 1 KEPALA - $1)^ -- $1" -'

  1. Kemudian gunakan:

git undelete path/ke/file.ext

Alias ini cek pertama untuk menemukan komit terakhir di mana file ini ada, maka tidak git checkout path file itu dari yang komit terakhir di mana file ini ada. source

Komentar (1)

Dalam banyak kasus, hal ini dapat berguna untuk menggunakan coreutils (grep, sed, dll.) dalam hubungannya dengan Git. Aku sudah tahu alat ini cukup baik, tapi Git kurang begitu. Jika saya ingin lakukan pencarian file yang dihapus, saya akan melakukan hal-hal berikut:

git log --raw | grep -B 30 $'D\t.*deleted_file.c'

Ketika saya menemukan revisi/commit:

git checkout ^ -- path/to/refound/deleted_file.c

Sama seperti orang lain telah menyatakan di hadapan-ku.

File sekarang akan dikembalikan ke negara itu sebelum penghapusan. Ingat untuk kembali berkomitmen untuk bekerja pohon jika anda ingin menyimpan sekitar.

Komentar (0)

Jadi saya harus mengembalikan sekelompok file yang dihapus dari tertentu melakukan dan saya berhasil dengan dua perintah:

git show  --diff-filter=D --summary --name-only --no-commit-id | xargs git checkout ^ -- 
git show  --diff-filter=D --summary --name-only --no-commit-id | xargs git reset HEAD 

(Perhatikan trailing spasi di akhir setiap perintah.)

File telah ditambahkan ke .gitignore file dan kemudian dibersihkan dengan git rm, aku yang dibutuhkan untuk mengembalikan file tapi kemudian disimpan mereka. Aku telah ratusan file untuk memulihkan, hal mengetik secara manual untuk masing-masing file seperti dalam contoh-contoh lain akan menjadi terlalu lambat.

Komentar (0)

Sebenarnya, pertanyaan ini secara langsung tentang Git, tapi orang seperti saya bekerja dengan GUI alat-alat seperti WebStorm VCS lain dari mengetahui tentang git cli perintah.

Saya klik kanan pada path yang berisi file yang dihapus, kemudian pergi ke Git dan kemudian klik Show History.

VCS alat tampilkan semua revisi kereta dan aku bisa melihat semua komit dan perubahan masing-masing dari mereka.

Maka saya pilih komit bahwa teman saya hapus PostAd.js file. sekarang lihat di bawah ini:

Dan sekarang, saya bisa melihat keinginan saya dihapus file. Aku hanya klik-ganda pada nama file dan pulih.

Saya tahu jawaban saya adalah tidak Git perintah tapi hal ini cepat, handal dan mudah untuk pemula dan pengembang profesional. Webstorm VCS alat-alat yang mengagumkan dan sempurna untuk bekerja dengan Git` dan doesn't perlu plugin lain atau alat-alat.

Komentar (2)

Saya memiliki pertanyaan yang sama. Tanpa sadar, aku telah menciptakan sebuah menjuntai melakukan.

Daftar menjuntai melakukan

git fsck-hilang-ditemukan

Memeriksa setiap menjuntai melakukan

git reset --hard <komit id>

File saya muncul kembali ketika saya pindah ke menjuntai melakukan.

git status dengan alasan:

"KEPALA terpisah dari <komit id di mana ia terpisah>"

Komentar (0)
user@bsd:~/work/git$ rm slides.tex
user@bsd:~/work/git$ git pull 
Already up-to-date.
user@bsd:~/work/git$ ls slides.tex
ls: slides.tex: No such file or directory

Mengembalikan file yang dihapus:

user@bsd:~/work/git$ git checkout
D       .slides.tex.swp
D       slides.tex
user@bsd:~/work/git$ git checkout slides.tex 
user@bsd:~/work/git$ ls slides.tex
slides.tex
Komentar (2)

Dalam kasus kami, kami tidak sengaja menghapus file dalam berbuat dan melakukan beberapa kemudian kami menyadari kesalahan kami dan ingin mendapatkan kembali semua file-file yang dihapus tetapi tidak dimodifikasi.

Berdasarkan Charles Bailey's jawaban yang sangat baik di sini adalah saya salah satu kapal:

git co $(git rev-list -n 1 HEAD -- <File_path>)~1 -- $(git diff --name-status $(git rev-list -n 1 HEAD -- <File_path>)~1 head | grep '^D' | cut -f 2)
Komentar (0)

Jika anda tahu melakukan itu dihapus file(s), jalankan perintah ini di mana <SHA1_deletion> adalah melakukan yang dihapus file:

git diff --diff-filter=D --name-only ~1  | xargs git checkout ~1 --

Bagian sebelum pipa berisi daftar semua file yang dihapus di commit; mereka semua checkout dari sebelumnya berkomitmen untuk mengembalikan mereka.

Komentar (0)

Menemukan berkomitmen bahwa dihapus file anda:

git log --diff-filter=D --oneline -- path/to/file | cut -f -d ' '

Contoh output:

4711174

Sebagai Git 2.23 sebenarnya ada mengembalikan perintah. Itu adalah masih eksperimental tapi dalam rangka untuk mengembalikan sesuatu yang anda dihapus dalam melakukan (4711174 dalam hal ini) anda dapat kemudian ketik:

git restore --source=4711174^ path/to/file

Catatan ^ setelah melakukan id seperti yang kita ingin mengembalikan sesuatu dari komit sebelum salah satu yang dihapus file.

The --sumber argumen menceritakan mengembalikan perintah mana untuk mencari file(s) untuk mengembalikan dan hal ini dapat setiap melakukan dan bahkan indeks.

Lihat: git-mengembalikan doc untuk git 2.23.0

Komentar (0)