Temukan dan pulihkan file yang dihapus di repositori Git

2802

Katakan saya di repositori Git. Saya menghapus file dan melakukan perubahan itu. Saya terus bekerja dan membuat lebih banyak komitmen. Kemudian, saya merasa saya harus mengembalikan file itu.

Saya tahu saya dapat checkout file menggunakan git checkout HEAD^ foo.bar, tetapi saya tidak benar-benar tahu kapan file itu dihapus.

  1. Apa cara tercepat untuk menemukan komit yang menghapus nama file yang diberikan?
  2. Apa cara termudah untuk mengembalikan file itu ke 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.

avdgaag
sumber
39
perhatikan bahwa komentar sebelumnya menjawab pertanyaan dalam judul, bukan di badan - yang termasuk mencari tahu kapan file itu dihapus.
avdgaag
8
Untuk menemukan komit, sebuah file dihapus di:git log --diff-filter=D -- path/to/file
titaniumdecoy
54
@hhh git checkout deletedFileakan membatalkan penghapusan deletedFilejika sudah dihapus tetapi penghapusan itu belum dilakukan atau dilakukan . Bukan itu yang ditanyakan di sini; pertanyaan ini adalah tentang cara mengembalikan file yang penghapusannya dilakukan beberapa kali lalu.
Mark Amery

Jawaban:

3150

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

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

Kemudian checkout versi di komit sebelumnya, menggunakan ^simbol tanda sisipan ( ):

git checkout <deleting_commit>^ -- <file_path>

Atau dalam satu perintah, jika $file file tersebut dipertanyakan.

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

Jika Anda menggunakan zsh dan mengaktifkan opsi EXTENDED_GLOB, simbol caret tidak akan berfungsi. Anda bisa menggunakannya ~1.

git checkout $(git rev-list -n 1 HEAD -- "$file")~1 -- "$file"
CB Bailey
sumber
94
Agak sulit adalah untuk checkout komit SEBELUM, menggunakan akhiran ^. Terima kasih.
Christian Oudard
4
Untuk beberapa alasan, ini tidak akan berfungsi di zsh. ± git checkout $(git rev-list -n 1 HEAD "spec/Sporkfile_example.rb")^ -- "spec/Sporkfile_example.rb" zsh: no matches found: b71c152d8f38dcd23ad7600a93f261a7252c59e9^ Saya beralih ke bash & itu bekerja dengan baik.
zoras
20
Dari baris perintah windows saya mendapat kesalahan. error: pathspec <filename> did not match any file(s) known to git.. Solusinya adalah menggunakan git bash.
donturner
56
@zoras zsh memiliki ekspansi sendiri di '^' Saya percaya, tetapi Anda dapat menggunakan sintaks alternatif '~ 1': git checkout <deleting-commit>~1 -- <file-path> ~ X memungkinkan Anda untuk menentukan komit X sebelum komit yang ditentukan, jadi ~ 1 adalah komit sebelumnya, ~ 2 adalah dua komitmen sebelumnya, dll
Nils Luxton
22
Pada windows cmd prompt, ^karakter adalah karakter pelarian! Oleh karena itu, pada cmd, Anda harus mengetik ^^untuk memberi tahu cmd Anda menginginkan satu literal ^ dan bahwa Anda tidak melarikan diri dari sesuatu yang lain setelahnya. Apa yang terjadi pada banyak orang adalah bahwa ^diikuti oleh spasi. Jadi cmd berpikir Anda melarikan diri dari ruang - yang menghasilkan karakter ruang saja. Jadi, pada saat git mendapatkan argumen cli, ia melihat SHA1dan tidak SHA1^ . Benar-benar menjengkelkan. ~bukan karakter pelarian, jadi itu sebabnya itu masih berfungsi. (PS. Jika Anda berpikir para googler menginginkan informasi ini, harap beri komentar dengan komentar)
Alexander Bird
875
  1. Menggunakan git log --diff-filter=D --summary untuk mendapatkan semua komit yang memiliki file yang dihapus dan file yang dihapus;
  2. Gunakan git checkout $commit~1 path/to/file.extuntuk mengembalikan file yang dihapus.

