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 'git@github.com: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?

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.


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

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.


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

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 

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

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.


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.