Git rebase: konflik terus menghalangi kemajuan

120

Saya memiliki cabang git (disebut v4), yang dibuat dari master kemarin. Ada beberapa perubahan untuk master, yang saya ingin masuk ke v4. Jadi, di v4, saya mencoba melakukan rebase dari master, dan satu file terus mengacaukan: file teks satu baris, yang berisi nomor versi. File ini app/views/common/version.txt, yang sebelum rebasing berisi teks ini:

v1.4-alpha-02

Inilah yang saya lakukan:

> git rebase master
First, rewinding head to replay your work on top of it...
Applying: new version, new branch
error: patch failed: app/views/common/version.txt:1
error: app/views/common/version.txt: patch does not apply
Using index info to reconstruct a base tree...
Falling back to patching base and 3-way merge...
Auto-merging app/views/common/version.txt
CONFLICT (content): Merge conflict in app/views/common/version.txt
Failed to merge in the changes.
Patch failed at 0001 new version, new branch

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

The version.txtsekarang terlihat seperti ini:

<<<<<<< HEAD:app/views/common/version.txt
v1.4-alpha-02
=======
v1.4-alpha-01
>>>>>>> new version, new branch:app/views/common/version.txt

Jadi, saya merapikannya dan terlihat seperti ini sekarang:

v1.4-alpha-02

dan kemudian saya mencoba untuk melanjutkan: pada awalnya saya mencoba melakukan:

> git commit -a -m "merged"
# Not currently on any branch.
nothing to commit (working directory clean)

Tidak beruntung disana. Jadi, saya mencoba menambahkan file:

git add app/views/common/version.txt

Tidak ada respon. Tidak ada berita adalah kabar baik, saya rasa. Jadi, saya mencoba melanjutkan:

> git rebase --continue
Applying: new version, new branch
No changes - did you forget to use 'git add'?

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

Pada titik inilah, setelah berputar-putar dengan ini, saya membenturkan kepala saya dari meja.

Apa yang terjadi di sini? Apa yang saya lakukan salah? Adakah yang bisa meluruskan saya?

EDIT - untuk unutbu

Saya mengubah file seperti yang Anda sarankan dan mendapatkan kesalahan yang sama:

> git rebase master
First, rewinding head to replay your work on top of it...
Applying: new version, new branch
error: patch failed: app/views/common/version.txt:1
error: app/views/common/version.txt: patch does not apply
Using index info to reconstruct a base tree...
Falling back to patching base and 3-way merge...
Auto-merging app/views/common/version.txt
CONFLICT (content): Merge conflict in app/views/common/version.txt
Failed to merge in the changes.
Patch failed at 0001 new version, new branch

When you have resolved this problem run "git rebase --continue".
If you would prefer to skip this patch, instead run "git rebase --skip".
To restore the original branch and stop rebasing run "git rebase --abort".
Max Williams
sumber
10
terima kasih telah mengajukan pertanyaan ini .. saya menghadapi masalah yang sama persis
Archan Mishra
6
akan lebih baik jika Anda mengkonfirmasi beberapa jawaban
holms
3
@MaxWilliams, saya pikir Anda (seperti saya) telah salah mengartikan saran @unutbu : 1) pertama-tama Anda menjalankan git rebase master dan membiarkannya gagal ; 2) kemudian Anda mengedit version.txtdan membuatnya sebagaimana mestinya pada titik itu, dan menyimpan hasil edit; 3) lalu Anda git add .../version.txt; 4) maka Anda lakukan git rebase --continue( bukan 'berkomitmen' )! Jika rebase --continueberhasil di sini, itu sudah dilakukan (tidak perlu di git commitsini!) - jadi yang perlu dilakukan hanyalah git push(jika Anda menggunakan repo jarak jauh). Semoga ini bisa membantu, jika saya melakukannya dengan benar :)- selamat!
sdaau
@MaxWiams, apakah Anda pernah mendapatkan jawaban untuk ini: ruby-forum.com/topic/187288 (Saya akan segera menghapus ini setelah balasan jika orang lain tidak sampai di sana lebih dulu !!)
atw

Jawaban:

102

Saya mengalami masalah serupa dengan rebase. Masalah saya disebabkan karena salah satu komit saya hanya mengubah file, dan ketika menyelesaikan, saya membuang perubahan yang diperkenalkan dalam komit ini. Saya dapat memecahkan masalah saya dengan melewatkan commit ( git rebase --skip) yang sesuai .

Anda dapat mereproduksi masalah ini dalam repositori pengujian. Pertama buat repositori.

$ mkdir failing-merge
$ cd failing-merge
$ git init
Initialized empty Git repository in $HOME/failing-merge/.git/

Kemudian lakukan konten asli version.txtdalam master.