Di mana $commitnilai komit yang Anda temukan pada langkah 1, mise4cf499627

Robert Munteanu
sumber
10
penasaran, apa yang dimaksud dengan ~ 1?
tommy chheng
7
@tommy - spec tilde akan memberi Anda cucu ke-n komit bernama. Lihat book.git-scm.com/4_git_treeishes.html untuk detail lebih lanjut.
Robert Munteanu
5
sejauh ini ini merupakan pendekatan yang paling mudah dan intuitif. git log -- *PartOfMyFileName*. Terima kasih untuk$commit~1
bgs
3
yang git checkout $commit~1 filenamesintaks bekerja sempurna untuk file individual, dan juga bekerja untuk seluruh direktori. yaitu: untuk mengembalikan semua gambar dihapus di ./images dari sha 12345: git checkout 12345~1 images. terima kasih atas jawaban ini!
noinput
34
@Alexar $commit~1berarti Anda harus menambahkan nama komit. Sesuatu seperti 1d0c9ef6eb4e39488490543570c31c2ff594426cdimana $commit.
Eugene
319

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

git ls-files -d | xargs git checkout --
Manu
sumber
1
Di mana file bisa disalurkan ke? Saya tidak melihat perubahan.
William Grand
21
Ini mungkin metode yang paling mudah. Ini menyimpang betapa sulitnya gitmembuat tugas yang paling sederhana sekalipun.
jww
git checkout - [file] akan mengembalikan perubahan dalam [file]. Pipa akan mengganti [file] dengan nama file yang dihapus.
Manu
6
The ls-filessub-perintah berguna, tetapi tampaknya tidak bekerja untuk file yang telah dihapus dengan git rmyaitu dipentaskan, apalagi berkomitmen, yang adalah apa yang OP bertanya.
MarkHu
Ini berfungsi untuk memulihkan file yang dihapus, tetapi bagaimana saya bisa memperbarui file yang mana berubah dan muncul M myChangedFilesetelahnya git checkout?
Libby
124

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

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

Brett
sumber
93

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 menjalankan tes otomatis. Perintah shell '[ -e foo.bar ]'akan mengembalikan 0 jika foo.barada, dan 1 jika tidak. Perintah "jalankan" git-bisectakan menggunakan pencarian biner untuk secara otomatis menemukan komit pertama di mana pengujian gagal. Mulai setengah rentang yang diberikan (dari yang baik ke yang buruk) dan memotongnya menjadi dua 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 menggunakan git-revertuntuk membatalkan perubahan,

git bisect reset
git revert <the offending commit>

atau Anda dapat kembali satu komit dan memeriksa kerusakan secara manual:

