Git adalah sistem kontrol versi yang kuat yang memungkinkan beberapa versi percabangan proyek Anda dengan penggabungan otomatis. Itu bagus, tapi terkadang rusak saat file diganti namanya atau salah tempat. Untungnya, Anda dapat secara manual menerapkan tambalan ke file yang berbeda.
Masalah
Saat menggunakan cabang Git, sering kali perlu menerapkan perubahan dari satu cabang ke cabang lainnya. Kasus penggunaan umum untuk ini adalah cabang berversi—jika Anda memiliki rilis LTS lama, Anda mungkin ingin menerapkan patch sesekali ke versi lama. Atau mungkin Anda menyediakan dua perangkat lunak yang menargetkan rantai alat atau lingkungan yang berbeda, dan Anda harus tetap menyinkronkannya.
Jika cabang Anda memiliki tata letak yang sama, Anda dapat menggunakan git cherry-pick, yang dapat menyalin komit individu dari satu cabang ke cabang lainnya. Misalnya, menarik komit dari cabang fitur ke dalam master sebelum semuanya digabungkan:
TERKAIT: Apa Fungsi Git Cherry Pick, dan Kapan Anda Harus Menggunakannya?
Namun, perangkat lunak tidak selalu bersih, dan dalam proses pemfaktoran ulang, Anda mungkin mengalami kasus di mana file dipindahkan atau diganti namanya. Git bekerja dengan jalur direktori, jadi benar-benar rusak git cherry-pickkarena Git tidak dapat menerapkan perubahan pada file yang tidak ada.
Git memiliki alat untuk memperbaikinya, jadi ketika penggabungan normal rusak, Anda dapat menambal file secara manual dengan pembaruan menggunakan git patch.
Menggunakan Git Diffs dan Patch
Untuk mendemonstrasikan ini, kami akan membuat repositori kosong dengan satu file: Old.java. cabang baru, old-version, dibuat menggunakan file ini, dengan beberapa modifikasi. File ini diganti namanya dengan beberapa perubahan nanti master cabang ke New.javamelanggar kompatibilitas antar cabang.
Dan seperti inilah riwayat cabang, ditampilkan di Fork program Git GUI:
Dalam contoh ini, kita perlu memindahkan komit “Tambahkan lebih banyak kode” ke old-version cabang Untuk melakukannya, Anda harus mendapatkan ID komit dari log referensi:
git reflog
Lalu lari format-patch termasuk ID dan -1 flag, yang akan membuat file tambalan:
git format-patch 82176b5 -1
Ini akan menghasilkan file tambalan di direktori saat ini. Anda mungkin ingin memindahkannya ke folder lain di .gitignore config, sehingga tidak terpengaruh oleh perubahan cabang.
Kemudian, checkout old-version cabang, dan terapkan perubahan tambalan menggunakan Linux patch peralatan. Git memiliki alatnya sendiri, git apply dan git amyang dapat menanganinya, tetapi karena tidak mengedit file tambalan secara manual, mereka tidak memiliki opsi untuk mengubah file target jika terjadi penggantian nama/pemindahan.
Anda dapat meneruskan nama file menggunakan -p1 parameter, dan berikan file tambalan menggunakan -i.
patch -l -p1 old -i Patches/0001-Add-more-code.patch
Ini harus mengedit file dan menambahkan perubahan, yang perlu Anda lakukan. Kelemahan dari patch dibandingkan dengan git am adalah bahwa itu tidak menyimpan informasi komit, meskipun Anda dapat menemukannya di .patch file jika Anda ingin menyimpan pesan asli.
Namun, konflik penggabungan masih dapat terjadi jika cabang target diedit sementara, dan jika terjadi, Anda akan terjebak dengan pengeditan manual, karena git merge itu tidak akan menyelesaikannya untuk Anda. patch akan menampilkan file yang berisi perbedaan, yang perlu Anda perbaiki secara manual.
Atau, Anda dapat memindahkan file target ke direktori target yang diharapkan Git, memungkinkan Git untuk cherry-pick dan menerapkan perubahan. Kemudian, salin file kembali ke lokasi aslinya, dan hapus file sementara.
Tambalan mungkin juga memiliki masalah pengakhiran umpan baris (LF) vs umpan saluran pengembalian kereta (CRLF) yang mungkin disebabkan oleh pengeditan Windows. Anda mungkin perlu mengubah ke LF di editor teks Anda agar tambalan dapat diterapkan dengan benar.

