git rebase menggabungkan konflik

91

Saya membuat garpu repo github dan mengerjakan repo github saya.
Saya telah membuat permintaan tarik dan itu selesai.

Setelah itu upstream memiliki beberapa komitmen lagi jadi sekarang saya ingin rebase, saya rasa itulah yang harus saya lakukan.
Tapi saya mendapatkan konflik penggabungan ini:

First, rewinding head to replay your work on top of it...
Applying: Issue 135 homepage refresh
Using index info to reconstruct a base tree...
<stdin>:17: trailing whitespace.
      %h4 
warning: 1 line adds whitespace errors.
Falling back to patching base and 3-way merge...
Auto-merging app/views/layouts/application.html.haml
CONFLICT (content): Merge conflict in app/views/layouts/application.html.haml
Auto-merging app/views/home/index.html.haml
CONFLICT (content): Merge conflict in app/views/home/index.html.haml
Auto-merging app/views/home/_group_projects.html.haml
CONFLICT (content): Merge conflict in app/views/home/_group_projects.html.haml
Failed to merge in the changes.
Patch failed at 0001 Issue 135 homepage refresh

When you have resolved this problem run "git rebase --continue".
If you would prefer to skip this patch, instead run "git rebase --skip".
To check out the original branch and stop rebasing run "git rebase --abort".

Saya tidak tahu cara memperbaikinya, tolong bantu.

pahnin
sumber
Lihat jawaban saya di posting ini: stackoverflow.com/questions/48307297/…
Abhishek

Jawaban:

122

Rebasing bisa sangat memusingkan. Anda harus menyelesaikan konflik penggabungan dan melanjutkan rebasing. Misalnya Anda dapat menggunakan alat penggabung (yang berbeda tergantung pada pengaturan Anda)

git mergetool

Kemudian tambahkan perubahan Anda dan lanjutkan

git rebase --continue

Semoga berhasil

iltempo
sumber
2
ya rebasing sakit kepala, dapatkah saya menggunakan git pull upstream master?
pahnin
2
Ya, Anda bisa mencobanya. Perbedaannya adalah bahwa komitmen Anda tidak ditempatkan di atas komitmen dari hulu. Kemungkinan konflik penggabungan lebih sedikit.
iltempo
7
@iitempo Anda tidak perlu melakukan komit. Hanya menambahkan git sudah cukup untuk memungkinkan rebase untuk melanjutkan.
enigmaticPhysicist
46

Ketika Anda mengalami konflik selama rebase, Anda memiliki tiga opsi:

  • Anda dapat menjalankan git rebase --abortuntuk sepenuhnya membatalkan rebase tersebut. Git akan mengembalikan Anda ke status cabang Anda seperti sebelum git rebase dipanggil.

  • Anda dapat menjalankan git rebase --skipuntuk melewati komit sepenuhnya. Itu berarti bahwa tidak ada perubahan yang diperkenalkan oleh komit bermasalah yang akan disertakan. Sangat jarang Anda memilih opsi ini.

  • Anda dapat memperbaiki konflik seperti yang dikatakan iltempo. Setelah selesai, Anda perlu menelepon git rebase --continue. Mergetool saya adalah kdiff3 tetapi masih banyak lagi yang dapat Anda gunakan untuk menyelesaikan konflik. Anda hanya perlu menyetel alat penggabung Anda di pengaturan git sehingga dapat dipanggil saat Anda memanggil git mergetool https://git-scm.com/docs/git-mergetool

Jika tidak ada satu pun cara di atas yang berhasil untuk Anda, jalan-jalan dan coba lagi :)

Uga Buga
sumber
2
Ya, tapi bagaimana cara memperbaiki konflik tersebut? Itulah pertanyaannya. Apa antara "perbaiki konflik" dan "setelah Anda selesai"
KansaiRobot
@KansaiRobot Satu opsi untuk menyelesaikan perbaikan manual: buka file yang konflik di editor teks, dan cari<<<<<
spinup
16