git checkout HEAD^
cp foo.bar /tmp
git bisect reset
cp /tmp/foo.bar .
Josh Lee
sumber
2
Bisakah Anda menjelaskan lebih lanjut git bisect run '[ -e foo.bar ]'?
avdgaag
Anda juga dapat menggunakan baik dan buruk secara manual, jika itu adalah sesuatu yang tidak dapat diperiksa secara otomatis. Lihat halaman dua bagian.
Josh Lee
1
@avdgaag git bisect runmemberitahu Git untuk mengotomatisasi pembagian dua dengan menjalankan perintah berikut kata 'jalankan' di mana perintah harus kembali 0untuk goodversi (lihat git help bisectuntuk detail). Ini '[ -e foo.bar ]'adalah ekspresi standar untuk pengujian jika file foo.barmemang ada (implementasinya biasanya dalam file /usr/bin/[yang biasanya di-hardlink /usr/bin/test) dan tanda kuasi tunggal digunakan untuk menempatkan semua itu sebagai argumen baris perintah tunggal.
Mikko Rantalainen
Ide yang hebat. Saya mencoba pendekatan ini dan mengidentifikasi komit sebelum dihapus, tetapi bukan komit yang benar-benar menghapus file. Dan dalam tes lain itu mengidentifikasi 2 melakukan sebelum penghapusan.
Michael Osofsky
Gila? Mungkin. Tetapi membagi dua adalah cara yang bagus untuk membantu menemukan di mana bug diperkenalkan dan karenanya merupakan keterampilan yang berharga untuk dipelajari. Jadi, meskipun mungkin bukan cara yang 'benar' atau paling 'benar' di sini, itu masih merupakan ide bagus dan bernilai +1 pasti!
Pryftan
77

Alias favorit baru saya, berdasarkan bonyiii 's jawaban (upvoted), dan jawaban saya sendiri tentang ' Lulus argumen untuk 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 kehilangan file, terhapus karena kesalahan beberapa komitmen lalu?
Cepat:

git restore my_deleted_file

Krisis dihindari.

Peringatan, dengan Git 2.23 (Q3 2019) hadir perintah eksperimental bernama git restore(!).
Jadi ganti nama alias ini (seperti yang ditunjukkan di bawah ini).


Robert Dailey mengusulkan dalam komentar alias berikut:

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

Dan jegan menambahkan dalam 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\"" 
VONC
sumber
7
Ini mengembalikan seluruh komit, bukan hanya file yang diminta.
Daniel Bang
5
Ini alias saya, bekerja dengan sangat baik:restore-file = !git checkout $(git rev-list -n 1 HEAD -- "$1")^ -- "$1"
void.pointer
1
@RobertDailey Itu terlihat bagus! Saya telah memasukkan alias Anda dalam jawaban untuk lebih banyak visibilitas.
VonC
1
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\""
jegan
2
Expansion of alias 'restore' failed; '!git' is not a git command
Karl Morrison
55

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

Daftar semua komitmen untuk file itu.

git log -- path/to/file

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

git checkout {second to last commit} -- path/to/file
wisbucky
sumber
Hanya menggunakan solusi ini dan tidak ada komit untuk penghapusan. Saya bisa mengembalikan file menggunakan id komit terbaru.
Adam
Tidakkah komit berikutnya ke terakhir (komit sebelumnya untuk penghapusan) berisi versi terbaru dari file yang dihapus? Kedua-ke-terakhir (komit sebelum komit sebelumnya untuk penghapusan) bisa jadi sudah ketinggalan zaman.
Suncat2000
1
Ini adalah solusi pertama yang saya lihat cukup sederhana sehingga saya tidak perlu kembali ke sini untuk menemukannya di lain waktu. Mungkin.
Eloff
@ Suncat2000 "second to last" berarti "commit sebelumnya ke penghapusan", sama dengan "next to last". en.wiktionary.org/wiki/penultimate#Sinonim
wisbucky
Terima kasih banyak kali untuk jawaban ini !!!!!
Rakesh Bk
29

Untuk mengembalikan file yang dihapus dan berkomitmen:

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

Itu diuji pada Git versi 1.7.5.4.

Fedir RYKHTIK
sumber
1
Itu tidak berhasil untuk saya. Setelah checkout, saya error: pathspec 'foo' did not match any file(s) known to git.memastikan bahwa nama file itu benar. Git versi 2.7.0
wisbucky
-1; ini salah. Perintah-perintah ini akan membatalkan penghapusan itu belum dilakukan (yang pertama menghapus tahapan penghapusan, jika itu dipentaskan, dan yang kedua membuang perubahan yang tidak dipentaskan pada file), tetapi Anda mengklaim di sini bahwa mereka akan mengembalikan sebuah komitmen penghapusan file, yang tidak benar dan akan gagal dengan kesalahan seperti itu dalam komentar @ wisbucky di atas.
Mark Amery
@MarkAmery Memang, saya pikir perintah ini bekerja dengan baik untuk para pengembang, yang tidak membuat pementasan eksplisit untuk melakukan untuk file yang dihapus dengan git add -A, tetapi file yang dipulihkan masih dalam tahap tidak berkomitmen.
Fedir RYKHTIK
25

Jika Anda hanya membuat perubahan dan menghapus file, tetapi tidak melakukan itu, 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 kembali.

Paulo Linhares - Packapps
sumber
24

Saya punya solusi ini .

  1. Dapatkan id komit tempat file dihapus menggunakan salah satu cara di bawah ini.

    • git log --grep=*word*
    • git log -Sword
    • git log | grep --context=5 *word*
    • git log --stat | grep --context=5 *word* # disarankan jika Anda hampir tidak ingat apa pun
  2. Anda harus mendapatkan sesuatu seperti:

commit bfe68bd117e1091c96d2976c99b3bcc8310bebe7 Penulis: Alexander Orlov Tanggal: Kamis 12 Mei 23:44:27 2011 +0200

replaced deprecated GWT class
- gwtI18nKeySync.sh, an outdated (?, replaced by a Maven goal) I18n generation script

commit 3ea4e3af253ac6fd1691ff6bb89c964f54802302 Penulis: Alexander Orlov Tanggal: Kamis 12 Mei 22:10:22 2011 +0200

3 . Sekarang menggunakan commit id bfe68bd117e1091c96d2976c99b3bcc8310bebe7 lakukan:

git checkout bfe68bd117e1091c96d2976c99b3bcc8310bebe7^1 yourDeletedFile.java

Sebagai komit referensi referensi komit di mana file itu sudah dihapus, Anda perlu referensi komit sebelum bfe68b yang dapat Anda lakukan dengan menambahkan ^1. Ini berarti: beri saya komit sebelum bfe68b.

Alex
sumber
Ini adalah pendekatan yang sama dengan jawaban yang diterima, tetapi dengan beberapa cara lagi untuk menemukan komit yang dihapus. Saya masih suka pendekatan yang diambil dalam jawaban yang diterima, tetapi ini adalah alternatif yang baik. Terima kasih!
avdgaag
Saya berasumsi bahwa pertama-tama memeriksa file yang dihapus dan kemudian (tanpa mengubahnya) melakukannya tidak membuat salinan file. Baik? (Saya perlu melakukan ini dengan gambar, dan salinan akan membuat repositori lebih besar)
Stonecrusher
15
git checkout /path/to/deleted.file
pengguna1528493
sumber
Yang ini untuk situasi saya (dihilangkan secara tidak sengaja) adalah solusi yang paling mudah.
Paulo Oliveira
Penjelasan akan diurutkan.
Peter Mortensen
12

git undelete path/to/file.ext

  1. Masukkan ini ke dalam .bash_profile(atau file relevan lainnya yang dimuat saat Anda membuka shell perintah):

    git config --global alias.undelete '!sh -c "git checkout $(git rev-list -n 1 HEAD -- $1)^ -- $1" -'
    
  2. Kemudian gunakan:

    git undelete path/to/file.ext
    

Alias ​​ini terlebih dahulu memeriksa untuk menemukan komit terakhir di mana file ini ada, dan kemudian melakukan checkout Git dari path file itu dari komit terakhir di mana file ini ada. Sumber .

Beau Smith
sumber
11

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

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

Ketika saya menemukan revisi / komit:

git checkout <rev>^ -- path/to/refound/deleted_file.c

Seperti yang orang lain katakan di depan saya.

File sekarang akan dikembalikan ke keadaan sebelum dihapus. Jangan lupa komit kembali ke pohon kerja jika Anda ingin menyimpannya.

Thomas E
sumber
7

Saya harus mengembalikan banyak file yang dihapus dari komit tertentu, dan saya berhasil dengan dua perintah:

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

(Perhatikan spasi tambahan di akhir setiap perintah.)

File-file tersebut telah ditambahkan ke file .gitignore dan kemudian dihapus git rm. Saya perlu mengembalikan file, tetapi kemudian unstage. Saya memiliki ratusan file untuk dipulihkan, dan mengetikkan secara manual untuk setiap file seperti pada contoh lain akan terlalu lambat.

kzar
sumber
7

Sebenarnya, pertanyaan ini langsung tentang Git, tetapi seseorang seperti saya bekerja dengan alat GUI seperti WebStorm VCS selain mengetahui tentang perintah Git CLI.

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

Masukkan deskripsi gambar di sini

Alat VCS memperlihatkan semua revisi kereta dan saya bisa melihat semua komitmen dan perubahan dari masing-masing revisi.

Masukkan deskripsi gambar di sini

Lalu saya memilih komit yang teman saya hapus PostAd.jsfile. sekarang lihat di bawah:

Masukkan deskripsi gambar di sini

Dan sekarang, saya bisa melihat keinginan saya menghapus file. Saya cukup klik dua kali pada nama file dan pulih.

Masukkan deskripsi gambar di sini

Saya tahu jawaban saya bukan perintah Git, tetapi cepat, dapat diandalkan, dan mudah bagi pengembang pemula dan profesional. Alat WebStorm VCS luar biasa dan sempurna untuk bekerja dengan Git dan tidak memerlukan plugin atau alat lain.

Amerika
sumber
1
Ini luar biasa! Terima kasih. Solusi yang lebih mudah bagi mereka yang menggunakan IDE JetBrains.
Fabiano Arruda
Bagaimana cara mengembalikan file jika itu gambar?
Nodirabegimxonoyim
Yang terhormat @FabianoArruda, JetBrains IDE adalah alat yang kuat untuk pengembangan. terima kasih atas komentar Anda yang indah.
AmerllicA
Terima kasih kepada Anda @PeterMortensen tersayang untuk edisi ini.
AmerllicA
6

Saya punya pertanyaan yang sama. Tanpa menyadarinya, saya telah membuat komit menggantung .

Buat daftar komitmen menjuntai

git fsck --lost-found

Periksa setiap komit yang menggantung

git reset --hard <commit id>

File saya muncul kembali ketika saya pindah ke komit menggantung.

git status untuk alasan:

“HEAD detached from <commit id where it detached>”

RustyMagnet
sumber
2
Terima kasih banyak. Anda membantu saya memulihkan ribuan baris kode.
Ruben
5
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

Pulihkan 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
pengguna1797498
sumber
2
Pertanyaannya adalah tentang mengembalikan file setelah dihapus dan perubahan telah dilakukan. Jawaban ini adalah tentang memulihkan file yang hanya dihapus di direktori kerja.
akaihola
Itu benar, dan itulah yang saya cari.
Hola Soy Edu Feliz Navidad
4

Jika Anda tahu komit yang menghapus file, jalankan perintah ini di mana <SHA1_deletion>komit yang menghapus file:

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

Bagian sebelum pipa mencantumkan semua file yang dihapus di komit; mereka semua keluar dari komit sebelumnya untuk mengembalikannya.

Tony Wickham
sumber
4

Temukan komit yang menghapus file Anda:

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

Output sampel:

4711174

Pada Git 2.23 sebenarnya ada restoreperintah. Ini masih eksperimental tetapi untuk mengembalikan sesuatu yang Anda hapus dalam komit (4711174 dalam kasus ini) Anda kemudian dapat mengetik:

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

Catat ^ setelah id komit karena kami ingin mengembalikan sesuatu dari komit sebelumnya yang menghapus file.

The --sourceArgumen menceritakanrestore perintah mana untuk mencari file (s) untuk mengembalikan dan dapat setiap komit dan bahkan indeks.

Lihat: git-restore doc untuk git 2.23.0

cb2
sumber
4

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

Berdasarkan jawaban Charles Bailey yang sangat baik, berikut ini kalimat saya:

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)
bonyiii
sumber
2

