Kursus
Sebagai developer, Anda mungkin pernah mengalami ini: Anda baru menyadari ada masalah pada kode di commit terakhir. Untuk membatalkan kesalahan ini, Anda menjalankan beberapa perintah dan menulis ulang riwayat lokal. Saat Anda menjalankan git push --force untuk merapikan semuanya, rekan satu tim memberi tahu bahwa beberapa commit hilang atau pipeline Anda menghasilkan build yang gagal.
Dalam artikel ini, saya akan menjelaskan apa yang sebenarnya dilakukan oleh git push --force, kapan menggunakannya, dan bagaimana menghindari kesalahan. Jika Anda baru mulai menggunakan Git, saya menyarankan untuk mengikuti our Introduction to Git course to learn about version control. Also, I find the Git Cheat Sheet, which you can download, is a helpful reference because it has all the most common Git terminologies and commands.
Kapan Anda Mungkin Mengira Perlu git push --force
Misalnya Anda merapikan riwayat commit lokal sebelum mendorong pekerjaan Anda. Untuk menata riwayat commit sebelum melakukan merge, Anda menjalankan git rebase -i main. Semuanya terlihat sempurna secara lokal, jadi Anda mencoba memperbarui branch remote dengan git push sederhana. Namun alih-alih pesan sukses seperti biasa, Git menampilkan error.
Anda juga mungkin menemui situasi lain saat tanpa sengaja commit data sensitif, misalnya API key atau kata sandi, lalu mendorongnya ke remote. Setelah menulis ulang riwayat secara lokal untuk menghapus commit bermasalah, Anda mendapati push biasa tidak memperbarui repositori remote, dan data sensitifnya tetap ada. Anda justru mendapat pesan error.
! [rejected] main -> main (non-fast-forward)
error: failed to push some refs to 'origin'
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.
Error "non-fast-forward" ini adalah jaring pengaman Git, sebuah peringatan bahwa ada sesuatu pada riwayat Anda yang tidak cocok dengan yang ada di server. Pada titik ini, menggoda sekali untuk menjalankan git push --force guna melewati error tersebut.
Itu mungkin baik-baik saja jika Anda satu-satunya yang mengerjakan branch tersebut. Namun, pada proyek bersama, tindakan ini mudah menimbulkan kebingungan atau menghapus pekerjaan orang lain.
Apa yang Sebenarnya Dilakukan git push --force
Biasanya, Git hanya mengizinkan Anda mendorong perubahan jika branch lokal Anda berisi semua yang sudah ada di remote, termasuk commit baru Anda. Namun, kadang Anda menulis ulang riwayat commit melalui git rebase, squashing, atau menghapus data sensitif. Saat melakukan ini, branch lokal Anda akan berbeda dari branch remote. Lalu ketika Anda mencoba mendorong commit baru, Git menampilkan error yang melindungi branch remote dari kehilangan pekerjaan.
Menggunakan git push --force memberi tahu Git untuk melewatkan pemeriksaan keamanan dan menimpa branch remote dengan isi branch lokal Anda.
Beginilah tampilannya:
git push --force origin main
Ini akan memperbarui branch main di remote agar sama dengan main lokal Anda dan menghapus commit apa pun yang tidak ada di branch lokal Anda.
Sekarang, bayangkan branch Git Anda seperti sebuah bab dalam buku bersama yang ditulis tim Anda. Push standar ibarat menambahkan paragraf baru di akhir bab. Namun, git push --force lebih kuat: ia mencabut bab yang sekarang dan menggantinya sepenuhnya dengan versi Anda.
Risiko menggunakan git push --force adalah kolaborator bisa kehilangan pekerjaan jika mereka mendasarkan perubahan pada commit yang baru saja Anda hapus. Pada bagian berikutnya, kita akan melihat langkah pencegahan saat bekerja dengan perintah --force.
Mengapa Ini Bisa Merusak Segalanya bagi Tim Anda
Jika Anda memaksa push perubahan ke branch bersama seperti main atau develop, Anda kemungkinan akan mengalami hal-hal berikut:
- Branch lokal orang lain menjadi tidak sinkron: Jika rekan Anda telah menarik commit lama yang kini Anda hapus dari remote, riwayat lokal mereka tidak lagi cocok dengan server. Branch mereka akan mereferensikan commit yang telah "menghilang", menimbulkan kebingungan dan
- Pull menghasilkan merge yang membingungkan atau error: Ketika seseorang mencoba git pull setelah Anda melakukan force push, Git tidak tahu cara menyelaraskan riwayat yang ditulis ulang dengan urutan commit lokal mereka. Ini sering berujung pada merge commit yang aneh, error yang membingungkan, atau situasi di mana rekan diminta untuk melakukan intervensi manual dengan git fetch, git reset, atau bahkan meng-kloning ulang branch.
- Pipeline CI/CD bisa gagal: Pipeline sering mengandalkan hash commit yang konsisten dan riwayat linear. Force push dapat menyebabkan kegagalan pengujian, melakukan deploy kode yang salah, atau crash saat membangun ulang di commit usang.
Lihat kursus CI/CD for Machine Learning kami untuk memahami cara membangun alur kerja CI/CD. Saya juga merekomendasikan kursus Introduction to Data Versioning with DVC untuk mempelajari perbedaan antara versioning data dan versioning kode.
Mari saya ilustrasikan: Anda berada di branch feature bersama rekan tim. Anda merapikan riwayat lokal, lalu menjalankan git push --force. Beberapa menit kemudian, rekan Anda mendorong perubahannya. Mereka melihat error di Git. Saat melakukan pull, mereka mendapat konflik merge dan riwayat commit yang berantakan. Sementara itu, pipeline CI Anda gagal karena commit yang hilang. Kini, rekan Anda membuang waktu untuk mengurai branch, dan deployment tertunda.
Satu force push memicu semua itu.
Opsi yang Lebih Aman: git push --force-with-lease
Untuk menghindari masalah seperti itu, saya menyarankan menggunakan git push --force-with-lease. Perintah ini menambahkan pemeriksaan keamanan saat mendorong ke branch remote untuk menghindari commit yang tidak terduga.
git push --force-with-lease origin main
Anggap --force-with-lease seperti "bertanya apakah aman sebelum terjun". Sebelum melakukan apa pun, Git memastikan tidak ada orang lain yang mengubah branch. Jika semuanya masih seperti terakhir Anda lihat, riwayat Anda diperbarui. Namun jika ada perubahan baru yang belum Anda ketahui, Git menghentikan Anda dan meminta untuk meninjau situasi terlebih dahulu. Dengan demikian, perintah ini akan selalu melindungi kolaborator dari penimpaan yang tidak disengaja.
Cara Memulihkan dari Force Push yang Buruk
Jika Anda kehilangan beberapa commit, jangan khawatir karena Anda masih bisa memulihkannya. Git selalu menyimpan catatan perubahan pada commit saat ini, termasuk penulisan ulang, dan menyimpannya di reflog.
Berikut cara Anda memulihkan commit yang hilang:
Langkah 1: Gunakan git reflog untuk menemukan commit yang hilang
Jalankan git reflog untuk melihat riwayat branch Anda.
git reflog
Anda mungkin melihat commit seperti ini:
abc1234 HEAD@{1}: push: force push
def5678 HEAD@{2}: commit: add new feature
Langkah 2: Pulihkan commit yang hilang
Setelah Anda mengidentifikasi hash commit yang ingin dipulihkan, gunakan perintah di bawah ini untuk menuju ke branch spesifik.
git checkout def5678
Langkah 3: Buat branch baru
Untuk memulihkan file dengan aman, buat git branch baru.
git checkout -b recovery-branch
Langkah 4: Pulihkan branch remote
Sekarang dorong commit yang sudah dipulihkan ke branch tersebut:
git push origin recovery-branch
Perlu diingat bahwa data reflog hanya ada di mesin lokal. Oleh karena itu, Anda mungkin tidak dapat memulihkan commit yang hilang jika tidak ada rekan tim yang menyimpannya di lingkungan lokal.
Saya merekomendasikan kursus Intermediate Git kami untuk mempelajari lebih lanjut tentang kolaborasi dan bekerja dengan branch di Git.
Praktik Terbaik untuk Menggunakan git push --force dengan Aman
Untuk mengurangi kemungkinan kerusakan, berikut beberapa kebiasaan baik yang perlu diikuti:
-
Lebih utamakan --force-with-lease daripada --force: Metode ini lebih aman karena memeriksa apakah branch remote tidak berubah sejak fetch terakhir Anda. Saya akan membantu melindungi rekan Anda dari penimpaan yang tidak disengaja.
-
Hindari force push ke branch bersama: Jangan pernah melakukan force push ke branch bersama seperti
main,master,develop, atau branchrelease. Lakukan force push hanya ke branch feature Anda sendiri ketika Anda satu-satunya kontributor untuk menghindari gangguan. -
Beri tahu tim Anda sebelum melakukan force push: Jika Anda harus melakukan force push ke branch bersama, beri tahu tim. Ini memungkinkan mereka menyimpan pekerjaan dan menghindari kehilangan.
-
Gunakan protected branch: Anda juga dapat mengaktifkan perlindungan untuk branch saat menggunakan platform seperti GitHub, GitLab, dan Bitbucket. Ini membatasi penyuntingan langsung dan mencegah force push yang tidak disengaja ke branch penting.
Jika Anda ingin mempelajari lebih lanjut tentang pengelolaan repo privat, lihat kursus Introduction to GitHub Concepts kami untuk memahami cara meninjau pull request saat berkolaborasi di GitHub.
Kesimpulan
git push --force menawarkan cara yang berguna untuk menulis ulang riwayat repo Anda, baik untuk merapikan commit maupun menghapus data sensitif. Selalu berhati-hati saat menggunakan perintah ini untuk menghindari rusaknya alur kerja tim Anda.
Sebisa mungkin, gunakan --force-with-lease. Opsi ini memberi Anda lebih banyak kendali tanpa mempertaruhkan pekerjaan orang lain. Dengan sedikit kehati-hatian dan komunikasi, Anda dapat menjaga riwayat Git tetap rapi tanpa menimbulkan masalah bagi tim.
Saya menyarankan Anda melihat jalur keahlian Git Fundamentals dan GitHub Foundations kami untuk menjadi ahli dalam semua hal tentang Git.
FAQs
Apa risiko menggunakan git push --force?
Ini dapat menimpa commit di branch remote, menyebabkan rekan tim kehilangan pekerjaan atau mengalami konflik merge yang membingungkan.
Bagaimana cara aman menggunakan git push --force-with-lease?
Gunakan git push --force-with-lease alih-alih --force untuk memastikan branch remote tidak berubah sejak fetch terakhir Anda, dan membantu mencegah penimpaan yang tidak disengaja.
Apa saja skenario ketika git push --force diperlukan?
git push --force mungkin diperlukan saat Anda melakukan rebase commit lokal, menghapus data sensitif dari riwayat, atau merapikan riwayat commit sebelum menggabungkan branch fitur.
Bagaimana cara membatalkan git push --force yang saya sesali?
Untuk membatalkan git push --force jalankan git reflog untuk menemukan commit sebelumnya, lalu pulihkan dengan checkout ke commit tersebut dan melakukan force push pada branch yang telah dikoreksi.
Apa praktik terbaik untuk menghindari kesalahan dengan git push --force?
Gunakan --force-with-lease, hindari force push ke branch bersama, berkomunikasi dengan tim Anda, dan lindungi branch penting di platform hosting Git Anda.

