Saya khawatir bahwa saya mungkin lupa tentang fitur bagus ini saat berikutnya saya membutuhkannya.
Git 2.13 (Q2 2017) menjelaskan mengapa tidak ada "perlindungan" terhadap opsi push ini yang dilupakan, karena bahkan jika Anda tidak melupakannya di git pushlevel, itu mungkin masih diabaikan.
Lihat komit f17d642 (19 Apr 2017) oleh Ævar Arnfjörð Bjarmason ( avar) .
(Digabung oleh Junio C Hamano - gitster- dalam komit 46bdfa3 , 26 Apr 2017)
push: dokumentasikan & uji --force-with-leasedengan beberapa remote
Dokumentasikan & uji untuk kasus-kasus di mana ada dua remote yang menunjuk ke URL yang sama, dan latar belakang mengambil & selanjutnya git push --force-with-leaseseharusnya tidak mengganggu referensi yang tidak diperbarui yang belum kami ambil.
Beberapa editor seperti Microsoft VSC memiliki fitur untuk mengambil secara otomatis di latar belakang, ini memintas perlindungan yang ditawarkan oleh --force-with-lease&--force-with-lease=<refname> , sebagaimana dicatat dalam dokumentasi yang ditambahkan di sini.
Jadi dokumentasi untukgit push saat ini meliputi:
catatan umum tentang keamanan: menyediakan opsi ini tanpa nilai yang diharapkan, yaitu sebagai --force-with-leaseatau --force-with-lease=<refname>
berinteraksi sangat buruk dengan apa pun yang secara implisit berjalan git fetchpada remote untuk didorong ke latar belakang, misalnya git fetch origin
pada repositori Anda di cronjob.
Perlindungan yang ditawarkannya --forceadalah memastikan bahwa perubahan selanjutnya yang tidak didasarkan pada pekerjaan Anda tidak musnah, tetapi ini sepele dikalahkan jika beberapa proses latar belakang memperbarui referensi di latar belakang. Kami tidak memiliki apa-apa selain info pelacakan jarak jauh sebagai heuristik untuk referensi yang Anda harapkan telah dilihat & bersedia untuk musnah.
Jika editor Anda atau sistem lain berjalan git fetchdi latar belakang bagi Anda cara untuk mengurangi ini adalah dengan cukup mengatur remote lain:
git remote add origin-push $(git config remote.origin.url)
git fetch origin-push
Sekarang ketika proses latar belakang berjalan git fetch originreferensi origin-pushtidak akan diperbarui, dan dengan demikian perintah seperti:
git push --force-with-lease origin-push
Akan gagal kecuali Anda menjalankannya secara manual git fetch origin-push.
Metode ini tentu saja sepenuhnya dikalahkan oleh sesuatu yang berjalan git fetch
--all, dalam hal ini Anda harus menonaktifkannya atau melakukan sesuatu yang lebih membosankan seperti:
git fetch # update 'master' from remote
git tag base master # mark our base point
git rebase -i master # rewrite some commits
git push --force-with-lease=master:base master:master
Yaitu membuat basetag untuk versi kode hulu yang telah Anda lihat dan bersedia untuk ditimpa, lalu menulis ulang riwayat, dan akhirnya memaksa perubahan push ke masterjika versi jauh masih di base, terlepas dari apa lokal Anda remotes/origin/mastertelah diperbarui ke dalam Latar Belakang.
rmuntukrm -idi .bashrc; Anda akan melupakan dan menghapus file penting di server suatu hari nanti. Pergi dengan alias Anda sendiri tidak memiliki masalah itu :)