Sederhana dan tepat-

Pertama-tama, dapatkan komitmen stabil terbaru di mana Anda memiliki file itu dengan -

git log 

Katakan Anda menemukan $ commitid 1234567 ..., lalu

git checkout <$commitid> $fileName

Ini akan mengembalikan versi file yang ada di komit itu.

Sudhanshu Jain
sumber
1

Untuk cara terbaik untuk melakukannya, cobalah.


Pertama, cari id komit dari komit yang menghapus file Anda. Ini akan memberi Anda ringkasan komit yang menghapus file.

git log --diff-filter = D --summary

git checkout 84sdhfddbdddf ~ 1

Catatan: 84sdhfddbdddadalah milik Andacommit id

Melalui ini Anda dapat dengan mudah memulihkan semua file yang dihapus.

Ritesh Adulkar
sumber
1

Anda selalu dapat git revertkomit Anda yang menghapus file. ( Ini mengasumsikan bahwa penghapusan adalah satu-satunya perubahan dalam komit. )

> git log
commit 2994bda49cd97ce49099953fc3f76f7d3c35d1d3
Author: Dave <[email protected]>
Date:   Thu May 9 11:11:06 2019 -0700

    deleted readme.md

Dan jika Anda terus bekerja, dan menyadari kemudian bahwa Anda tidak ingin melakukan komitmen penghapusan itu, Anda dapat mengembalikannya menggunakan:

