Apa yang dimaksud dengan “Pembaruan non-fast-forward Git push ditolak”?

153

Saya menggunakan Git untuk mengelola dua komputer dan pengembangan saya. Saya mencoba melakukan perubahan pada GitHub dan saya mendapatkan kesalahan.

Gagal mendorong beberapa referensi ke <repo>. Untuk mencegah Anda kehilangan riwayat, pembaruan non-maju ditolak. Gabungkan perubahan jarak jauh sebelum mendorong lagi.

Apa yang menyebabkan ini dan bagaimana saya bisa memperbaikinya?

EDIT:

Menarik repo mengembalikan yang berikut:

* branch master-> master (non-fast-forward) Sudah up-to-date

Mendorong masih memberi saya kesalahan yang disebutkan di atas.

Moshe
sumber

Jawaban:

136

GitHub memiliki bagian yang bagus yang disebut " Berurusan dengan kesalahan " non-fast-forward "

Kesalahan ini bisa agak berlebihan pada awalnya, jangan takut.
Sederhananya, git tidak dapat membuat perubahan pada remote tanpa kehilangan komit, sehingga ia menolak dorongan .
Biasanya ini disebabkan oleh pengguna lain yang mendorong ke cabang yang sama. Anda dapat memperbaiki ini dengan mengambil dan menggabungkan cabang jarak jauh, atau menggunakan tarikan untuk melakukan keduanya sekaligus.

Dalam kasus lain kesalahan ini adalah hasil dari perubahan destruktif yang dibuat secara lokal dengan menggunakan perintah like git commit --amendatau git rebase.
Meskipun Anda dapat mengganti remote dengan menambahkan --forceke pushperintah, Anda hanya harus melakukannya jika Anda benar-benar yakin ini adalah apa yang ingin Anda lakukan.
Memaksa paksa dapat menyebabkan masalah bagi pengguna lain yang telah mengambil cabang jarak jauh, dan dianggap sebagai praktik yang buruk. Jika ragu, jangan paksa-dorong .


Git tidak dapat membuat perubahan pada remote seperti penggabungan maju-cepat, yang digambarkan oleh Referensi Visual Git seperti:

teks alternatif

Hal ini tidak persis kasus Anda, tetapi membantu untuk melihat apa yang "cepat-maju" adalah (di mana HEADdari cabang hanya pindah ke yang baru yang lebih baru komit).


" branch master->master (non-fast-forward) Already-up-to-date" Biasanya untuk cabang lokal yang tidak melacak bagian lawan jarak jauh mereka.
Lihat misalnya pertanyaan SO ini " git pull mengatakan yang terbaru tetapi git push menolak maju yang tidak cepat ".
Atau kedua cabang terhubung, tetapi tidak setuju dengan sejarah masing-masing:
Lihat " Cerita GIT yang tidak pernah berakhir - apa yang saya lakukan salah di sini? "

Ini berarti bahwa cabang subversi Anda dan cabang master git jarak jauh Anda tidak menyetujui sesuatu.
Beberapa perubahan didorong / dilakukan untuk satu yang tidak di yang lain.
Nyalakan gitk --all, dan itu akan memberi Anda petunjuk tentang apa yang salah - cari "garpu" dalam sejarah.

VONC
sumber
53

Ini berarti bahwa ada komit lain yang didorong ke repositori jarak jauh yang berbeda dari komit Anda. Anda biasanya dapat menyelesaikan ini dengan a

git pull

sebelum Anda mendorong

Pada akhirnya, "fast-forward" berarti bahwa komit dapat diterapkan langsung di atas pohon kerja tanpa memerlukan penggabungan.

Minichate
sumber
2
Inilah yang bekerja untuk saya! Saya lupa saya mengubah readme.md di situs repositori!
ryanwinchester
14

Pembaruan fast-forward adalah di mana satu-satunya perubahan satu sisi adalah setelah komit terbaru di sisi lain, sehingga tidak perlu ada penggabungan. Ini mengatakan bahwa Anda perlu menggabungkan perubahan sebelum dapat mendorong.

bdukes
sumber
8

Anda mungkin ingin menggunakan kekuatan dengan operasi dorong dalam hal ini

git dorong master asal - memaksa

uspinar
sumber
1
Itu salah. total sumber github akan dihapus dan didorong hanya Anda sumber baru sumber lama dihapus
logeshpalani98
6

Tidak pernah melakukan yang git -fharus dilakukanpush karena hal itu dapat berakibat pada konsekuensi bencana nantinya.

Anda hanya perlu melakukan salah satu git pulldari cabang lokal Anda.

Ex:

git pull origin 'your_local_branch'

dan kemudian lakukan git push

Abhishek Thomas
sumber
0

Anda perlu menggabungkan dan menyelesaikan conflicts locally sebelum Anda mendorong perubahan Anda ke repo / fork jarak jauh.

1) tarik (ambil dan gabungkan)

$ git pull remote branch 

2) Dorong perubahan

$ git push remote branch 

Tetap Anda memiliki pilihan cepat untuk pushsecara paksa dengan menggunakan --forceopsi tetapi harus dihindari karena dapat mengakibatkan perubahan kehilangan atau berdampak buruk pada kontributor lainnya.

Muhammad Soliman
sumber