Membuat tambalan di GIT adalah cara yang bagus untuk membagikan perubahan yang belum siap Anda dorong ke publik cabang proyek.
Untuk lebih memahami bagaimana kita akan membuat patch, pertama-tama mari kita bahas sedikit tentang bagaimana GIT menyimpan perubahan.
Jika Anda baru mengenal GIT, instal git dan dapatkan permulaan dari artikel pengantar GIT ini.
Pertama kali file di-commit ke sebuah proyek di GIT, salinannya disimpan. Untuk semua komit setelah itu, GIT pada dasarnya menyimpan instruksi yang memberitahukannya cara mengubah versi proyek sebelumnya ke versi komit baru.
Dalam GIT, instruksi ini disebut “diffs” . Setiap kali Anda checkout cabang, GIT pada dasarnya akan mulai dari keadaan awal proyek, dan menerapkan semua perbedaan ini secara berurutan, untuk mencapai keadaan yang diinginkan.
Mengetahui bagaimana GIT menyimpan commit, mudah untuk melihat bahwa file patch hanya akan menjadi gabungan dari diff untuk setiap commit yang akan direntang oleh patch.
Sebagai contoh, mari kita asumsikan situasi berikut:Kami memiliki proyek sederhana dengan 2 cabang:master dan eksperimental.
$ git log --oneline --all * b36f227 (experimental) third commit -- added file3 * f39ebe8 second commit -- added file2 * 04a26e5 (HEAD, master) first commit -- committed file1
Master saat ini berada di komit pertama, sementara eksperimental adalah 2 komit di depannya. Di setiap komit, saya menambahkan file bernama file1, file2, dan file3 masing-masing. Berikut adalah status masing-masing cabang saat ini:
Di master, kami hanya memiliki file1:
$ git status On branch master nothing to commit, working directory clean $ ls file1
Saat eksperimental, kami memiliki 3 file:
$ git status On branch experimental nothing to commit, working directory clean $ ls file1 file2 file3
Dalam tutorial ini, kami akan menjelaskan cara membuat tambalan perubahan pada cabang eksperimental dan menerapkannya ke master.
Membuat Patch GIT
Kami akan menggunakan perintah git diff untuk membuat output diff, lalu mengarahkannya ke file. Bentuk perintah diff yang akan kita gunakan adalah sebagai berikut:
git diff from-commit to-commit > output-file
dimana:
- from-commit – titik di mana kita ingin patch dimulai. (Dalam kasus kami, titik di mana eksperimen menyimpang dari master)
- untuk-komit – tambalan akan mencakup perubahan hingga dan termasuk titik ini. (Dalam kasus kami, komit eksperimental terbaru)
- output-file – patch akan ditulis di sini
Catatan:jika from-commit atau to-commit dihilangkan, mereka akan dianggap sebagai HEAD
Kami menentukan dua komit dengan hash unik mereka. Umumnya, Anda hanya perlu menentukan hash komit yang cukup untuk memastikan keunikannya (4 karakter mungkin akan melakukannya).
$ git diff 04a2 b36f > patch.diff $ ls patch.diff file1 file2 file3
Seperti yang Anda lihat dari output di atas, file patch telah dibuat.
Dalam kasus khusus ini, di mana kita ingin membuat tambalan dari seluruh cabang, kita dapat membiarkan GIT melakukan beberapa pekerjaan untuk kita. Kita dapat membiarkan GIT menentukan titik di mana cabang eksperimental kita menyimpang dari cabang master menggunakan perintah git merge-base:
git diff $(git merge-base <public branch> <experimental branch>) > <output file>
git merge-base akan menentukan komit umum terbaru antara 2 cabang. Perhatikan juga bagaimana kali ini kita telah menghilangkannya. Ini akan ditetapkan secara default ke HEAD, dan karena cabang eksperimental diperiksa, HEAD akan menjadi komit terbaru dari cabang eksperimental.
$ git diff $(git merge-base master experimental) > anotherPatch.diff $ ls anotherPatch.diff patch.diff file1 file2 file3
Sekali lagi, file patch telah dibuat. File tambalan ini identik.
Menerapkan Patch GIT
Setelah file tambalan dibuat, penerapannya mudah. Pastikan cabang yang Anda periksa adalah cabang yang ingin Anda terapkan tambalannya (master dalam kasus kami). Kemudian Anda dapat menerapkan tambalan menggunakan perintah git apply:git apply
$ git status On branch master ... (rest of output omitted) ... $ ls anotherPatch.diff patch.diff file1 $ git apply patch.diff $ ls anotherPatch.diff patch.diff file1 file2 file3
Perubahan dari cabang eksperimental kini telah direplikasi di master.
Peringatan:Meskipun menerapkan tambalan dengan cara ini akan benar-benar mereplikasi konten, tidak ada riwayat komit yang akan direplikasi. Ini berarti bahwa bahkan jika tambalan yang Anda buat mencakup beberapa komit, itu akan muncul sebagai satu set perubahan saat diterapkan. Anda akan kehilangan pengetahuan tentang bagaimana komit dipecah dan juga pesan untuk setiap komit. Mari kita bandingkan riwayat komit untuk kedua cabang:
Pada percobaan, kami memiliki 3 komit, masing-masing dengan pesan komit yang bermakna.
$ git branch * experimental master $ git log --oneline b36f227 third commit -- added file3 f39ebe8 second commit -- added file2 04a26e5 first commit -- committed file1
Namun, tambalan kami hanya menerapkan perubahan aktual ke cabang master.
$ git branch experimental * master $ git log --oneline 04a26e5 first commit -- committed file1
Menerapkan tambalan tidak melakukan perubahan, juga tidak membawa riwayat komit yang terkait dengan perubahan ini. Berhati-hatilah saat menggunakan tambalan di GIT.