Bagaimana saya bisa mendorong komit tetap ke repositori Git jarak jauh?

Ketika saya melakukan beberapa pekerjaan pada kode sumber, saya melakukan hal yang biasa, dan kemudian saya mengklik repositori jarak jauh. Tetapi kemudian saya perhatikan bahwa saya lupa mengatur impor ke dalam kode sumber. Oleh karena itu, saya membuat perintah perubahan untuk mengganti komit sebelumnya:

 > git commit --amend 

Sayangnya, komit tidak dapat dikembalikan ke repositori. Ditolak sebagai berikut:

 > git push origin To //my.remote.repo.com/stuff.git/ ! [rejected] master -> master (non-fast forward) error: failed to push some refs to '//my.remote.repo.com/stuff.git/' 

Apa yang harus saya lakukan? (Saya dapat mengakses repositori jarak jauh.)

475
31 окт. Spoike mengatur 31 Oktober 2008-10-31 13:23 '08 pada 13:23 2008-10-31 13:23
@ 13 jawaban

Saya sebenarnya pernah mengklik repositori --force dan .git dan mendapat kutukan dari Linus BIG TIME . Secara umum, itu akan menciptakan banyak masalah bagi orang lain. Jawaban sederhananya adalah: "Jangan lakukan ini."

Saya melihat orang lain memberikan resep untuk ini, jadi saya tidak akan mengu>

  • Temukan komit lama yang Anda berikan kontribusi (anggap komit old , dan kami akan memilih perintah baru yang Anda buat dengan mengubah yang new ).
  • Buat penggabungan antara yang old dan yang new dengan menulis pohon new , misalnya, git checkout new git merge -s ours old .
  • Kombinasikan ini dengan master Anda menggunakan master git merge master
  • Perbarui wizard Anda dengan hasil git push . HEAD:master git push . HEAD:master
  • Cetak hasilnya.

Kemudian orang-orang yang tidak cukup berhasil untuk mendasarkan pekerjaan mereka pada fiksasi yang Anda hancurkan, mengoreksi dan memaksa dorongan (yang Anda adalah anak yang sangat buruk ), akan melihat hasil merger dan melihat bahwa Anda menggunakan yang new dari yang old . Penggabungan mereka berikutnya tidak akan melihat konflik antara old dan new , yang muncul sebagai akibat dari perubahan, sehingga mereka tidak perlu menderita.

371
11 янв. jawabannya diberikan oleh gitster 11 januari . 2009-01-11 10:36 '09 pada 10:36 2009-01-11 10:36

Anda melihat fitur keamanan Git. Git menolak untuk memperbarui cabang jarak jauh dari cabang karena cabang header Anda bukan keturunan >

Jika ini bukan masalahnya, maka dua orang yang mendorong pada repositori yang sama pada waktu yang sama tidak akan tahu bahwa komit baru terjadi pada waktu yang sama, dan orang yang mendorong yang terakhir akan kehi>

Jika Anda tahu bahwa Anda adalah satu-satunya orang yang telah mengklik, dan Anda ingin menekan perbaikan tetap atau menekan perbaikan yang memveto cabang, Anda dapat "memaksa" Git untuk memperbarui cabang jarak jauh dengan sakelar -f .

 git push -f origin master 

Bahkan ini mungkin tidak berhasil, karena Git memungkinkan repositori jarak jauh untuk memberikan klik cepat di ujung menggunakan receive.denynonfastforwards konfigurasi receive.denynonfastforwards . Jika ini masalahnya, alasan penolakan akan terlihat seperti ini (perhatikan bagian "kegagalan jarak jauh"):

border=0
  ! [remote rejected] master -> master (non-fast forward) 

Untuk menyiasatinya, Anda perlu mengubah konfigurasi repositori jarak jauh, atau, sebagai peretasan kotor, Anda dapat menghapus dan membuat u>

 git push origin :master git push origin master 

Secara umum, parameter terakhir dari git push menggunakan format <local_ref>:<remote_ref> , di mana local_ref adalah nama cabang di repositori lokal, dan remote_ref adalah nama cabang di repositori jarak jauh. Sepasang perintah ini menggunakan dua singkatan. :master adalah null local_ref, yang berarti pengenaan cabang nol di sisi yang jauh dari master , yaitu penghapusan cabang jarak jauh. Nama cabang tanpa : berarti cabang lokal dengan nama yang ditentukan dialihkan ke cabang jauh dengan nama yang sama. master dalam situasi ini adalah kependekan dari master:master .

