LINUX.ORG.RU

git merge conflict

 


0

2

Всем привет. Помогите найти выход из ситуации. Есть два последних коммита: C1 (предпоследний), C2 (последний). Захотел изменить предпоследний: $ git rebase --interactive.

Выбрал edit С1. Потом сделал изменения, $git commit --amend, $ git rebase --continue. На что мне выдало:

file.c: needs update You must edit all merge conflicts and then mark them as resolved using git add

Дело в том, что C2-коммит вносит исправления в C1. А я изменил C1.

Как эту ситуацию исправить, и как в таких случаях, на будущее, лучше поступать?

Спасибо заранее.

Deleted

Последнее исправление: Deleted (всего исправлений: 1)

Ты предоставил не всю информацию.

Выбрал edit С1

OK

Потом сделал изменения, $git commit --amend

Ты должен был сделать либо git add ..., либо git commit --amend --all. Сделал?

$ git rebase --continue. На что мне выдало:

file.c: needs update You must edit all merge conflicts and then mark them as resolved using git add

Можешь привести весь вывод команды git rebase --continue?

Дело в том, что C2-коммит вносит исправления в C1. А я изменил C1.

Это нормально. Для этого и нужен git.

Как эту ситуацию исправить, и как в таких случаях, на будущее, лучше поступать?

Исправить эту ситуацию нужно с помощью ручного слияния. Запусти git status, найди там файлы с конфликтами слияния («file.c»), открой в редакторе, найди там маркеры >>>> и <<<< и разрули конфликт руками (вместо предложенных двух вариантов помеченного участка впиши тот, что должен быть в конце концов). Потом сделай git add на отредактированном файле и git rebase --continue.

intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 2)

Для более удобного разрешения конфликтов слияния я рекомендую изменить стиль представления конфликтов:

$ git config --global merge.conflictstyle diff3

После выполнения этой команды при возникновении конфликта в файл будет записываться не два варианта конфликтующего участка (новый 1 и новый 2), а три (новый с одной стороны, старый и новый с другой стороны).

В твоём случае «старый» — это версия до C1 и C2, «новый с одной стороны» (ours, сверху) — это версия после C1' (изменённого тобой в процессе rebase), а «новый с другой стороны» (theirs, снизу) — это версия после C1 и C2.

intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 1)
Ответ на: комментарий от intelfx

Можешь привести весь вывод команды git rebase --continue?

В начале ввел git commit --amend --all, затем git rebase --continue. Вот вывод:

$ git rebase --continue
error: could not apply 9c032e8... file.c: add new options.

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".
Could not apply 9c032e8b5ee0183fc072c88e6b773f6965491ec2... file.c: add new options.
Deleted
()
Ответ на: комментарий от intelfx

Исправить эту ситуацию нужно с помощью ручного слияния. Запусти git status, найди там файлы с конфликтами слияния («file.c»), открой в редакторе, найди там маркеры >>>> и <<<< и разрули конфликт руками (вместо предложенных двух вариантов помеченного участка впиши тот, что должен быть в конце концов).

git status вот что выдаёт:

$ git status
interactive rebase in progress; onto db7c628
Last commands done (2 commands done):
   e c6566a2 file.c: penultimate commit.
   pick 9c032e8 file.c: add new options.
No commands remaining.
You are currently rebasing branch 'master' on 'db7c628'.
  (fix conflicts and then run "git rebase --continue")
  (use "git rebase --skip" to skip this patch)
  (use "git rebase --abort" to check out the original branch)

Unmerged paths:
  (use "git reset HEAD <file>..." to unstage)
  (use "git add <file>..." to mark resolution)

	both modified:   file.c

no changes added to commit (use "git add" and/or "git commit -a")
file.c: add new options — последний коммит.

Deleted
()
Ответ на: комментарий от Deleted

Так и должно быть. Теперь открывай file.c, ищи в нём маркеры и руками разруливай конфликт (т. е. вместо куска, дважды изменённого по-разному, впиши то, что там должно быть в итоге на самом деле).

Потом git add file.c и git rebase --continue.

intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 1)
Ответ на: комментарий от theNamelessOne

Который раз себя убеждал что прочту, а оказывается столько всего надо прочесть, а еще сколько хочется :(

Вот и пользуюсь знаниями сотоварищей. Тем более, что когда сам знаю, и никто не успел помочь - не пройду мимо. Коллективный разум мы.

Deleted
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.