$ echo v1.4-alpha-02 > version.txt
$ git add version.txt
$ git commit -m initial
[master (root-commit) 2eef0a5] initial
 1 files changed, 1 insertions(+), 0 deletions(-)
 create mode 100644 version.txt

Buat v4cabang dan ubah konten version.txt.

$ git checkout -b v4
Switched to a new branch 'v4'
$ echo v1.4-alpha-03 > version.txt
$ git add version.txt
$ git commit -m v4
[v4 1ef8c9b] v4
 1 files changed, 1 insertions(+), 1 deletions(-)

Kembali ke masterdan ubah konten version.txtsehingga akan ada konflik selama rebase.

$ git checkout master
Switched to branch 'master'
$ echo v1.4-alpha-04 > version.txt
$ git add version.txt
$ git commit -m master
[master 7313eb3] master
 1 files changed, 1 insertions(+), 1 deletions(-)

Beralih kembali ke v4cabang dan coba rebase. Gagal dengan konflik version.txtseperti yang direncanakan.

$ git checkout v4
Switched to branch 'v4'
$ git rebase master
First, rewinding head to replay your work on top of it...
Applying: v4
Using index info to reconstruct a base tree...
Falling back to patching base and 3-way merge...
Auto-merging version.txt
CONFLICT (content): Merge conflict in version.txt
Recorded preimage for 'version.txt'
Failed to merge in the changes.
Patch failed at 0001 v4

When you have resolved this problem run "git rebase --continue".
If you would prefer to skip this patch, instead run "git rebase --skip".
To restore the original branch and stop rebasing run "git rebase --abort".
$ cat version.txt
<<<<<<< HEAD
v1.4-alpha-04
=======
v1.4-alpha-03
>>>>>>> v4

Kami menyelesaikan konflik dengan memilih masterkonten dari version.txt. Kami menambahkan file dan mencoba melanjutkan rebase kami.

$ echo v1.4-alpha-04 > version.txt
$ git add version.txt
$ git rebase --continue 
Applying: v4
No changes - did you forget to use 'git add'?
If there is nothing left to stage, chances are that something else
already introduced the same changes; you might want to skip this patch.

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

Gagal! Mari kita lihat perubahan apa yang gitada di repositori kita.

$ git status
# Not currently on any branch.
nothing to commit (working directory clean)

Ah ah, tidak ada perubahan. Jika Anda membaca secara rinci pesan kesalahan sebelumnya, gitberi tahu kami tentang ini dan direkomendasikan untuk digunakan git rebase --skip. Dia mengatakan kepada kami, "Jika tidak ada yang tersisa ke tahap, kemungkinan besar sesuatu yang lain telah memperkenalkan perubahan yang sama; Anda mungkin ingin melewati tambalan ini." Jadi kita melewatkan komit dan rebase berhasil.

$ git rebase --skip
HEAD is now at 7313eb3 master

Perhatian : Harap dicatat bahwa git rebase --skipakan benar-benar membatalkan komit yang gitmencoba melakukan rebase. Dalam kasus kami, ini seharusnya baik-baik saja karena gitmengeluh ini adalah komit kosong. Jika Anda merasa kehilangan perubahan setelah rebase selesai, Anda dapat menggunakan git refloguntuk mendapatkan ID komit dari repositori Anda sebelum rebase, dan gunakan git reset --harduntuk mengembalikan depot Anda ke status itu (ini adalah operasi destruktif lainnya).

Sylvain Defresne
sumber
4
Terima kasih telah meluangkan waktu untuk menulis penjelasan panjang lebar itu, Sylvain! Itu membuatnya lebih jelas. Saya pikir saya selalu gugup melewatkan tambalan karena rasanya pekerjaan bisa hilang: yaitu tambalan melibatkan semua file yang terpengaruh oleh rebase, bukan hanya yang memiliki konflik. Apakah tambalan hanya satu gabungan pada satu file?
Max Williams
3
Tidak, tambalan berisi semua perbedaan pada semua file yang dimodifikasi dalam satu komit. Namun saat menggunakan git rebase --skip, Anda hanya melewatkan satu komit. Saya biasanya mengeluarkan git statussebelum melewatkan komit untuk melihat apakah saya dalam situasi ini.
Sylvain Defresne
1
Saya hanya ingin menggemakan Max dalam mengucapkan terima kasih karena telah meluangkan waktu untuk menulis penjelasan yang bagus — saya akhirnya mengerti mengapa ini terjadi. Saya juga tidak lagi takut rebase --skip:).
Ben Dolman
1
Peringatan - jika Anda memiliki beberapa perubahan dalam satu komit, Anda mungkin kehilangan pekerjaan saat melakukan git rebase --skip. Saya baru saja melakukannya
Chrissy H
@ChrissyH Kecuali Anda melakukan git reflog purgeatau git reflog deleteAnda masih bisa mendapatkan perubahan Anda kembali dengan menggunakan git reflog. Cobalah untuk memeriksa komit berbeda yang direferensikan di sana, salah satunya harus status pohon Anda sebelum Anda memulai keseluruhan git rebase.
Sylvain Defresne
23

