Merge adalah proses menggabungkan dua jalur riwayat menjadi satu, dan bentuknya yang paling sederhana terjadi ketika jalur tujuan tidak bergerak sejak branch dibuat. Topik ini membahas merge fast-forward, yaitu penggabungan pada riwayat linear yang tidak membuat commit baru dan hanya memajukan penunjuk branch. Kasus ini paling mudah dibaca karena hasilnya tetap riwayat lurus tanpa percabangan.
Keadaan yang memungkinkan fast-forward#
Merge fast-forward terjadi ketika branch tujuan, biasanya main, belum memiliki commit baru sejak branch pekerjaan dibuat. Riwayatnya berbentuk lurus: commit terakhir main adalah leluhur langsung dari commit terakhir branch pekerjaan, sehingga menggabungkan keduanya sama saja dengan memindahkan penunjuk main ke ujung rantai yang sudah ada. Tidak ada dua jalur yang perlu dijinakkan, sehingga tidak ada commit penggabungan yang perlu dibuat.
Situasi ini lazim pada pekerjaan pendek: branch dibuat dari main, satu atau dua commit diselesaikan, dan main tidak disentuh siapa pun selama itu. Keadaan tersebut dapat diperiksa lebih dahulu melalui git log --oneline main..fitur, yang menampilkan commit milik branch pekerjaan yang belum dimiliki main.
Membuat dan menggabungkan jalur linear#
Siapkan repository dengan satu commit dasar, buat branch pekerjaan, lalu kembalikan ke main untuk melakukan merge.
# tanggal commit ditetapkan agar keluaran contoh dapat direproduksi secara persis
export GIT_AUTHOR_DATE="2026-11-01T09:00:00+07:00"
export GIT_COMMITTER_DATE="2026-11-01T09:00:00+07:00"rm -rf /tmp/lab-ff
mkdir /tmp/lab-ff
cd /tmp/lab-ff
git init -b main
git config user.name "Budi"
git config user.email "[email protected]"
printf "Bab satu.\nBab dua.\n" > buku.txt
git add buku.txt
git commit -m "Bab satu dan dua"
git switch -c fitur-bab3
printf "Bab satu.\nBab dua.\nBab tiga.\n" > buku.txt
git commit -am "Tambah bab tiga"
git switch main
git log --oneline main..fitur-bab3
git log --oneline fitur-bab3..main
git merge fitur-bab3Initialized empty Git repository in /tmp/lab-ff/.git/
[main (root-commit) 040aa48] Bab satu dan dua
1 file changed, 2 insertions(+)
create mode 100644 buku.txt
Switched to a new branch 'fitur-bab3'
[fitur-bab3 38caa94] Tambah bab tiga
1 file changed, 1 insertion(+)
Switched to branch 'main'
38caa94 Tambah bab tiga
Updating 040aa48..38caa94
Fast-forward
buku.txt | 1 +
1 file changed, 1 insertion(+)Bagian Updating 3d5f7a9..8b2d4e6 menyatakan pergerakan penunjuk dari commit lama menuju commit baru, dan kata Fast-forward menyatakan bahwa penggabungan dilakukan dengan memajukan penunjuk saja. Diffstat di bawahnya merangkum perubahan yang ikut masuk ke main. Riwayat setelahnya tetap lurus, tanpa commit tambahan.
git log --oneline --graph* 38caa94 Tambah bab tiga
* 040aa48 Bab satu dan duaKapan fast-forward tidak diinginkan#
Kecepatan fast-forward punya konsekuensi yang perlu disadari: keberadaan branch tersebut tidak tercatat di riwayat, karena tidak ada commit yang mencatat pernahnya percabangan. Beberapa tim ingin setiap fitur tercatat sebagai satu unit riwayat, dan Git menyediakan opsi --no-ff untuk itu, yaitu memaksa pembuatan commit merge meskipun fast-forward dimungkinkan. Dengan opsi tersebut, riwayat memuat commit merge yang dapat dikembalikan sebagai satu kesatuan atau ditelusuri sebagai satu topik pekerjaan.
Pilihan antara keduanya adalah kebijakan tim, bukan soal teknis. Riwayat linear yang dihasilkan fast-forward paling mudah dibaca, sedangkan riwayat ber-commit-merge paling jelas memisahkan topiknya. Yang penting adalah memilih satu kebijakan dan menuliskannya di tempat yang dipakai bersama, karena konsistensinya lebih berharga daripada pilihannya.
Membaca tanda fast-forward sebelum merge#
Bentuk merge yang akan terjadi dapat diduga sebelum menjalankannya, dengan membandingkan isi kedua jalur. Dua perintah git log --oneline pada lab di atas menampilkan selisih dua arah menggunakan notasi kiri..kanan, yang berarti commit yang dimiliki sisi kanan tetapi belum dimiliki sisi kiri. Perintah pertama berisi satu commit milik fitur-bab3 yang belum dimiliki main, sedangkan perintah kedua menghasilkan keluaran kosong karena main tidak memiliki commit apa pun di luar jalur branch tersebut.
Kombinasi kedua keluaran inilah tanda tangan fast-forward, yaitu satu arah berisi dan satu arah kosong. Apabila kedua arah sama-sama berisi, berarti kedua jalur sudah bergerak terpisah dan merge tiga arah dengan commit merge yang akan terjadi. Pemeriksaan dua baris ini murah dilakukan dan menghilangkan kejutan pada saat merge, terutama pada repository tim yang main-nya bergerak cepat.
Fast-forward dalam alur kerja tim#
Pada pekerjaan tim, fast-forward jarang terjadi tanpa disengaja, karena main terus menerima penggabungan dari orang lain selama sebuah fitur dikerjakan. Bentuk ini muncul paling sering pada dua keadaan: pekerjaan sangat pendek yang diselesaikan dalam satu sesi, dan branch yang baru saja disegarkan dengan me-rebase main ke atasnya sehingga jalurnya kembali linear. Mekanika penyegaran kedua dibahas pada modul penulisan ulang riwayat, dan hasilnya selalu membuka peluang fast-forward kembali.
Konsekuensi praktisnya pada alur kerja tim adalah branch pekerjaan boleh dihapus segera setelah merge fast-forward selesai, karena tidak ada commit merge yang perlu dirujuk kembali. Penunjuk branch-nya bergerak, riwayatnya lurus, dan pembaca riwayat tidak perlu menafsirkan apa pun. Kondisi yang perlu dijaga hanyalah kebiasaan memanggil git branch -d setelah merge, sehingga pengaman penolakan Git tetap berperan apabila ternyata masih ada commit yang terlewat.
Ringkasan#
- Merge fast-forward terjadi ketika branch tujuan adalah leluhur langsung dari ujung branch pekerjaan.
- Penggabungan dilakukan dengan memajukan penunjuk branch tujuan, tanpa membuat commit baru.
- Opsi
--no-ffmemaksa commit merge agar keberadaan branch tercatat pada riwayat. - Pilihan bentuk riwayat adalah kebijakan tim yang perlu konsisten.
Referensi#
- Git Branching - Basic Branching and Merging — Pro Git — bagian yang menjelaskan fast-forward pada Pro Git.
- git-merge — Git Documentation
— rujukan opsi merge, termasuk
--no-ff.