LINUX.ORG.RU

Получение pull-реквеста в Git. Почему на GitHub показывает 5 файлов с конфликтами, а при слиянии надо обработать over 30 файлов?

 , ,


0

1

Имеется репозитарий https://github.com/xintrea/mytetra_dev, рабочая ветка experimental. Перед работой все засинхронизировано на ветке experimental в обе стороны (т. е. сделаны push и pull).

Мне нужно принять pull-реквест:

https://github.com/xintrea/mytetra_dev/pull/95

У него имеются конфликты, которые можно посмотреть при нажатии на кнопку «Resolve conflict» на странице:

https://github.com/xintrea/mytetra_dev/pull/95/conflicts

(видимо, эти данные по конфликтам видны только владельцу репозитария). В любом случае, конфликты несложные, и их всего 5 штук, как показывает GitHub:

Conflicting files
app/bin/mytetra.qrc
app/src/libraries/ShortcutManager.cpp
app/src/libraries/wyedit/EditorConfig.cpp
app/src/libraries/wyedit/EditorConfig.h
app/src/libraries/wyedit/EditorToolBar.h

Для принятия изменений в этом Pull-реквесте, GitHub предлагает выполнить команды, которые создадут новую ветку, и в нее принять изменения из pull-реквеста:
git checkout -b DikBSD-formatStrike experimental
git pull https://github.com/DikBSD/mytetra_dev.git formatStrike

Я рассчитывал на то, что нужно будет разрулить конфликты в 5 файлах, и pull-реквест нормально примется. Однако сразу получил непонятку при выполнении «git pull ...»:
remote: Enumerating objects: 18, done.
remote: Counting objects: 100% (18/18), done.
remote: Total 21 (delta 18), reused 18 (delta 18), pack-reused 3
Распаковка объектов: 100% (21/21), готово.
Из https://github.com/DikBSD/mytetra_dev
 * branch              formatStrike -> FETCH_HEAD
Сначала перематываем указатель текущего коммита, чтобы применить ваши изменения поверх него…
Применение: Улучшено форматирование выделенного текста, как Code.
Применение: Сделана вставка горизонтальной линии в "пустой" абзац, где расположен
Использую индекс для реконструкции базового дерева…
M       app/bin/mytetra.qrc
M       app/src/libraries/ShortcutManager.cpp
M       app/src/libraries/wyedit/Editor.cpp
M       app/src/libraries/wyedit/EditorConfig.cpp
M       app/src/libraries/wyedit/EditorConfig.h
M       app/src/libraries/wyedit/EditorToolBar.cpp
M       app/src/libraries/wyedit/EditorToolBar.h
M       app/src/libraries/wyedit/formatters/TypefaceFormatter.cpp
M       app/src/libraries/wyedit/formatters/TypefaceFormatter.h
Откат к применению изменений к базовому коммиту с помощью трехходового слияния…                                    
Автослияние app/src/libraries/wyedit/formatters/TypefaceFormatter.h                                                
Автослияние app/src/libraries/wyedit/formatters/TypefaceFormatter.cpp                                              
КОНФЛИКТ (содержимое): Конфликт слияния в app/src/libraries/wyedit/formatters/TypefaceFormatter.cpp
...

Стоп, что это за файл «TypefaceFormatter.cpp»? В списке обещанных конфликтующих файлов его нет. Ну ладно, разрулил в нем, потом пошли обещанные файлы, а потом пошли опять файлы, в которых конфликты не обещались, я поначалу их разруливал и делал «git add . ; git rebase --continue», потом уже забил и стал писать «git rebase --skip», чтоб посмотреть что получится. В конечном итоге получил странное состояние репозитария, в котором сплошняком более ранние изменения встроены позже более поздних, причем от одного и того же пользователя (меня), кароче какой-то бред. Портянка лога слияния вот такая:

https://pastebin.com/t3zYgU2g

А состояние репозитария после слияния выглядит так:

http://i.piccy.info/i9/c5a5c040be42a4493bf7d7df17f5b0f4/1547029178/237701/129...

Видно, что коммиты даже от одного пользователя Sergey выстроены далеко не в хронологическом порядке. Почему так?

При этом, если сравнить состояние конца ветки experimental и конца ветки DikBSD-formatStrike, то оно _походит_ на то, что принялись правильные изменения. Но тут я не могу быть абсолютно точным, потому что начал скипать странные изменения, о которых написано выше, начиная с момента, когда мне показалось что все заявленные конфликты я разрешил.

В общем, вопрос в том, как более проще и надежно слить изменения этого pull-реквеста, и не получить вот такое странное поведение git? Пока что могу просто повторить изменения у коде вручную, не принимая Pull-реквест. Но это же не вариант, если есть инструмент Git, который призван делать именно эту работу.

★★★★★

По ссылкам не ходил, но звучит, будто кто-то увлёкся рибейзом не понимая как и для чего.

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

В худшем случае, можно попробовать утащить интересные изменения с помощью cherry-pick.

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

По ссылкам не ходил, но звучит, будто кто-то увлёкся рибейзом не понимая как и для чего.

Я и не хотел делать rebase, но сам git говорит, что нужно делать rebase:

Когда вы разрешите этот конфликт, запустите «git rebase --continue».
Если вы хотите пропустить этот патч, то запустите «git rebase --skip».
Чтобы перейти на оригинальную ветку и остановить перемещение, запустите «git rebase --abort».

Вот и пришлось делать так. А можно было по-другому? Как? Я сделаю заново на новой ветке.

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

Тут просто я долго пилил одну фичу, и не принимал pull-реквесты контрибутора. Когда фичу допилил, стал вливать то что понаделал контрибутор.

В худшем случае, можно попробовать утащить интересные изменения с помощью cherry-pick.

Что имеется в виду?

Xintrea ★★★★★ ()

все засинхронизировано на ветке experimental в обе стороны

Это не тот experimental, на котором стоит PR.

git pull --no-rebase https://github.com/DikBSD/mytetra_dev.git formatStrike

может дать нужное поведение. Какого-то чёрта rebase включен на git pull (в конфигурации git видимо).

xaizek ★★★★★ ()
Ответ на: комментарий от Xintrea

Эмм, у тебя видимо локальные настройки git'a не дефолтные.

Попробуй для начала:

git pull --no-rebase origin <branch>

FF не будет, т.к. есть конфликты, поправишь конфликты и выполнишь git add и git commit.

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

Тут просто я долго пилил одну фичу, и не принимал pull-реквесты контрибутора. Когда фичу допилил, стал вливать то что понаделал контрибутор.

Без разницы - попроси его засинкаться с мастером, может он и git умеет пользоваться ловчее тебя :) Аргументировать можно просто - я боюсь сломать твой набор изменений.

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

Да, у меня в конфиге гита прописано:

[pull]
    rebase = true

Ума не приложу, в какой момент эта настройка появилась.

Убрал эту настройку, щас попробую еще раз.

Xintrea ★★★★★ ()
Ответ на: комментарий от onhydro

Без разницы - попроси его засинкаться с мастером, может он и git умеет пользоваться ловчее тебя :) Аргументировать можно просто - я боюсь сломать твой набор изменений.

Да не, он походу так же как и я только учится. Таких пулл-реквестов понаделал, которые друг с другом конфликтуют, сам об этом же и пишет https://github.com/xintrea/mytetra_dev/pull/93#issuecomment-441433641

После того как убрал из настроек «rebase=true», слияние заработало как надо.

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

Ну, удачного вам тогда осиляния жита:) Рибейс я бы оставил на сладкое, и в contribution.md прописал бы большими буквами «не рибейзить».

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