Mengutip dari sini: http://wholemeal.co.nz/node/9

Hah?!? Tidak, saya tidak lupa menggunakan git add, saya melakukannya ... seperti ... 2 detik yang lalu!

Ternyata karena tidak ada perubahan dari tambalan, git mencurigai ada yang tidak beres. Git mengharapkan patch telah diterapkan, tetapi filenya tetap tidak berubah.

Pesan kesalahannya tidak terlalu intuitif, tetapi mengandung jawabannya. Kami hanya perlu memberi tahu rebase untuk melewati tambalan ini. Ini juga tidak perlu memperbaiki penanda konflik di file. Anda akan mendapatkan versi file dari cabang tempat Anda melakukan rebasing.

$ git rebase --skip
Bijou Trouvaille
sumber
Setelah saya menggunakan git mergetool dan memperbaiki perubahan, lalu menambahkannya dan mengkomitnya, saya cukup memasukkan <code> git rebase --skip </code> sementara 'Saat ini tidak ada di cabang mana pun.' Dan semuanya sudah diperbaiki. Terima kasih!
Geerlingguy
Sebenarnya, menurut saya itu adalah kombinasi dari terus menjalankan git mergetool, lalu git rebase --continue, lalu git mergetool, dll. Yang akhirnya memperbaiki situasi saya.
geerlingguy
6

Pesan kesalahan itu adalah hasil dari Anda git commit -a -m "merged". Jika Anda baru saja memperbaiki file, lalu jalankan git add <file>, dan git rebase --continue, seharusnya berfungsi dengan baik. git rebase --continuemencoba melakukan komit, tetapi menemukan bahwa tidak ada perubahan tertunda untuk dilakukan (karena Anda sudah berkomitmen).

twalberg.dll
sumber
1
Ini tampaknya jauh lebih masuk akal daripada melakukan lompatan, setidaknya dalam kasus umum. Saya terkejut itu tidak terdaftar sebagai jawaban terbaik.
EmeraldD.
1
@EmeraldD., Tidak bekerja. Memperbaiki file dan menjalankannya git add <file>tidak akan menyelesaikan masalah. git rebase --continue masih melaporkanNo changes - did you forget to use 'git add'?
Pacerier
6

Ubah app / views / common / version.txt menjadi

v1.4-alpha-01

Pada titik ini di rebase, ingatlah bahwa Anda sedang menyelesaikan konflik penggabungan untuk menunjukkan perkembangan cabang non-master .

Jadi, di rebasing dari

      A---B---C topic
     /
D---E---F---G master

untuk

              A*--B*--C* topic
             /
D---E---F---G master

konflik yang Anda selesaikan adalah cara membuat A * pada cabang topik.

Jadi setelah melakukan git rebase --abort, perintahnya harus

git checkout topic
git rebase master
< make edits to resolve conflicts >
git add .
git rebase --continue
unutbu
sumber
3
Terima kasih unutbu, saya mencobanya tetapi tidak berhasil: lihat OP untuk edit baru. tepuk tangan
Max Williams
4

Perilaku yang Anda lihat bukanlah yang saya harapkan dari sebuah rebase tipikal hanya dengan konflik ini. Pertimbangkan untuk menggunakan cabang terpisah untuk melakukan rebase ini (terutama jika Anda telah mendorong komit dari jarak jauh sehingga Anda melakukan percepatan). Juga, git mergetooldapat membantu untuk menyelesaikan konflik dan mengingat untuk mengeluarkan a git add.

Dalam contoh minimal ini, rebase berfungsi seperti yang diharapkan. Dapatkah Anda memberikan contoh yang menunjukkan perilaku yang Anda lihat?

#!/bin/bash

cd /tmp
mkdir rebasetest
cd rebasetest
git init
echo 'v1.0' > version.txt
git add version.txt
git commit -m 'initial commit'
git checkout -b v4
echo 'v1.4-alpha-01' > version.txt
git add version.txt
git commit -m 'created v4'
git checkout master
git merge v4
echo 'v1.4-alpha-01-rc1' > version.txt
git add version.txt
git commit -m 'upped version on master to v1.4-alpha-01-rc1'
git checkout v4
echo 'v1.4-alpha-02' > version.txt
git add version.txt
git commit -m 'starting work on alpha-02'

git rebase master
echo 'v1.4-alpha-02' > version.txt
git add version.txt
git rebase --continue
Ben Taitelbaum
sumber
4

Berikut beberapa ide:

Adam Monsen
sumber