> git revert 2994bd

Sekarang git logmenunjukkan:

> git log
Author: Dave <[email protected]>
Date:   Thu May 9 11:17:41 2019 -0700

    Revert "deleted readme"

    This reverts commit 2994bda49cd97ce49099953fc3f76f7d3c35d1d3.

Dan readme.mdtelah dikembalikan ke repositori.

Dave Baghdanov
sumber
Karena pertanyaan mengandaikan bahwa sejumlah komit dibuat setelah file dihapus dan karena tidak ada indikasi bahwa komit berikutnya tidak diinginkan, ini sepertinya tidak akan membantu OP dalam situasi yang dijelaskan.
Jonathan Leffler
1
Ya! Anda dapat membuat komitmen berikutnya, dan masih mengembalikan komit penghapusan. Jadi jika komit 111 menghapus file, dan komit 222, 333, 444, menambah / memodifikasi beberapa hal, Anda masih dapat mengembalikan komit 111 untuk membatalkan penghapusan, dan itu akan menjadi komit 555
Dave Baghdanov
0

Saya juga mengalami masalah ini menggunakan kode di bawah ini untuk mengambil file sebelumnya ke direktori lokal:

git checkout <file path with name>

Contoh di bawah ini berfungsi untuk saya:

git checkout resources/views/usaSchools.blade.php

