конфлікт злиття 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/…
Абхішек

Відповіді:


122

Перебазування може бути справжнім головним болем. Ви повинні вирішити конфлікти злиття та продовжувати перебазування. Наприклад, ви можете використовувати інструмент злиття (який відрізняється залежно від ваших налаштувань)

git mergetool

Потім додайте зміни і продовжуйте

git rebase --continue

Удачі


2
так, перебазування - це головний біль, чи можу я використовувати git pull upstream master?
pahnin

2
Так, ви можете спробувати це. Різниця полягає в тому, що ваші комітети тоді не ставляться поверх тих, що виходять за течією. Потенційно конфліктів злиття менше.
iltempo

7
@iitempo Вам не потрібно робити коміт. Досить лише git add, щоб продовжити перебазування.
enigmaticPhysicist

46

Коли у вас виникає конфлікт під час перебазування, у вас є три варіанти:

  • Ви можете запустити, 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

Це все. Ми зробили перебазування через приховане злиття.

Також я написав сценарій, так що це можна зробити у діалоговому порядку, ви можете знайти його тут .


13

Примітка: з Git 2.14.x / 2.15 (Q3 2017), git rebaseповідомлення у разі конфліктів буде чіткішим.

Див. Коміт 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 є типовою проблемою, яка може бути дуже дестабілізуючою для недосвідченого користувача.
Важливо підвести їх до вирішення конфлікту (що є триступеневим, таким чином складним процесом) і запевнити, що вони можуть уникнути ситуації, з якою не можуть впоратися з " --abort".
Цей коміт відповідає на ці два моменти, детально описуючи процес вирішення та уникаючи загадкового git linguo.


1
Приємно! На довідковій сторінці сказано вирішити конфлікт шляхом внесення змін, але ні! Тут нам потрібно пропустити коміт і замість цього просто продовжити злиття! (сторінка довідки: help.github.com/articles/… )
Джертер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.