Git ReBase конфликт слияния
Я раздвоил репозиторий на github и работал над своим репозиторием на github.
Я сделал pull-запросы, и это было завершено.
После этого у апстрима было еще несколько коммитов, так что теперь я хочу сделать ребаз, думаю, это то, что я должен сделать.
Но я получаю эти конфликты слияния:
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".
Я не знаю, как это исправить, пожалуйста, помогите.
6 ответов
Перебазировка может быть настоящей головной болью. Вы должны разрешить конфликты слияния и продолжить перебазирование. Например, вы можете использовать инструмент слияния (который зависит от ваших настроек)
git mergetool
Затем добавьте и зафиксируйте ваши изменения и продолжайте
git rebase --continue
Удачи
Если у вас много коммитов, которые нужно перебазировать, и некоторые из них дают конфликты, это действительно больно. Но я могу предложить менее известный подход, как "раздавить все конфликты".
Сначала проверьте временную ветку и начните стандартное слияние
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
Это все. Мы сделали ребаз через скрытое слияние.
Также я написал скрипт, который можно сделать в диалоговом режиме, вы можете найти его здесь.
Примечание: с Git 2.14.x/2.15 (3 квартал 2017 г.) git rebase
Сообщение в случае конфликтов будет более понятным.
Смотрите коммит 5fdacc1 (16 июля 2017 г.) Уильяма Дукло ( williamdclt
)
(Объединено Юнио С Хамано - 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.
Когда у вас возникает конфликт во время ребазинга, у вас есть три варианта:
Вы можете запустить
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
Если ничего из вышеперечисленного не работает для вас, то прогуляйтесь и попробуйте еще раз:)
Если вы не возражаете против объединения в одну большую фиксацию, самый простой способ сделать это
git reset --soft <rebase-target>
из вашей текущей ветки, то
git commit
.
Так, например, вы находитесь в своей ветке, и ваша цель для перебазирования -
origin/master
. Предполагая, что у вас нет неустановленных/рабочих изменений:
# Merge and fix any conflicts from master
git merge origin/master
# Push your changes in case you mess up and want to start over from remote
git push
# Move HEAD to rebase target, leaving all your work staged
git reset --soft origin/master
# Commit staged changes as giant commit
git commit -m "feat(foo): new feature"
# Confirm your changes, run tests, etc. Then force push
git push -f
Вам не нужно беспокоиться о повторении конфликтов слияния, потому что вся разница между вашей веткой и целью перебазирования перемещается в промежуточную область, и все готово к фиксации.
В некоторых слишком сложных случаях с удаленными, переименованными, измененными файлами возможным спасением может быть использование пустой «буферной» фиксации со всеми удаленными файлами. Это дает больше гибкости само по себе, и, кроме того, следующая фиксация после пустой становится более надежной и похожей на снимок.