Akbor
sumber
Sebutkan apa masalahnya
Akbor
Penghapusan sudah dilakukan. Anda perlu menentukan komit untuk memulihkan dari dalam kasus ini.
sba
-1
$ git log --diff-filter=D --summary  | grep "delete" | sort
Kujiy
sumber
Penjelasan akan diurutkan.
Peter Mortensen
-1

Jika penghapusan belum dilakukan, perintah di bawah ini akan mengembalikan file yang dihapus di pohon kerja.

$ git checkout -- <file>

Anda bisa mendapatkan daftar semua file yang dihapus di pohon kerja menggunakan perintah di bawah ini.

$ git ls-files --deleted

Jika penghapusan telah dilakukan, cari komit tempat terjadinya, kemudian pulihkan file dari komit ini.

$ git rev-list -n 1 HEAD -- <file>
$ git checkout <commit>^ -- <file>

Jika Anda mencari jalur file untuk dipulihkan, perintah berikut akan menampilkan ringkasan semua file yang dihapus.

$ git log --diff-filter=D --summary
Muhammad Soliman
sumber
-1

Untuk mengembalikan semua file yang dihapus dengan Git, Anda juga dapat melakukan:

git checkout $(git ls-files --deleted)

Di mana git ls-files --deleteddaftar semua file yang dihapus dan git checkout $(git command)mengembalikan daftar file dalam suatu parameter.

Charles Duporge
sumber