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 show
dan git apply
.
fatal: unrecognized input
-3
bendera ke git apply for three-way merge ketika tambalan gagal, karena saya biasanya mengoreksi perubahan sedikit ke masa lalu.
some_file.c
menyertakan 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 pick
ke 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
edit
tidak muncul sebagai berubah. Tapi git show -- badfile.txt | git apply -R
memberikan 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 .gitconfig
skrip saya dan yang telah diedit di sini: gist.github.com/droppedoncaprica/5b67ec0021371a0ad438
Saya hanya akan menggunakan --no-commit
opsi untuk git-revert
dan 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 --hard
menghilangkan 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/revert
langkah? 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 --amend
untuk 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*>
( -n
kembalikan 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 :)