218
01 нояб. Balas diberikan oleh Charles Bailey 01 Nov. 2008-11-01 00:58 '08 pada 0:58 pagi 2008-11-01 00:58

Kata-kata kasar cepat: fakta bahwa tidak ada yang memposting jawaban sederhana menunjukkan permusuhan putus asa dari pengguna, dimanifestasikan dengan Git CLI.

Bagaimanapun, cara "jelas" untuk melakukan ini, dengan asumsi bahwa Anda tidak mencoba memaksakan dorongan, adalah menariknya terlebih dahulu. Ini akan menyebabkan perubahan yang Anda buat padanya (dan, karena itu, tidak ada lagi) sehingga muncul lagi.

Segera setelah Anda menyelesaikan konflik apa pun, Anda dapat mengklik lagi.

Jadi:

 git pull 

Jika Anda mendapatkan kesalahan saat menarik, mungkin ada sesuatu yang salah dengan konfigurasi repositori lokal Anda (saya mempunyai ref yang tidak valid di bagian .git / config).

Dan sesudahnya

 git push 

Anda dapat menerima fiksasi tambahan dengan subjek "Penggabungan Trivial".

184
22 сент. balasan yang diberikan oleh Tim Band 22 Sep 2009-09-22 13:46 '09 pada 13:46 2009-09-22 13:46

Jawaban singkatnya adalah: jangan menekan fiksasi yang diperbaiki pada repo publik.

Jawaban panjang: beberapa perintah Git, seperti git commit --amend dan git rebase , sebenarnya menulis u>

Namun, jika Anda benar-benar ingin menekan pesan yang dikoreksi, Anda dapat melakukannya seperti ini:

 $ git push origin +master:master 

