Saya merasa pertanyaan ini telah ditanyakan berkali-kali, tetapi solusinya biasanya "Saya menghapus direktori dan melakukan kembali pekerjaan saya dengan checkout baru". Saya melakukan komit dan mendorong tetapi menyadari bahwa saya merujuk ke nomor tiket yang salah dalam pesan komit. Jadi saya melihat SO sebentar solusi dan akhirnya mengetik yang berikut ke terminal:
$ git reset --soft HEAD^
$ git commit -m "... correct message ..."
Satu-satunya masalah adalah saya mendapatkan pesan kesalahan berikut:
To prevent you from losing history, non-fast-forward updates were rejected
Merge the remote changes before pushing again. See the 'Note about
fast-forwards' section of 'git push --help' for details.
Saya menggunakan model git-flow dan sedang mengerjakan pengembangan cabang. Bagaimana cara menggabungkan kembali hal-hal untuk membuat git bahagia lagi?
git
version-control
rynmrtn
sumber
sumber
Jawaban:
Paksa
git push
:sumber
receive.denyNonFastForwards
dalam jawaban Brian Campbell :+
atau--force
mungkin tidak cukup kuat, bergantung pada bagaimana mereka — siapa pun mereka — telah mengonfigurasi repositori Git mereka .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.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.
Jika orang lain, katakanlah Fred, menarik ke bawah
master
dari server saat Anda melakukan ini, mereka akan memiliki referensi ke A, yang mungkin mereka mulai bekerja dari: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:
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:
atau
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.denyNonFastForwards
opsi 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, dengangit push origin :master; git push origin master:master
. Namun,denyNonFastForwards
opsi 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 revert
untuk menghasilkan komit yang akan membatalkan perubahan komit sebelumnya.sumber
+develop
perintahnya - jadi cek diberikan kepadanya.git push --force
receive.denyNonFastForwards
opsi 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, dengangit push origin :remote_A; git push origin local_A:remote_A
. Tapi baca apa yang saya tulis di atas tentang mengapa itu ide yang buruk untuk melakukan alur kerja semacam ini pada repositori bersama. Anda harus mencoba melakukan ini hanya jika Anda memiliki sesuatu yang menyebabkan masalah serius dalam commit yang Anda coba singkirkan atau tulis ulang.Anda mungkin harus melakukan
git pull
, yang DAPAT menggabungkan barang secara otomatis untuk Anda. Kemudian Anda dapat berkomitmen lagi. Jika Anda mengalami konflik, itu akan meminta Anda untuk menyelesaikannya.Perlu diingat, Anda harus menentukan cabang mana yang akan ditarik jika Anda belum memperbarui gitconfig untuk menentukan ...
Sebagai contoh:
sumber
! [rejected] develop -> develop (non-fast-forward)
git push origin develop
)Saya menggunakan EGit dan saya menghadapi masalah ini juga. Baru saja mencoba ke
rebase
cabang saat ini dan Berhasil.sumber