Jika Anda mendorong komit ke server, dan kemudian menulis ulang yang melakukan secara lokal (dengan git reset, git rebase,git filter-branch , atau manipulasi sejarah lainnya), dan kemudian mendorong yang ditulis ulang berkomitmen kembali ke server, Anda akan mengacaukan orang lain yang telah ditarik. Berikut contohnya; katakanlah Anda telah melakukan A, dan mendorongnya ke server.
- * - * - A <- master
- * - * - A <- origin / master
Sekarang Anda memutuskan untuk menulis ulang A, dengan cara yang Anda sebutkan, menyetel ulang dan melakukan ulang. Perhatikan bahwa ini meninggalkan komit yang menggantung, A, yang pada akhirnya akan menjadi sampah yang dikumpulkan karena tidak dapat dijangkau.
-*-*-SEBUAH
\
A '<- master
- * - * - A <- origin / master
Jika orang lain, katakanlah Fred, menarik ke bawah masterdari server saat Anda melakukan ini, mereka akan memiliki referensi ke A, yang mungkin mereka mulai bekerja dari:
- * - * - A '<- master
- * - * - A <- origin / master
- * - * - AB <- fred / master
Sekarang jika Anda dapat mendorong A 'ke origin / master, yang akan membuat non-fast-forward, ia tidak akan memiliki A dalam sejarahnya. Jadi jika Fred mencoba menarik lagi, dia tiba-tiba harus bergabung, dan akan memperkenalkan kembali A commit:
- * - * - A '<- master
- * - * - A <- origin / master
- * - * - AB- \
\ * <- fred / master
SEBUAH'--/
Jika Fred kebetulan melihat ini, maka dia bisa melakukan rebase, yang akan mencegah komit A muncul kembali. Tetapi dia harus memperhatikan ini, dan ingat untuk melakukan ini; dan jika Anda memiliki lebih dari satu orang yang menjatuhkan A, mereka semua harus melakukan rebase untuk menghindari mendapatkan tambahan A commit di pohon.
Jadi, biasanya bukan ide yang baik untuk mengubah sejarah pada repo yang diambil orang lain. Namun, jika Anda mengetahui bahwa tidak ada orang lain yang menarik dari repo itu (misalnya, itu adalah repo pribadi Anda sendiri, atau Anda hanya memiliki satu pengembang lain yang mengerjakan proyek yang dapat Anda koordinasikan dengan mudah), maka Anda dapat secara paksa perbarui dengan menjalankan:
git push -f
atau
git push origin +master
Keduanya akan mengabaikan pemeriksaan push non-fast-forward, dan memperbarui apa yang ada di server ke revisi A 'Anda yang baru, mengabaikan revisi A sehingga pada akhirnya akan dikumpulkan sampahnya.
Ada kemungkinan bahwa dorongan paksa sepenuhnya dinonaktifkan dengan receive.denyNonFastForwardsopsi konfigurasi. Opsi ini diaktifkan secara default di repositori bersama. Dalam hal ini, jika Anda benar-benar ingin memaksakan dorongan, opsi terbaik adalah menghapus cabang dan membuatnya kembali, dengan git push origin :master; git push origin master:master. Namun, denyNonFastForwardsopsi tersebut diaktifkan karena suatu alasan, yang dijelaskan di atas; pada repositori bersama, itu berarti bahwa sekarang setiap orang yang menggunakannya perlu memastikan bahwa mereka kembali ke riwayat baru.
Pada repositori bersama, secara umum lebih baik untuk hanya mendorong komit baru di atas yang memperbaiki masalah apa pun yang Anda miliki; Anda dapat menggunakan git revertuntuk menghasilkan komit yang akan membatalkan perubahan komit sebelumnya.