#git #conflict #rebase
#git #конфликт #перебазирование
Вопрос:
Что это значит, когда перебазирование git обнаруживает конфликт, но в файле нет явной проблемы? В рассматриваемом файле нет маркеров конфликта и git mergetool
написано «нечего объединять».
У меня есть следующие варианты: сбросить или добавить:
# Unmerged paths:
# (use "git reset HEAD <file>..." to unstage)
# (use "git add/rm <file>..." as appropriate to mark resolution)
#
# both modified: filename.js
Как мне узнать, о чем идет речь и какой путь выбрать?
git ls-files -s filename.js
дает 3 строки:
100644 d2c915b1d632b8ef8fbcf056824fb7fac7824ab9 1 filename.js
100644 9010798f1d19ac712196b1fc9b0870fd332b1275 2 filename.js
100644 b3ab7ec50812c73a3ec97bf0985f3226ec13cbc8 3 filename.js
Согласно руководству fine, эта команда сообщает нам биты режима, имя объекта и номер этапа. Биты режима те же. Итак, что такое 1, 2 и 3, и почему они «оба изменены», но не показывают маркеры конфликта?
Комментарии:
1. Это могут быть различия в пробелах.
2. Попробуйте
git ls-files -s filename.js
посмотреть, действительно ли версии отличаются.3. @JoshLee Я обновил свой вопрос в ответ на ваш комментарий. На выходе отображаются 3 больших двоичных объекта, но я не уверен, куда идти дальше, как мне найти различия или определить, какой из них «добавить» или «сбросить»?
4. @birryree Не будут ли различия в пробелах отображаться с <<< маркерами конфликта?
5. Вы правы, игнорируйте меня.
Ответ №1:
Версии в индексе отмечены 1
, 2
, и 3
имеют следующее значение:
- Файл в том виде, в каком он был у общего предка двух коммитов, которые вы объединяете.
- Файл в том виде, в котором он был
HEAD
, то есть ваш текущий коммит, когда вы выполняли слияние. - Файл в том виде, в котором он находится в фиксации, в которую вы пытаетесь объединить
HEAD
.
Мой источник этой информации — полезный раздел руководства по git, посвященный разрешению конфликтов.
both modified
Вывод git status
, конечно, указывает, что файл был изменен по-разному двумя коммит, которые вы объединяете, начиная с их общего предка.
Однако для меня довольно загадочно, почему вы не видите маркеров конфликта в файле — то, что большие двоичные объекты имеют разные имена объектов (хэши) в выходных git ls-files -s
данных, указывает на то, что байт за байтом они, безусловно, имеют разное содержимое. Если вы довольны файлом в том виде, в каком он есть в вашей рабочей копии, вы можете просто сделать git add filename.js
and then git rebase --continue
. Однако в любом случае вы можете захотеть выяснить, в чем заключалась эта разница. Чтобы сделать это, я бы попробовал следующее:
git diff :2:filename.js filename.js
… который покажет различия между версией в HEAD
и вашей текущей рабочей копией. Аналогичным образом, вы можете попробовать:
git diff :3:filename.js filename.js
… чтобы увидеть разницу между версией, которая была объединена, и вашей рабочей копией.
Ответ №2:
The 1
, 2
и 3
of git ls-files -s
представляет «стадию» 3-стороннего слияния: 1
является общим предком, 2
текущим заголовком ветки и 3
другим заголовком ветки. В Linux вы можете попробовать следующие команды, чтобы увидеть, что отличается от файлов:
$ git cat-file blob d2c915b1d632b8ef8fbcf056824fb7fac7824ab9 | xxd -ps
$ git cat-file blob 9010798f1d19ac712196b1fc9b0870fd332b1275 | xxd -ps
$ git cat-file blob b3ab7ec50812c73a3ec97bf0985f3226ec13cbc8 | xxd -ps