Pulihkan file dari komit lama di git

Jawaban:

222
git checkout 'master@{7 days ago}' -- path/to/file.txt

Ini tidak akan mengubah HEAD, itu hanya akan menimpa file lokal path/to/file.txt

Lihat man git-rev-parse untuk kemungkinan spesifikasi revisi di sana (tentu saja hash sederhana (seperti dd9bacb) akan bekerja dengan baik)

Jangan lupa untuk melakukan perubahan (setelah ulasan ...)

lihat
sumber
15
Wow, @heneryville dan sehe, saya benar-benar berpikir '7 hari yang lalu' adalah meta karena Anda akan mengetahui apa yang dilakukan. ty!
AnneTheAgile
7
Bagian 2 Ketika ingin memilih komit tertentu, format di atas tidak berfungsi. Alih-alih menggunakan apa yang ditunjukkan Urs di bawah ini, git checkout commitShaNumber - path / ke / file.txt per stackoverflow.com/questions/215718/…
AnneTheAgile
2
@AnneTheAgile pada kenyataannya itu masih persis sintaks yang sama, saya kebetulan memberikan contoh "kompleks" revision-specificationkarena itulah yang diminta OP :)
sehe
1
Jika komit Anda digunakan untuk menghapus file yang Anda coba pulihkan, cukup gunakan shacommit~1(mis .:) git checkout 0f4bbdcd~1 -- path/to/file.txtuntuk mendapatkan komit sebelumnya.
sdlins
90
  1. Lihat file dari komit lama Anda via git checkout [Revision_Key] -- path/to/file.
  2. Tambahkan, komit, dorong yang sesuai.
Urs Reupke
sumber
3
git checkoutdapat menangani file tunggal (lihat jawaban oleh sehe), tidak perlu menyalin dan menempel.
Koraktor
1
Apakah kunci revisi selalu menjadi SHA1 untuk komit?
IslandCow
1
Ya, tetapi biasanya 6 hingga 8 karakter pertama dari SHA1 cukup untuk mengidentifikasi revisi.
Urs Reupke
2
@IslandCow tidak ada, mereka dapat sha1 tetapi juga cabang, tag, atau hal lain yang menunjuk ke komit, misalnya HEAD, ORIG_HEADatau salah satu dari mereka dikombinasikan dengan ^/ ~/ @notasi-gaya.
Alois Mahdal
2
Anda mengindikasikan bahwa seseorang seharusnya "menambahkan" file sesudahnya. Tapi itu tidak benar. File tidak ditempatkan di area pementasan. Sudah ditambahkan.
xApple
9

Saya perlu mengembalikan file terbaru yang dikomit ke git. Jadi hanya untuk mengulangi dan memberikan perspektif lain, Anda perlu melakukan ini dengan menjalankan dua langkah berikut:

  1. git log -3
    Ini menunjukkan tiga commit terakhir. Baca komentar dan nama penulis sehingga Anda mempersempit versi persis apa yang Anda inginkan. Tuliskan id komit yang panjang (yaitu b6b94f2c19c456336d60b9409fb1e373036d3d71) untuk versi komit yang Anda inginkan.

  2. git checkout b6b94f2c19c456336d60b9409fb1e373036d3d71 - myfile.java
    Lulus id komit DAN nama file yang ingin Anda pulihkan. Pastikan Anda memiliki ruang sebelum dan sesudah tanda hubung ganda.

Ada banyak cara lain untuk melakukannya. Tapi yang ini lebih sederhana yang bisa kuingat. Semoga itu bisa membantu.

CATATAN: Jika Anda berada di dalam jalur / folder proyek Anda, maka tidak perlu mengetikkan path file lengkap dalam perintah checkout.

Salvador Valencia
sumber
Komentar terbaik yang pernah ada. Karena yang, yang merupakan jawaban yang diterima, mengasumsikan bahwa file yang harus diambil didorong ke hulu, namun perintah ini mengambil / mengembalikan file yang hanya ada secara lokal.
OT0
1
Baru saja mencobanya di folder root git repo lokal saya. Saya masih perlu menyediakan jalur relatif ke file. Hanya menyediakan - [nama file] sendiri tidak akan berhasil.
user2784627
@ ot0 Tidak, tidak menganggap itu. Mereka adalah jawaban yang persis sama.
matt
4

Semua jawaban menyebutkan git checkout <tree-ish> -- <pathspec>. Pada git v2.23.0 ada metode git restore baru yang seharusnya mengambil bagian dari apa git checkoutyang bertanggung jawab. Lihat sorotan perubahan di blog github .

Perilaku default dari perintah ini adalah mengembalikan status pohon yang berfungsi dengan konten yang berasal dari sourceparameter (yang dalam kasus Anda akan menjadi hash komit).

Dengan asumsi hash komit adalah abcdefperintah akan terlihat seperti ini:

git restore --source=abcdef file_name

yang (secara default) meletakkannya di pohon kerja. Jika Anda ingin memasukkan perubahan secara langsung ke dalam indeks sehingga dapat dilakukan langsung:

git restore --source=abcdef --worktree --staged file_name

atau dengan nama opsi pendek:

git restore -s=abcdef -W -S file_name
mjarosie
sumber