Merge dan rebase sama-sama dapat membawa perubahan dari satu branch ke branch lain. Perbedaannya terlihat pada riwayat yang dihasilkan dan pada siapa yang harus menyesuaikan diri ketika riwayat itu berubah.

Pertanyaan yang berguna bukan “mana yang selalu lebih baik,” tetapi “riwayat seperti apa yang perlu disimpan setelah pekerjaan ini selesai?”

Merge mencatat pertemuan dua jalur

Misalkan fitur dibuat dari main, lalu keduanya mendapat commit baru:

A---B---C main
     \
      D---E fitur

Menjalankan git merge fitur dari main dapat membuat merge commit:

A---B---C---M main
     \     /
      D---E fitur

Commit M memiliki lebih dari satu parent. Riwayat menyimpan fakta bahwa dua jalur pekerjaan pernah berkembang terpisah lalu digabungkan.

Pilih merge ketika bentuk percabangan itu berguna: sebuah fitur dikembangkan bersama beberapa commit, integrasi perlu terlihat sebagai satu peristiwa, atau branch sudah dipakai banyak orang dan riwayatnya tidak boleh ditulis ulang.

Rebase membuat basis baru

Rebase mengambil commit pada branch saat ini dan menerapkannya kembali di atas basis yang dipilih. Dari contoh sebelumnya, git rebase main pada fitur menghasilkan bentuk seperti ini:

A---B---C main
         \
          D'---E' fitur

D' dan E' adalah commit baru. Parent, waktu committer, dan identitas commit-nya berbeda dari D dan E, walaupun perubahan yang dibawa dapat sama.

Riwayat linear lebih mudah dibaca ketika commit itu masih pekerjaan lokal. Biayanya muncul jika commit lama sudah menjadi dasar pekerjaan orang lain. Dokumentasi Git menyebut rebasing branch yang sudah dipakai downstream sebagai ide buruk karena pengguna di bawahnya harus memperbaiki riwayat secara manual.

Penjelasan objek dan proses replay dibahas lebih rinci dalam Cara Kerja Git Rebase.

Gunakan status branch sebagai batas

Aturan praktis yang cukup aman:

  • branch lokal yang belum dibagikan dapat dirapikan dengan rebase;
  • branch bersama sebaiknya dipertahankan dan digabungkan dengan merge;
  • branch yang sudah dibagikan hanya ditulis ulang setelah semua pemakainya menyepakati perubahan tersebut.

git push --force-with-lease memberi pemeriksaan tambahan dibanding --force: pembaruan ditolak jika nilai remote tidak sesuai dengan nilai yang diharapkan. Pemeriksaan ini mengurangi risiko menimpa commit yang belum terlihat, tetapi tidak membuat penulisan ulang branch bersama menjadi tanpa risiko.

Pilih berdasarkan informasi yang ingin disimpan

Gunakan merge jika riwayat perlu menunjukkan:

  • kapan dua jalur pekerjaan digabungkan;
  • batas sebuah fitur atau integrasi;
  • bentuk branch yang memang membantu penyelidikan berikutnya.

Gunakan rebase jika riwayat perlu menunjukkan:

  • urutan commit yang bersih sebelum branch dibagikan;
  • perubahan kecil sebagai rangkaian yang mudah direview;
  • commit lokal di atas basis terbaru tanpa merge commit tambahan.

Tidak semua merge commit bernilai, dan tidak semua riwayat linear lebih jelas. Merge berulang dari main ke branch pendek dapat menambah kebisingan. Sebaliknya, menyusun ulang branch panjang dapat menghapus konteks yang justru dibutuhkan.

Konflik tidak hilang karena strategi

Merge biasanya meminta konflik diselesaikan sekali pada titik penggabungan. Rebase menerapkan commit satu per satu, sehingga konflik yang serupa dapat muncul lebih dari sekali. Keuntungan rebase adalah setiap konflik terlihat dalam konteks commit yang sedang diterapkan; kerugiannya adalah pekerjaan penyelesaian dapat berulang.

Jika proses rebase tidak menuju hasil yang benar, gunakan:

git rebase --abort

Perintah itu mengembalikan branch ke keadaan sebelum rebase dimulai. Setelah rebase selesai, reflog juga dapat membantu menemukan tip branch sebelumnya selama entrinya belum kedaluwarsa dan objeknya belum dibersihkan.

Ringkasnya

Merge mempertahankan pertemuan dua jalur. Rebase membuat commit baru di atas basis baru. Gunakan rebase untuk merapikan pekerjaan lokal, dan pertahankan riwayat yang sudah menjadi dasar pekerjaan bersama.

Baca artikel lain pada topik Git untuk melihat hubungan antara commit, parent, dan perubahan riwayat.

Rujukan: dokumentasi git rebase, git merge, git push, dan git reflog.