Pertanyaan Bagaimana cara mendorong paksa Git dengan benar?


Saya telah menyiapkan repo "utama" non-telanjang dan mengkloning ke komputer saya. Saya membuat beberapa perubahan lokal, memperbarui repositori lokal saya, dan mendorong perubahan kembali ke repositori jarak jauh saya. Semuanya baik-baik saja sampai saat itu.

Sekarang, saya harus mengubah sesuatu di repo jarak jauh. Lalu saya mengubah sesuatu di repo lokal saya. Saya menyadari bahwa perubahan reparasi 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 yang tidak mempercepat adalah   reject Gabungkan perubahan jarak jauh sebelum mendorong lagi. Lihat 'Catatan   tentang bagian fast-forward 'dari git push --help untuk detailnya.

Saya pikir itu mungkin a

git push --force

akan memaksa salinan lokal saya untuk mendorong perubahan ke remote dan membuatnya sama. Itu memang memaksa pembaruan, tetapi ketika saya kembali ke repositori jarak jauh dan membuat komit, saya melihat bahwa file-file tersebut berisi perubahan-perubahan yang sudah ketinggalan jaman (yang sebelumnya dimiliki oleh repo remote utama).

Seperti yang saya sebutkan di komentar ke salah satu jawaban:

[Saya] mencoba memaksa, tetapi ketika kembali ke server master untuk menyimpan perubahan, saya mendapatkan staging yang ketinggalan jaman. 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?


908
2018-04-01 05:35


asal


Jawaban:


Kerjakan saja:

git push origin <your_branch_name> --force

atau jika Anda memiliki repo spesifik:

git push https://git.... --force

Ini akan menghapus commit Anda sebelumnya dan menekan commit Anda saat ini.

Ini mungkin tidak tepat, tetapi jika ada yang tersandung pada halaman ini, berpikir mereka mungkin menginginkan solusi sederhana ...

Bendera pendek

Juga perhatikan itu -f adalah kependekan dari --force, jadi

git push origin <your_branch_name> -f

juga akan berfungsi.


1726
2017-09-26 21:31



Dan jika push --force tidak bekerja yang dapat Anda lakukan push --delete. Lihatlah 2nd baris pada contoh ini:

git reset --hard HEAD~3  # reset current branch to 3 commits ago
git push origin master --delete  # do a very very bad bad thing
git push origin master  # regular push

Tapi hati-hati ...

Jangan pernah kembali pada sejarah git publik!

Dengan kata lain:

  • Jangan pernah force mendorong pada repositori umum.
  • Jangan lakukan ini atau apapun yang bisa menghancurkan seseorang pull.
  • Jangan pernah reset atau rewrite sejarah dalam repo seseorang mungkin sudah menarik.

Tentu saja ada pengecualian yang sangat jarang bahkan untuk aturan ini, tetapi dalam banyak kasus itu tidak diperlukan untuk melakukannya dan itu akan menimbulkan masalah bagi orang lain.

Lakukan sebaliknya.

Dan selalu berhati-hati dengan apa yang Anda dorong ke repo publik. Mengembalikan:

git revert -n HEAD~3..HEAD  # prepare a new commit reverting last 3 commits
git commit -m "sorry - revert last 3 commits because I was not careful"
git push origin master  # regular push

Sebenarnya, kedua KEPALA asal (dari kembali dan dari reset jahat) akan berisi file yang sama.


sunting untuk menambahkan info terbaru dan lebih banyak argumen di sekitar push --force

Pertimbangkan mendorong kekuatan dengan sewa alih-alih push, tetapi tetap lebih suka kembalikan

Masalah lain push --force mungkin adalah ketika seseorang mendorong sesuatu sebelum Anda melakukannya, tetapi setelah Anda sudah mengambilnya. Jika Anda mendorong kekuatan Anda di-rebased versi sekarang Anda akan ganti pekerjaan dari yang lain.

git push --force-with-lease diperkenalkan di git 1.8.5 (terima kasih kepada @VonC mengomentari pertanyaan) mencoba untuk mengatasi masalah khusus ini. Pada dasarnya, ini 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 lebih jauh bahwa ini seharusnya menjadi default push --force tingkah laku. Tapi itu masih jauh dari alasan untuk memaksa push. Orang yang diambil sebelum Anda rebase masih akan memiliki banyak masalah, yang dapat dengan mudah dihindari jika Anda punya dikembalikan sebagai gantinya.

Dan karena kita sedang berbicara tentang git --push contoh...

Mengapa ada yang ingin memaksakan dorongan?

@linquize membawa contoh kekuatan dorong yang baik pada komentar: data sensitif. Anda telah salah membocorkan data yang seharusnya tidak didorong. Jika Anda cukup cepat, Anda bisa "memperbaiki"* dengan memaksakan dorongan di atas.

* Itu data akan tetap berada di kendali jarak jauh kecuali Anda juga melakukan mengumpulkan sampah, atau bersihkan entah bagaimana. Ada juga potensi yang jelas untuk disebarkan oleh orang lain diambil sudah, tetapi Anda mendapatkan ide.


198
2018-05-22 22:03



Pertama-tama, saya tidak akan membuat perubahan langsung di repo "utama". Jika Anda benar-benar ingin memiliki repo "utama", maka Anda hanya perlu mendorongnya, tidak pernah mengubahnya secara langsung.

Mengenai kesalahan yang Anda dapatkan, sudahkah Anda mencoba git pull dari repo lokal Anda, dan kemudian git push ke repo utama? Apa yang Anda lakukan saat ini (jika saya memahaminya dengan baik) memaksa dorongan dan kemudian kehilangan perubahan Anda dalam repo "utama". Anda harus menggabungkan perubahan secara lokal terlebih dahulu.


17
2018-04-01 05:42



Jika saya berada di cabang lokal saya A, dan saya ingin memaksa cabang lokal B ke cabang asal C Saya dapat menggunakan sintaks berikut:

git push --force origin B:C

13
2018-05-28 18:25



Saya benar-benar akan merekomendasikan untuk:

  • dorong hanya ke repo utama

  • pastikan bahwa repo utama adalah a repo telanjang, agar tidak pernah memiliki masalah dengan pohon kerja repo utama yang tidak sinkron dengan nya .git mendasarkan. Lihat "Bagaimana cara mendorong repositori git lokal ke komputer lain?"

  • Jika Anda harus membuat modifikasi di repo utama (kosong), klon itu (pada server utama), lakukan modifikasi Anda dan dorong kembali ke sana.

Dengan kata lain, simpan repo kosong baik dari server utama dan komputer lokal, untuk memiliki reparasi hulu tunggal dari / untuk menarik / menarik.


10
2018-04-01 05:53



Ini adalah solusi kami untuk mengganti master di repositori gitHub korporat sambil mempertahankan sejarah.

push -f untuk menguasai repositori perusahaan sering dinonaktifkan untuk mempertahankan riwayat cabang. Solusi ini berhasil bagi kami.

git fetch desiredOrigin
git checkout -b master desiredOrigin/master // get origin master

git checkout currentBranch  // move to target branch
git merge -s ours master  // merge using ours over master
// vim will open for the commit message
git checkout master  // move to master
git merge currentBranch  // merge resolved changes into master

dorong cabang Anda ke desiredOrigin dan membuat PR


5
2018-05-26 21:31



gunakan perintah berikut ini:

git push -f origin master

3
2018-04-10 14:00