Jika Anda memiliki banyak komitmen untuk rebase, dan beberapa di antaranya menimbulkan konflik, itu sangat menyakitkan. Tetapi saya dapat menyarankan pendekatan yang kurang dikenal bagaimana "menghentikan semua konflik".

Pertama, periksa cabang sementara dan mulai penggabungan standar

git checkout -b temp
git merge origin/master

Anda harus menyelesaikan konflik, tetapi hanya sekali dan hanya konflik yang nyata. Kemudian atur semua file dan selesaikan penggabungan.

git commit -m "Merge branch 'origin/master' into 'temp'"

Kemudian kembali ke cabang Anda (biarkan menjadi alfa ) dan mulai rebase, tetapi dengan menyelesaikan konflik apa pun secara otomatis.

git checkout alpha
git rebase origin/master -X theirs

Branch telah di-rebased, tetapi project mungkin dalam status tidak valid. Tidak apa-apa, kita punya satu langkah terakhir. Kita hanya perlu mengembalikan status proyek, jadi akan persis seperti pada 'temp' cabang. Secara teknis kita hanya perlu menyalin pohonnya (status folder) melalui perintah tingkat rendah git commit-tree . Ditambah penggabungan ke cabang saat ini baru saja membuat komit.

git merge --ff $(git commit-tree temp^{tree} -m "Fix after rebase" -p HEAD)

Dan hapus cabang sementara

git branch -D temp

Itu saja. Kami melakukan rebase melalui gabungan tersembunyi.

Saya juga menulis skrip, sehingga bisa dilakukan dengan cara dialog, Anda bisa menemukannya di sini .

baur
sumber
13

Catatan: dengan Git 2.14.x / 2.15 (Q3 2017), git rebasepesan jika terjadi konflik akan lebih jelas.

Lihat commit 5fdacc1 (16 Jul 2017) oleh William Duclot ( williamdclt) .
(Digabung oleh Junio ​​C Hamano - gitster- di commit 076eeec , 11 Aug 2017)

rebase: buat penyelesaian pesan lebih jelas untuk pengguna yang tidak berpengalaman

Sebelum:

When you have resolved this problem, run "git rebase --continue".
If you prefer to skip this patch, run "git rebase --skip" instead.
To check out the original branch and stop rebasing, run "git rebase --abort"

Setelah:

Resolve all conflicts manually, 
mark them as resolved with git add/rm <conflicted_files>
then run "git rebase --continue".

You can instead skip this commit: run "git rebase --skip".
To abort and get back to the state before "git rebase", run "git rebase --abort".')

Git UI dapat ditingkatkan dengan menangani pesan kesalahan yang mereka bantu: pengguna git yang tidak berpengalaman dan biasa.
Untuk maksud ini, sebaiknya pastikan istilah yang digunakan dalam pesan tersebut dapat dipahami oleh segmen pengguna ini, dan bahwa istilah tersebut memandu mereka untuk menyelesaikan masalah.

Secara khusus, kegagalan untuk menerapkan tambalan selama git rebase adalah masalah umum yang dapat sangat mengganggu kestabilan bagi pengguna yang tidak berpengalaman.
Penting untuk membimbing mereka menuju penyelesaian konflik (yang merupakan proses 3 langkah, sehingga rumit) dan meyakinkan mereka bahwa mereka dapat melarikan diri dari situasi yang tidak dapat mereka tangani " --abort".
Komit ini menjawab dua poin tersebut dengan merinci proses resolusi dan dengan menghindari git linguo yang samar.

VonC
sumber
1
Bagus! Halaman bantuan mengatakan untuk menyelesaikan konflik dengan melakukan perubahan, tapi tidak! Di sini kita perlu melewati komit dan hanya melanjutkan penggabungan sebagai gantinya! (halaman bantuan: help.github.com/articles/… )
Jerther