Bagaimana cara menggabungkan perubahan jarak jauh di GitHub?

137

Saya mendapatkan kesalahan berikut, ketika mencoba push Github pertama:

[rejected] master -> master (non-fast forward)
error: failed to push some refs to '[email protected]:me/me.git'
To prevent you from losing history, non-fast-forward updates were rejected
Merge the remote changes before pushing again.  See the 'non-fast forward'
section of 'git push --help' for details.

bagaimana cara memperbaikinya dan menggabungkan perubahan jarak jauh?

John
sumber

Jawaban:

106

Lihat bagian 'non-fast forward' pada ' git push --help ' untuk detailnya.

Anda dapat melakukan "git pull", menyelesaikan potensi konflik, dan "git push" hasilnya. Sebuah "git pull" akan membuat komit gabungan C antara komit A dan B.

Alternatifnya, Anda dapat mengubah dasar perubahan antara X dan B di atas A, dengan "git pull --rebase", dan mendorong hasilnya kembali. Rebase akan membuat komit D baru yang membangun perubahan antara X dan B di atas A.

Thilo
sumber
16
Saya terus mengalami hal ini kecuali jika saya melakukan "git pull", saya diberi tahu "Sudah up-to-date." dan jika saya melakukan "git pull --rebase", saya diberi tahu bahwa "Master cabang saat ini adalah yang terbaru." Ada ide? Terima kasih!
jwl
3
@ larson4 Saya mendapat masalah yang sama, tetapi setelah Anda melakukan git pull, lakukan commit lain dan selanjutnya akan bagus
Patrick
20
@Patrick @larson Saya mengalami masalah serupa yang disebabkan oleh fakta bahwa saya tidak membaca pesan kesalahan dengan cermat. Penolakan ada di cabang yang tidak saya periksa. Cabang tempat saya sebenarnya berhasil. Solusinya adalah git checkout other-branch; git pull; git push; git checkout branch-i-was-working-on.
Noah Spurrier
86

Anda juga dapat menekan dengan menambahkan simbol + sebelum nama cabang Anda.

git push origin +some_branch
SammyK
sumber
1
Terima kasih, yang ini berhasil untuk saya. Solusi lain akan sepenuhnya menghapus efek sayagit reset --hard
Oli
1
Terima kasih! Saya telah mendorong cabang "A" ke aplikasi pementasan Heroku saya untuk menguji beberapa fungsionalitas dalam lingkungan produksi. Kemudian (secara lokal) saya menggabungkan "A" dan "B" menjadi "master" dan ingin memasukkan "master" ke dalam aplikasi pementasan saya. Mengalami segala macam masalah. Ini membuat mendorong "master" menjadi sangat sederhana. Terima kasih!
Don Leatham
Bekerja untuk saya juga. Butuh waktu 4 jam untuk menemukan masalahnya. Terima kasih banyak. Saya menjalankan Netbeans di mesin lokal (windows 7) dan ingin di setiap push di lokal, periksa di mesin jarak jauh (linux).
Maxim Shoustin
Perhatikan bahwa metode ini mungkin tidak aman, dan dapat menyebabkan beberapa komitmen yang berbeda tidak dapat dijangkau.
samuil
Ini harus menjadi solusi yang diterima. Solusi lain tidak berhasil untuk saya
banarun
20

Anda mungkin memiliki perubahan pada github yang tidak pernah Anda gabungkan. Cobalah git pulluntuk mengambil dan menggabungkan perubahan, maka Anda harus bisa melakukan push. Maaf jika saya salah paham dengan pertanyaan Anda.

Jorge Israel Peña
sumber
18
Jika Anda perlu menolak perubahan di master jarak jauh dan mendorong perubahan Anda sendiri, coba tekan dengan tombol -f
Hotsyk
13

Jika Anda "git pull" dan tertulis "Already up-to-date.", Dan masih mendapatkan error ini, mungkin karena salah satu cabang Anda yang lain tidak up-to-date. Coba beralih ke cabang lain dan pastikan cabang tersebut juga mutakhir sebelum mencoba "git push" lagi:

Beralih ke cabang "foo" dan perbarui:

$ git checkout foo
$ git pull

Anda dapat melihat cabang-cabang yang Anda miliki dengan mengeluarkan perintah:

$ git branch
David Calhoun
sumber
Bisakah Anda menjelaskan mengapa ini berhasil dan perlu? (Itu benar-benar menyelesaikan masalah saya.) Sepertinya itu kontra-intuitif bagi saya. Saya tidak mengerti mengapa git membutuhkan cabang lain untuk diperbarui juga agar saya dapat mendorong cabang master.
Quinxy von Besiex
@QuinxyvonBesiex Saya sendiri tidak yakin saya mengerti. Ini mungkin ada hubungannya dengan struktur dasar Git itu sendiri, dan bagaimana ia mengatur cabang (yang pada dasarnya sama dengan tag sejauh yang saya mengerti).
David Calhoun
7

Anda dapat memaksanya untuk mendorong, tetapi harap lakukan ini HANYA ketika Anda yakin dengan apa yang Anda lakukan.

Perintahnya adalah:

git push -f 
JuLy
sumber
3

Masalah ini juga dapat terjadi jika Anda memiliki tag yang bentrok. Jika versi lokal dan versi jarak jauh Anda menggunakan nama tag yang sama untuk komit yang berbeda, Anda dapat berakhir di sini.

Anda dapat mengatasinya dengan menghapus tag lokal:

$ git tag --delete foo_tag
Zds
sumber
2

Ketika saya mendapatkan kesalahan ini, saya mencadangkan seluruh folder proyek saya. Lalu saya melakukan sesuatu seperti

$ git config branch.master.remote origin
$ git config branch.master.merge refs/heads/master

... tergantung pada nama cabang Anda (jika bukan master).

Lalu aku melakukannya git pull --rebase. Setelah itu, saya mengganti file yang ditarik dengan file proyek cadangan saya. Sekarang saya siap untuk melakukan perubahan saya lagi dan mendorong.

IgorGanapolsky
sumber
0

1) Memaksa tarikan untuk menimpa perubahan lokal

Jika Anda tidak peduli tentang perubahan yang dilakukan secara lokal dan ingin mendapatkan kode dari repositori, Anda dapat memaksa penarikan. Ini akan menimpa semua perubahan lokal yang dilakukan di komputer Anda, salinan duplikat versi di repositori akan muncul.

Jalankan perintah berikut di IDE Anda:

git reset - keras

git pull

Ini akan langsung menghancurkan semua perubahan lokal Anda jadi pastikan Anda tahu apa yang Anda lakukan dan tidak membutuhkan perubahan lokal Anda.

2) Menjaga kedua perubahan (lokal dan dari repo)

Jika Anda ingin menyimpan kedua perubahan (perubahan dilakukan secara lokal dan perubahan ada di repositori), Anda bisa menambahkan dan mengkomit perubahan Anda. Saat Anda menarik, jelas akan ada konflik gabungan. Di sini Anda dapat menggunakan alat bantu di IDE Anda (seperti Difftool dan mergetool) untuk membandingkan dua bagian kode dan menentukan perubahan mana yang harus dipertahankan dan mana yang harus dihapus. Ini adalah jalan tengah; tidak ada perubahan yang akan hilang sampai Anda menghapusnya secara manual.

git tambahkan $ the_file_under_error

git commit

git pull
Preeti Duhan
sumber