Saya ingin mengembalikan perubahan yang dibuat oleh komit tertentu ke file tertentu saja.
Bisakah saya menggunakan perintah git revert untuk itu?
Adakah cara sederhana lainnya untuk melakukannya?
Saya ingin mengembalikan perubahan yang dibuat oleh komit tertentu ke file tertentu saja.
Bisakah saya menggunakan perintah git revert untuk itu?
Adakah cara sederhana lainnya untuk melakukannya?
Jawaban:
Cara terbersih yang pernah saya lakukan untuk melakukan ini dijelaskan di sini
git show some_commit_sha1 -- some_file.c | git apply -R
Mirip dengan respon VonC tetapi menggunakan git showdan git apply.
fatal: unrecognized input
-3bendera ke git apply for three-way merge ketika tambalan gagal, karena saya biasanya mengoreksi perubahan sedikit ke masa lalu.
some_file.cmenyertakan jalur ke file jika ada, jika tidak, Anda akan diam-diam tidak menambal apa pun :)
Dengan asumsi tidak masalah untuk mengubah riwayat komit, berikut adalah alur kerja untuk mengembalikan perubahan dalam satu file dalam komit sebelumnya:
Misalnya, Anda ingin mengembalikan perubahan dalam 1 file ( badfile.txt) di komit aaa222:
aaa333 Good commit
aaa222 Problem commit containing badfile.txt
aaa111 Base commit
Basis pada basis commit, ubah masalah commit, & lanjutkan.
1) Mulai rebase interaktif:
git rebase -i aaa111
2) Tandai masalah komit untuk diedit di editor dengan mengubah pickke e(untuk edit):
e aaa222
pick aaa333
3) Kembalikan perubahan ke file buruk:
git show -- badfile.txt | git apply -R
4) Tambahkan perubahan & ubah komit:
git add badfile.txt
git commit --amend
5) Selesaikan rebase:
git rebase --continue
edittidak muncul sebagai berubah. Tapi git show -- badfile.txt | git apply -Rmemberikan jawaban yang saya butuhkan <3
git revert adalah untuk semua konten file dalam komit.
Untuk satu file, Anda bisa skrip :
#!/bin/bash
function output_help {
echo "usage: git-revert-single-file <sha1> <file>"
}
sha1=$1
file=$2
if [[ $sha1 ]]; then
git diff $sha1..$sha1^ -- $file | patch -p1
else
output_help
fi
(Dari utilitas git-shell-scripts dari smtlaissezfaire )
catatan:
cara lain dijelaskan di sini jika Anda belum melakukan modifikasi Anda saat ini.
git checkout -- filename
git checkout memiliki beberapa opsi untuk sebuah file, memodifikasi file dari HEAD, menimpa perubahan Anda.
Dropped.on.Caprica menyebutkan di komentar :
Anda dapat menambahkan alias ke git sehingga Anda dapat melakukan
git revert-file <hash> <file-loc>dan mengembalikan file tertentu.
Lihat intinya .
[alias]
revert-file = !sh /home/some-user/git-file-revert.sh
git revert-file <hash> <file-loc>dan mengembalikan file spesifik tersebut. Saya angkat dari jawaban ini (meskipun saya harus membuat beberapa pengeditan agar berfungsi dengan benar). Anda dapat menemukan salinan .gitconfigskrip saya dan yang telah diedit di sini: gist.github.com/droppedoncaprica/5b67ec0021371a0ad438
Saya hanya akan menggunakan --no-commitopsi untuk git-revertdan kemudian menghapus file yang tidak ingin Anda kembalikan dari indeks sebelum akhirnya melakukannya. Berikut adalah contoh yang menunjukkan bagaimana dengan mudah mengembalikan hanya perubahan ke foo.c di komit terbaru kedua:
$ git revert --no-commit HEAD~1
$ git reset HEAD
$ git add foo.c
$ git commit -m "Reverting recent change to foo.c"
$ git reset --hard HEAD
Yang pertama git-reset"menghapus" semua file, sehingga kita dapat menambahkan kembali hanya satu file yang ingin kita kembalikan. Yang terakhir git-reset --hardmenghilangkan sisa file yang tidak ingin kita simpan.
Jauh lebih sederhana:
git reset HEAD^ path/to/file/to/revert
kemudian
git commit --amend
lalu
git push -f
file hilang dan komit hash, pesan, dll sama.
git checkout -- path/to/file/to/revertlangkah? Juga, tidak benar bahwa hashnya sama setelahnya, bukan? Kalimat terakhir mungkin lebih baik seperti ini: "Hasilnya adalah komit terakhir diganti dengan yang baru yang hanya berbeda karena tidak berisi perubahan pada file yang dikembalikan."
git reset HEAD^ path/to/file/to/revert/in/commit
Perintah di atas akan mengeluarkan file dari komit, tetapi akan tercermin dalam git status.
git checkout path/to/file/to/revert/in/commit
Perintah di atas akan mengembalikan perubahan (sebagai hasilnya Anda mendapatkan file yang sama dengan HEAD).
git commit
(Lulus --amenduntuk mengubah komit.)
git push
Dengan ini, file yang sudah di komit dihapus dan dikembalikan.
Langkah-langkah di atas harus diikuti dari cabang tempat komit dibuat.
Anda dapat mengikuti prosedur ini:
git revert -n <*commit*>( -nkembalikan semua perubahan tetapi tidak akan melakukannya)git add <*filename*> (nama file yang ingin Anda kembalikan & komit)git commit -m 'reverted message' (tambahkan pesan untuk kembali)Jika Anda ingin menyetel ulang perubahan pada file dari pengubahan terakhir Anda, inilah yang biasanya saya gunakan. Saya rasa ini adalah solusi paling sederhana.
Harap perhatikan bahwa file akan ditambahkan ke area pementasan.
git checkout <prev_commit_hash> -- <path_to_your_file>
Semoga membantu :)