Kamu sudah selesai dengan pekerjaanmu, melakukan `git add` dan `git commit` dengan pesan yang rapi. Tinggal satu langkah lagi: `git push`. Tapi bukannya pesan sukses, kamu malah disambut dengan rentetan kalimat merah yang mengintimidasi:
! [rejected] main -> main (non-fast-forward)
error: failed to push some refs to '...'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again.
Tenang, jangan panik. Error ini bukan berarti pekerjaanmu hilang. Justru, ini adalah cara Git melindungimu dari kehilangan pekerjaan orang lain (atau pekerjaanmu sendiri dari komputer lain). Mari kita pahami apa artinya dan bagaimana cara menyelesaikannya dengan aman.
Kenapa Ini Terjadi? (Analogi Dokumen Bersama)
Bayangkan kamu dan rekan kerjamu mengedit dokumen yang sama.
- Kamu mengunduh dokumen versi terbaru pagi ini (`git pull`).
- Kamu bekerja dan menambahkan beberapa paragraf baru (`git commit`).
- Di saat yang sama, rekan kerjamu juga menambahkan paragraf di bagian lain dan menyimpannya ke server. Sekarang, server memiliki versi yang lebih baru yang tidak kamu ketahui.
- Kamu mencoba mengunggah hasil kerjamu (`git push`).
"Server akan menolak file-mu dan berkata, 'Tunggu! Versi yang kamu edit sudah usang. Ada perubahan baru di sini. Unduh dulu perubahan itu, gabungkan dengan pekerjaanmu, baru unggah lagi versi finalnya.' "
Itulah arti dari "your current branch is behind its remote counterpart". Riwayat di server (GitHub) sudah lebih maju daripada riwayat di komputermu.
Solusi Lengkap (Langkah demi Langkah)
Seperti yang disarankan oleh Git, solusinya adalah menggabungkan perubahan dari server ke komputermu terlebih dahulu sebelum mengirim perubahanmu.
Langkah 1: Tarik dan Gabungkan Perubahan (`git pull`)
Jalankan perintah ini di terminal. Perintah ini akan mengunduh "commit" baru dari GitHub dan mencoba menggabungkannya dengan commit yang sudah kamu buat secara lokal.
git pull
Saat menjalankan `git pull`, Git akan secara otomatis menggunakan strategi penggabungan (biasanya "merge"). Jika perubahanmu dan perubahan di server ada di file yang berbeda, proses ini seringkali berjalan mulus. Git akan membuat "merge commit" untuk menyatukan kedua riwayat tersebut.
Catatan: Jika `git pull` pertama kali memberimu error `fatal: Need to specify how to reconcile divergent branches`, jalankan perintah `git config --global pull.rebase false` sekali saja untuk mengatur "merge" sebagai strategi default, lalu jalankan `git pull` lagi.
Langkah 2: Dorong Perubahan Final (`git push`)
Setelah `git pull` berhasil dan semua perubahan telah digabungkan di komputermu, riwayat lokalmu sekarang sudah sinkron dan lebih maju dari server. Sekarang, kamu bisa dengan aman mengirimkan versi gabungan ini.
git push
Kali ini, `push` akan diterima karena prosesnya menjadi "fast-forward" (hanya menambahkan riwayat baru di atas riwayat yang sudah sinkron).
Kesimpulan
Error `non-fast-forward` bukanlah musuh, melainkan teman yang mencegah kita kehilangan data. Biasakan untuk menjalankan `git pull` sebelum memulai pekerjaan baru atau sebelum melakukan `git push`, terutama jika kamu bekerja dari beberapa komputer atau dalam sebuah tim.
Alur kerja yang aman adalah selalu: **Tarik, Kerjakan, Simpan, Tarik lagi, lalu Dorong.** (`Pull, Work, Commit, Pull, Push`).