Apakah mungkin untuk mengembalikan hanya satu file atau perubahan tertentu dalam file di multi file commit?
Kisah lengkap saya melakukan banyak file. Sejumlah komit kemudian seseorang yang akan tetap tanpa nama (JACK !!!) menyalin file ke dalam repositori dan melakukan beberapa file, menimpa beberapa perubahan yang saya lakukan. Saya ingin mengembalikan satu file yang menjadi musnah atau lebih baik lagi, masuk dan kembalikan dua perubahan dalam file itu. Ini harus berupa komit pengembalian yang terpisah karena ditarik dan didorong.
--3way
hasil dalam konflik gabungan bukan kegagalan untuk menerapkan tambalan.Jawaban:
Anda dapat mengembalikan komit tanpa membuat yang baru dengan menambahkan opsi '--tidak ada komit'. Ini meninggalkan semua file yang dikembalikan di area pementasan. Dari sana, saya akan melakukan soft reset dan menambahkan perubahan yang saya inginkan. Sebagai contoh alur kerja:
sumber
git add -p
untuk memulai sesi interaktif yang memungkinkan Anda untuk menambahkan potongan file secara selektif, bukan seluruh file. (Ada jugagit reset -p
beberapa perubahan unstage yang selektif. Baik untuk diketahui, tetapi mungkin bukan yang Anda inginkan dalam skenario ini.)revert
,reset
,stash -p
(simpanan "membatalkan bahwa saya tidak ingin sebenarnya make"),add
sisanya,commit
Anda dapat secara interaktif menerapkan versi file yang lama menggunakan
checkout
perintah.Misalnya, jika Anda tahu di
COMMIT
mana kode untuk menambahkan kembali dihapus, Anda dapat menjalankan perintah berikut:Git akan meminta Anda untuk menambahkan kembali bakhil yang hilang dari versi file saat ini. Anda bisa menggunakan
e
untuk membuat tambalan perubahan sebelum menerapkannya kembali.sumber
git checkout -p path/to/file
Anda bisa secara manual memeriksa konten lama dan bagus dari file yang ingin Anda kembalikan menggunakan
git checkout
. Misalnya, jika Anda ingin kembalimy-important-file
ke versi yang ada di versiabc123
, Anda dapat melakukannyaSekarang Anda memiliki konten
my-important-file
kembali yang lama, dan bahkan dapat mengeditnya jika Anda mau, dan komit seperti biasa untuk membuat komit yang akan mengembalikan perubahan yang dibuatnya. Jika hanya ada beberapa bagian dari komit yang ingin Anda kembalikan, gunakangit add -p
untuk memilih hanya beberapa bakhil dari tambalan yang Anda lakukan.sumber
revert
, Anda hanya mengambil kembali file versi lama. Sebuah tepatrevert
akan menghapus buruk komit modifikasi dalam file, bahkan jika itu telah beberapa kali diubah sejak buruk komit, dan Anda tidak ingin kehilangan mereka modifikasi.git checkout -p
.Saya menemukan cara untuk melakukan ini di milis Git:
Sumber: http://git.661346.n2.nabble.com/Revert-a-single-commit-in-a-single-file-td6064050.html#a6064406
Variasi
Perintah itu gagal (tidak menyebabkan perubahan) jika tambalan tidak berlaku bersih, tetapi dengan
--3way
Anda malah mendapatkan konflik yang kemudian dapat Anda atasi secara manual (dalam hal ini jawaban Casey mungkin lebih praktis):Anda juga dapat menggunakan ini untuk mengembalikan sebagian komit, misalnya:
untuk mengembalikan file dengan perubahan yang cocok
<string>
di komit apa pun. Ini adalah persis apa yang saya butuhkan dalam kasus penggunaan saya (beberapa komit terpisah memperkenalkan perubahan serupa ke file yang berbeda, bersama dengan perubahan file lain dengan cara yang tidak berhubungan yang saya tidak ingin kembalikan).Jika Anda telah
diff.noprefix=true
mengatur di Anda~/.gitconfig
maka Anda perlu menambahkan-p0
kegit apply
perintah, misalnyasumber
git show ... > foo.txt
(2) editfoo.txt
untuk menghapus diff yang saya inginkan untuk tidak mengembalikan (3)git apply --reverse foo.txt
untuk mengembalikan diff yang masih tercantum dalamfoo.txt
.