Saya perlu menerapkan perubahan yang diperkenalkan di satu cabang ke cabang lain. Saya bisa menggunakan cherry pick untuk melakukan itu. Namun, dalam kasus saya, saya ingin menerapkan perubahan yang hanya relevan untuk satu file, saya tidak perlu memilih keseluruhan komit. Bagaimana cara melakukannya?
108
Jawaban:
Anda memiliki opsi berbeda berdasarkan apa yang ingin Anda capai:
Jika Anda ingin konten file sama dengan cabang target, Anda dapat menggunakan
git checkout <branch> -- <filename>
. Namun ini tidak akan “memilih-ceri” perubahan yang terjadi dalam satu komit, tetapi hanya mengambil status hasil dari file tersebut. Jadi jika Anda menambahkan baris dalam komit, tetapi komit sebelumnya berubah lebih banyak, dan Anda hanya ingin menambahkan baris itu tanpa perubahan lain, maka pembayaran bukanlah yang Anda inginkan.Sebaliknya jika Anda ingin menerapkan tambalan yang diperkenalkan dalam komit hanya untuk satu file, Anda memiliki beberapa opsi. Anda dapat menjalankan
git cherry-pick -n
, yaitu tanpa melakukan itu, mengedit komit (misalnya mengatur ulang semua file menggunakangit reset -- .
dan hanya menambahkan file yang sebenarnya ingin Anda ubah menggunakangit add <filename>
). Atau Anda dapat membuat diff untuk file dan menerapkan diff kemudian:sumber
Buat
patch file
dan terapkan.EDIT:
Karena Anda perlu mengambil perubahan dari sebuah komit, buat tambalan seperti ini:
sumber
git diff sha1
(ataugit diff branch
- itu sama jika cabang menunjuk ke hash yang sama) hanya akan menghasilkan diff dari direktori kerja saat ini dalam kaitannya dengan hash itu, tapi tidak perubahan apa yang diperkenalkan sendiri oleh komit.git checkout
dengan nama file adalah palu yang tepat untuk paku ini. Kedua opsi ini sangat rumit.checkout
tidak akan berfungsi, karena ini mungkin melibatkan perubahan sebelumnya yang tidak diinginkan, dan mungkin tidak berisi perubahan yang dibuat di cabang saat ini.Hal lain yang berguna untuk dilakukan adalah mendapatkan tambalan secara lokal dan kemudian menggunakan:
Itu bukan pemetikan ceri.
sumber
Git sudah menyiapkan semuanya :)
Gunakan saja
git checkout <sha> <path-to-file>
sumber
ini berfungsi jika Anda ingin satu file dari cabang lain disalin ke cabang yang sedang bekerja
sumber
Ini yang kamu cari:
sha1 adalah opsional
sumber
Yang cenderung saya lakukan adalah menggunakan
git ls-tree
kerjakan saja:
Ini akan mencetak semua nama file yang cocok dengan grep Anda dan memberikan kunci SHA1 dari file di komit.
Git show juga dapat digunakan pada file di luar cabang Anda. menggunakan
>
dari shell Anda untuk menyalurkan output menjadi file memberi Anda hasil yang Anda cari.sumber
Anda dapat mencoba melakukan ini:
Sebagai contoh:
sumber
memindahkan file ke tahap pra-komit
menghapus dari memori
Sekarang cabang Anda cukup bersih (kembali ke komit sebelumnya)
sumber