git rebase конфликт слияния

91

Я создал репозиторий на github и работал над репозиторием на github.
Я сделал запросы на включение, и они были выполнены.

После этого в восходящем потоке было еще несколько коммитов, поэтому теперь я хочу выполнить перебазирование, я думаю, это то, что мне нужно сделать.
Но я получаю эти конфликты слияния:

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".

Я не знаю, как это исправить, пожалуйста, помогите.

пахнин
источник
Взгляните на мой ответ в этом сообщении: stackoverflow.com/questions/48307297/…
Абхишек

Ответы:

121

Ребазинг может стать настоящей головной болью. Вы должны разрешить конфликты слияния и продолжить перебазирование. Например, вы можете использовать инструмент слияния (который отличается в зависимости от ваших настроек)

git mergetool

Затем добавьте свои изменения и продолжайте

git rebase --continue

Удачи

iltempo
источник
2
да, ребазинг - это головная боль, могу ли я использовать git pull upstream master?
pahnin
2
Да, вы можете попробовать это. Разница в том, что тогда ваши коммиты не накладываются поверх коммитов из апстрима. Потенциально меньше конфликтов слияния.
iltempo
7
@iitempo Вам не нужно делать коммит. Достаточно просто git add, чтобы продолжить перебазирование.
enigmaticPhysicist
45

Если во время перебазирования возник конфликт, у вас есть три варианта:

  • Вы можете запустить, git rebase --abortчтобы полностью отменить перебазирование. Git вернет вас в состояние вашей ветки, которое было до вызова git rebase.

  • Вы можете запустить, git rebase --skipчтобы полностью пропустить фиксацию. Это означает, что никакие изменения, внесенные проблемной фиксацией, не будут включены. Вы очень редко выбираете этот вариант.

  • Вы можете исправить конфликт, как сказал iltempo. Когда вы закончите, вам нужно будет позвонить git rebase --continue. Мой mergetool - kdiff3, но есть еще много других, которые вы можете использовать для разрешения конфликтов. Вам нужно только установить инструмент слияния в настройках git, чтобы его можно было вызывать при вызове git mergetool https://git-scm.com/docs/git-mergetool

Если ничего из вышеперечисленного у вас не работает, то прогуляйтесь и попробуйте еще раз :)

Юга Буга
источник
2
Да, но как исправить конфликт? вот в чем вопрос. Что находится между «исправить конфликт» и «когда вы закончите»
KansaiRobot
@KansaiRobot Один из вариантов ручного исправления: откройте конфликтующий файл в текстовом редакторе и найдите<<<<<
spinup
16

Если у вас много коммитов, которые нужно перебазировать, и какая-то их часть дает конфликты, это действительно больно. Но я могу предложить менее известный подход, как «раздавить все конфликты».

Сначала проверьте временную ветку и начните стандартное слияние

git checkout -b temp
git merge origin/master

Вам придется разрешать конфликты, но только один раз и только реальные. Затем подготовьте все файлы и завершите слияние.

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

Затем вернитесь в свою ветку (пусть она будет альфа ) и начните перебазирование, но с автоматическим разрешением любых конфликтов.

git checkout alpha
git rebase origin/master -X theirs

Ветка была перебазирована, но, вероятно, проект находится в недопустимом состоянии. Это нормально, у нас есть последний шаг. Нам просто нужно восстановить состояние проекта, так что оно будет точно как на ветке temp. Технически нам просто нужно скопировать его дерево (состояние папки) с помощью низкоуровневой команды git commit-tree . Плюс слияние с текущей веткой только что созданного коммита.

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

И удалите временную ветку

git branch -D temp

Вот и все. Мы сделали ребаз через скрытое слияние.

Также я написал сценарий, так что это можно сделать в диалоговом режиме, вы можете найти его здесь .

Baur
источник
13

Примечание: с Git 2.14.x / 2.15 (3 квартал 2017) git rebaseсообщение в случае конфликтов будет более четким.

См. Commit 5fdacc1 (16 июля 2017 г.) Уильяма Дюкло ( williamdclt) .
(Объединено Junio ​​C Hamano - gitster- в коммите 076eeec , 11 августа 2017 г.)

rebase: сделать сообщение о разрешении более понятным для неопытных пользователей

Перед:

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"

После:

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 можно улучшить, отправив сообщения об ошибках тем, кому они помогают: неопытным и случайным пользователям git.
С этой целью полезно убедиться, что термины, используемые в этих сообщениях, понятны этому сегменту пользователей и что они помогут им решить проблему.

В частности, неспособность применить патч во время git rebase - распространенная проблема, которая может дестабилизировать неопытного пользователя.
Важно привести их к разрешению конфликта (что представляет собой трехэтапный процесс, поэтому он сложен) и убедить их, что они могут избежать ситуации, с которой они не могут справиться " --abort".
Этот коммит отвечает на эти два момента, подробно описывая процесс разрешения и избегая загадочного git linguo.

VonC
источник
1
Ницца! На странице справки говорится о разрешении конфликта путем принятия изменения, но нет! Здесь нам нужно пропустить фиксацию и вместо этого просто продолжить слияние! (страница справки: help.github.com/articles/… )
Джертер