Tanda + akan memaksa Anda untuk menekan, bahkan jika itu tidak mengarah pada fiksasi "maju cepat". (Penerusan cepat terjadi ketika perubahan yang Anda klik adalah keturunan >

86
31 окт. jawabannya diberikan oleh mipadi pada tanggal 31 Oktober 2008-10-31 17:35 '08 pada 17:35 2008-10-31 17:35

Ini adalah cara yang mudah dan bersih untuk melakukan perubahan setelah Anda melakukan commit --amend :

 git reset --soft HEAD^ git stash git push -f origin master git stash pop git commit -a git push origin master 

Apa yang dilakukan berikut ini:

  • Setel u>
  • Klik komit terakhir.
  • Terpaksa menekan remote control. Sekarang komputer jarak jauh tidak memiliki komit terakhir.
  • Masuk ke dompet Anda.
  • Baca bersih.
  • Klik pada kendali jarak jauh.

Jangan lupa untuk mengubah "asal" dan "master", jika Anda menerapkan ini ke cabang lain atau perangkat jarak jauh.

20
21 июня '15 в 17:41 2015-06-21 17:41 jawabannya diberikan Faiza 21 Juni '15 pada 17:41 2015-06-21 17:41

Saya memecahkan masalah ini dengan membuang perbaikan lokal dan menambahkan perubahan baru dari atas:

 # Rewind to commit before conflicting git reset --soft HEAD~1 # Pull the remote version git pull # Add the new commit on top git add ... git commit git push 
16
24 сент. Jawabannya diberikan bara 24 September 2012-09-24 18:46 '12 pada 6:46 PM 2012-09-24 18:46

Saya memiliki masalah yang sama.

  • Perbaikan terakhir yang sudah ditekan disesuaikan secara acak.
  • Banyak perubahan dilakukan secara lokal, dilakukan lima kali
  • Mencoba mengklik, mendapatkan kesalahan, panik, menggabungkan akses jarak jauh, mendapatkan banyak file non-saya, diklik, gagal, dll.

Sebagai git -newbie, saya pikir itu selesai oleh FUBAR .

Keputusan Sedikit berbeda, seperti yang disarankan @bara + buat cabang cadangan lokal

 # Rewind to commit just before the pushed-and-amended one. # Replace <hash> with the needed hash. # --soft means: leave all the changes there, so nothing is lost. git reset --soft <hash> # Create new branch, just for a backup, still having all changes in it. # The branch was feature/1234, new one - feature/1234-gone-bad git checkout -b feature/1234-gone-bad # Commit all the changes (all the mess) not to lose it  not to carry around git commit -a -m "feature/1234 backup" # Switch back to the original branch git checkout feature/1234 # Pull the from remote (named 'origin'), thus 'repairing' our main problem git pull origin/feature/1234 # Now you have a clean-and-non-diverged branch and a backup of the local changes. # Check the needed files from the backup branch git checkout feature/1234-gone-bad -- the/path/to/file.php 

Mungkin ini bukan keputusan yang cepat dan bersih, dan saya kehi>

7
20 февр. Jawabannya diberikan davisca 20 Feb. 2014-02-20 13:24 '14 pukul 13:24 2014-02-20 13:24

Jika Anda tahu bahwa tidak ada yang menarik perbaikan Anda tanpa modifikasi, gunakan opsi git push --force-with-lease git push .

Di TortoiseGit, Anda dapat melakukan hal yang sama di pengaturan "Push ..." "Force: May discard" dan periksa "perubahan yang diketahui".

Force (dapat menolak perubahan yang diketahui) memungkinkan repositori jarak jauh untuk mengambil transisi yang lebih aman dan tidak cepat. Ini dapat menyebabkan repositori jarak jauh kehi>

3
07 июня '16 в 3:03 2016-06-07 03:03 jawabannya diberikan oleh ShawnFeatherly pada 07 Juni '16 pukul 3:03 2016-06-07 03:03

Berikut ini adalah cara mudah dan bersih untuk melakukan perubahan setelah Anda selesai git add "your files" dan git commit --amend - git commit --amend :

 git push origin master -f 

atau

 git push origin master --force 
2
18 янв. Jawabannya diberikan oleh Marwen Bkh 18 Januari. 2016-01-18 11:29 '16 pada 11:29 2016-01-18 11:29

Jika Anda tidak menekan kode pada cabang jarak jauh (GitHub / Bitbucket), Anda dapat mengubah pesan komit pada baris perintah, seperti yang ditunjukkan di bawah ini.

  git commit --amend -m "Your new message" 

Jika Anda bekerja pada cabang tertentu, lakukan hal berikut:

 git commit --amend -m "BRANCH-NAME: new message" 

Jika Anda sudah mengklik kode dengan pesan yang salah, Anda harus berhati-hati saat mengubah pesan. Setelah Anda mengubah pesan komit dan mencoba menekannya lagi, Anda memiliki masalah. Untuk membuatnya lancar, ikuti >

Harap baca seluruh jawaban sebelum melakukannya.

 git commit --amend -m "BRANCH-NAME : your new message" git push -f origin BRANCH-NAME # Not a best practice. Read below why? 

Catatan penting :. Saat Anda menekan tombol, Anda mungkin mengalami masalah kode yang dikerjakan pengembang lain di cabang yang sama. Karena itu, untuk menghindari konflik ini, Anda perlu menarik kode keluar dari cabang Anda, sebelum menekan paksa :

  git commit --amend -m "BRANCH-NAME : your new message" git pull origin BRANCH-NAME git push -f origin BRANCH-NAME 

Ini adalah praktik terbaik saat mengubah pesan komit, jika sudah ditekan.

2
13 янв. Jawaban diberikan oleh Packer 13 Jan 2015-01-13 10:20 '15 pada 10:20 2015-01-13 10:20

Anda mendapatkan kesalahan ini karena Git remote sudah memiliki file komit ini. Anda harus dengan kuat mengklik cabang agar ini berfungsi:

 git push -f origin branch_name 

Pastikan juga Anda mengeluarkan kode dari jarak jauh, karena seseorang dari tim Anda dapat pindah ke satu cabang.

 git pull origin branch_name 

Ini adalah salah satu kasus ketika kita perlu memaksa perbaikan ke yang jauh.

1
21 янв. jawabannya diberikan oleh Praveen Dhawan 21 Jan 2016-01-21 09:35 '16 pada 9:35 2016-01-21 09:35

Saya harus memperbaiki masalah ini dengan menarik dari repo jarak jauh dan memilah konflik gabungan yang muncul, memperbaiki dan kemudian klik. Tapi saya merasa ada cara yang lebih baik.

1
31 окт. Balas Spoike 31 Oktober 2008-10-31 14:39 '08 pukul 14:39 2008-10-31 14:39

Saya terus melakukan apa yang dikatakan Git. Jadi:

  • Tidak dapat mengklik karena perbaikan.
  • Saya mencoba seperti yang saya harapkan.
  • Gabungkan kesalahan jadi saya memperbaikinya secara manual.
  • Buat komit baru (ditandai "gabungan") dan klik.
  • Tampaknya itu berhasil!

Catatan Fiksasi yang dimodifikasi adalah yang terakhir.

1
02 дек. Jawabannya diberikan Rolf 02 Des. 2016-12-02 19:29 '16 pada 19:29 2016-12-02 19:29

Pertanyaan lain tentang atau mengajukan pertanyaan