Saya telah menyiapkan repo "main" non-telanjang jarak jauh dan mengkloningnya ke komputer saya. Saya membuat beberapa perubahan lokal, memperbarui repositori lokal saya, dan mendorong perubahan kembali ke repo jarak jauh saya. Semuanya baik-baik saja hingga saat itu.
Sekarang, saya harus mengubah sesuatu di repo jarak jauh. Kemudian saya mengubah sesuatu di repo lokal saya. Saya menyadari bahwa perubahan repo jarak jauh tidak diperlukan. Jadi saya mencoba git push
dari repo lokal saya ke repo jarak jauh saya, tetapi saya mendapat kesalahan seperti:
Untuk mencegah Anda kehilangan riwayat, pembaruan non-maju ditolak. Gabungkan perubahan jarak jauh sebelum mendorong lagi. Lihat bagian 'Catatan tentang maju cepat'
git push --help
untuk detailnya.
Saya pikir mungkin a
git push --force
akan memaksa salinan lokal saya untuk mendorong perubahan ke yang jauh dan membuatnya sama. Memang memaksa pembaruan , tetapi ketika saya kembali ke repo jarak jauh dan membuat komit, saya melihat bahwa file berisi perubahan yang sudah ketinggalan zaman (yang repo jarak jauh utama sebelumnya).
Seperti yang saya sebutkan di komentar untuk salah satu jawaban :
[Saya] mencoba memaksa, tetapi ketika kembali ke server master untuk menyimpan perubahan, saya mendapatkan pementasan yang ketinggalan zaman. Jadi, ketika saya melakukan repositori tidak sama. Dan ketika saya mencoba menggunakan git push lagi, saya mendapatkan kesalahan yang sama.
Bagaimana saya bisa memperbaiki masalah ini?
sumber
git push -force
lebih hati-hati .git push --force
memang merupakan cara lain yang valid untuk memaksa push, dan akan mendorong cabang sama seperti halnyagit push origin master --force
dengan standar Gitpush.default config settings
, meskipun cabang mana yang secara khusus terdorong berbeda antara versi Git sebelum 2.0 versus setelah 2.0.git push --force
hari ini berfungsi dengan baik, FWIW ...git push --force-with-lease
bekerja lebih baik :), ia akan menolak untuk memperbarui cabang kecuali jika itu adalah keadaan yang Anda harapkan. (lihat developer.atlassian.com/blog/2015/04/force-with-lease )Jawaban:
Kerjakan saja:
atau jika Anda memiliki repo tertentu:
Ini akan menghapus komit Anda sebelumnya dan mendorong komit Anda saat ini.
Ini mungkin tidak tepat, tetapi jika ada yang menemukan halaman ini, mengira mereka mungkin menginginkan solusi sederhana ...
Bendera pendek
Perhatikan juga bahwa
-f
itu kependekan dari--force
, jadijuga akan bekerja.
sumber
git push origin +master
sebagai gantinya, yang memungkinkan Anda mendorong beberapa refspec tanpa memaksa semuanya.git push --force
, Anda mungkin akan mengacaukan cabang master Anda (tergantung pada perilaku default push Anda) .. Yang mungkin payah .. sedikit ..: Dgit push --force
pada dasarnya adalah untuk memaksa mendorong cabang yang saat ini check-out ke bagian remote-counter, jadi jika Anda memiliki cabang master diperiksa, maka itu identik dengangit push origin master --force
. Ini akan berbeda jika Anda menggunakanmatching
pengaturan untukpush.default
, yang merupakan default untuk versi Git sebelum 2.0.matching
mendorong semua cabang lokal ke yang jauh yang memiliki nama yang sama, jadi memaksa mendorong maka pasti bukan yang ingin Anda lakukan ...git push origin master --force
itu.merge -s ours
bekerja untuk sayaDan jika
push --force
tidak berhasil, Anda bisa melakukannyapush --delete
. Lihat 2 nd garis pada contoh ini:Tapi waspadalah ...
Jangan pernah kembali pada sejarah git publik!
Dengan kata lain:
force
mendorong repositori publik.pull
.reset
ataurewrite
riwayat dalam repo seseorang mungkin sudah menarik.Tentu saja ada pengecualian yang sangat jarang bahkan untuk aturan ini, tetapi dalam kebanyakan kasus itu tidak diperlukan untuk melakukannya dan itu akan menimbulkan masalah bagi semua orang.
Kembalikan sebagai gantinya.
Dan selalu berhati-hati dengan apa yang Anda dorong ke repo publik . Mengembalikan:
Akibatnya, kedua kepala asal (dari revert dan dari ulang jahat ) akan berisi file yang sama.
sunting untuk menambahkan info terbaru dan lebih banyak argumen di sekitar
push --force
Pertimbangkan untuk mendorong kekuatan dengan sewa alih-alih mendorong, tetapi masih lebih suka kembali
Masalah lain yang
push --force
mungkin timbul adalah ketika seseorang mendorong sesuatu sebelum Anda melakukannya, tetapi setelah Anda mengambilnya. Jika Anda mendorong paksa versi rebased Anda sekarang Anda akan mengganti pekerjaan dari yang lain .git push --force-with-lease
diperkenalkan pada git 1.8.5 ( terima kasih kepada komentar @VonC pada pertanyaan) mencoba untuk mengatasi masalah khusus ini. Pada dasarnya, itu akan membawa kesalahan dan tidak mendorong jika remote telah dimodifikasi sejak pengambilan terbaru Anda.Ini bagus jika Anda benar-benar yakin
push --force
diperlukan, tetapi masih ingin mencegah lebih banyak masalah. Saya akan mengatakan bahwa itu seharusnya merupakanpush --force
perilaku default . Tapi itu masih jauh dari alasan untuk memaksakanpush
. Orang-orang yang mengambil sebelum rebase Anda masih akan memiliki banyak masalah, yang bisa dengan mudah dihindari jika Anda telah dikembalikan sebagai gantinya.Dan karena kita sedang berbicara tentang
git --push
contoh ...Mengapa ada orang yang ingin memaksakan dorongan?
@linquize membawa contoh gaya dorong yang baik pada komentar: data sensitif . Anda salah membocorkan data yang seharusnya tidak didorong. Jika Anda cukup cepat, Anda dapat "memperbaikinya"
*
dengan memaksakan dorongan di atasnya.*
The Data masih akan di remote kecuali jika Anda juga melakukan sampah mengumpulkan , atau membersihkannya entah bagaimana . Ada juga potensi yang jelas untuk disebarkan oleh orang lain yang sudah mengambilnya , tetapi Anda mendapatkan idenya.sumber
git push origin master --delete # do a very very bad bad thing git push origin master # regular push
ini benar-benar menyelesaikan masalah saya dengan sempurna (pada repo hanya dengan saya dan teman saya). mungkin itu salah untuk repo publik tetapi untuk yang pribadi ini adalah penyelamat.Pertama-tama, saya tidak akan membuat perubahan secara langsung dalam repo "utama". Jika Anda benar-benar ingin memiliki repo "utama", maka Anda hanya perlu mendorongnya, jangan pernah mengubahnya secara langsung.
Mengenai kesalahan yang Anda dapatkan, sudahkah Anda mencoba
git pull
dari repo lokal Anda, dan kemudiangit push
ke repo utama? Apa yang Anda lakukan saat ini (jika saya memahaminya dengan baik) adalah memaksa dan kemudian kehilangan perubahan Anda dalam repo "utama". Anda harus menggabungkan perubahan secara lokal terlebih dahulu.sumber
git push -f
, tetapi kemudian jika Anda mengubah repo utama Anda lagi, Anda harus kembali ke repo lokal Anda dangit pull
, sehingga bisa disinkronkan dengan perubahan terbaru. Kemudian Anda bisa melakukan pekerjaan Anda, dan mendorong lagi. Jika Anda mengikuti alur kerja "tarik-tarik" ini, Anda tidak akan mendapatkan jenis kesalahan yang Anda keluhkan.Jika saya di cabang lokal saya A, dan saya ingin memaksa mendorong cabang lokal B ke cabang asal CI dapat menggunakan sintaks berikut:
sumber
git push --force origin B:C
. Dalam kasus saya, tampaknyagit push --force origin C
hanya akan mendorong dari master lokal ke cabang C jarak jauh, terlepas dari cabang mana saya saat ini.git version 2.3.8 (Apple Git-58)
gunakan perintah berikut ini:
sumber
-f
bendera ...Saya sangat merekomendasikan:
dorong hanya ke repo utama
pastikan repo utama adalah repo kosong , agar tidak pernah ada masalah dengan pohon repo utama yang bekerja tidak sinkron dengan
.git
basisnya. Lihat " Bagaimana cara mendorong repositori git lokal ke komputer lain? "Jika Anda harus melakukan modifikasi pada repo utama (telanjang), tiru (di server utama), lakukan modifikasi Anda dan tekan kembali ke sana
Dengan kata lain, biarkan repo telanjang dapat diakses baik dari server utama dan komputer lokal, agar memiliki repo hulu tunggal dari / yang dapat digunakan untuk menarik / menarik.
sumber
Ini adalah solusi kami untuk mengganti master pada repositori gitHub korporat sambil mempertahankan sejarah.
push -f
untuk menguasai repositori perusahaan sering dinonaktifkan untuk mempertahankan sejarah cabang. Solusi ini berhasil bagi kami.dorong cabang Anda ke
desiredOrigin
dan buat PRsumber
Saya memiliki pertanyaan yang sama tetapi akhirnya menemukan jawabannya. Apa yang kemungkinan besar perlu Anda lakukan adalah menjalankan dua perintah git berikut (mengganti hash dengan nomor revisi komit git):
sumber