Какая версия бинарного файла по умолчанию помечена как измененная в Git? - PullRequest
0 голосов
/ 26 февраля 2019

Если конфликт возникает в двоичных или любых нетекстовых файлах, которые не могут быть разрешены с помощью текстового редактора, я должен вместо этого использовать git checkout --theirs или git checkout --ours, а затем добавить их в область подготовки.

Но, если я просто ничего не сделаю, добавьте эти незакрытые двоичные файлы непосредственно в область подготовки, без разрешения конфликта, без выбора правильной версии, какая версия будет добавлена ​​в область подготовки?Наши или их?

Unmerged paths:
  (use "git add/rm <file>..." as appropriate to mark resolution)

      both modified: test.bin
      both modified: test.a 

Ответы [ 2 ]

0 голосов
/ 26 февраля 2019

Если конфликт возникает в двоичных или любых нетекстовых файлах, которые не могут быть разрешены с помощью текстового редактора, я должен использовать git checkout --theirs или git checkout --ours вместо ...

Это не обязательно так.Как и в случае с обычными текстовыми файлами, где иногда правильное разрешение фактически является объединенным изменением, правильное разрешение некоторых двоичных файлов может быть объединенным изменением.Просто Git не может сделать это за вас.Единственный способ сделать это правильно - это найти исходный файл или файлы и какой-то переводчик исходного кода в двоичный.Вам может потребоваться объединить исходные изменения, скомпилировать / преобразовать результат в новый, третий двоичный файл и использовать его.

Тем не менее, на этот вопрос есть ответ.Это может быть бессмысленно изучать и запоминать.

Но, если я просто ничего не делаю, добавьте эти незакрепленные двоичные файлы непосредственно в область подготовки ...

Что git add выполняет копирование всего, что находится в рабочем дереве, в индексную / промежуточную область в нулевом слоте, удаляя все записи более высокого уровня.Во время конфликта у вас есть три разных двоичных файла в области индекса / промежуточного хранения, но с использованием слотов 1 (база слияния), 2 (наш) и 3 (их).

Следовательно, это просто означает Скопируйте файл рабочего дерева в нулевой слот и удалите записи в слотах 1, 2 и 3. Так что вопрос такой же, как:

Что Git оставляет в рабочем деревев случае конфликта в двоичном файле?

Ответ на этот вопрос содержится в git merge документации и документации gitattributes .Это затрудняет чтение.

Первый говорит о стратегиях recursive и resolve, что есть дополнительные аргументы, которые влияют на результат.Эти дополнительные аргументы являются аргументами -X ours и -X theirs, что означает:

ours
Этот параметр заставляет конфликтующие фрагменты автоматически разрешаться автоматическиотдавая предпочтение нашей версии.Изменения в другом дереве, которые не конфликтуют с нашей стороной, отражаются на результате слияния.Для бинарного файла все содержимое взято с нашей стороны.
...
их
Это противоположно нашим; обратите внимание, что, в отличие от наших , нет их стратегия слияния, чтобы спутать эту опцию слияния с.

Документация gitattributes добавляет это:

Выполнение трех-way merge
...
Атрибут merge влияет на способ объединения трех версий файла, когда необходимо объединение на уровне файла ...

а затем продолжает говорить, что большинство из них «[k] выдают версию из вашей ветви в рабочем дереве».Таким образом, в целом соответствует рабочему дереву index-slot-2, которое вы можете проверить, выполнив git checkout-index --temp --stage=2 test.bin и сравнив полученный файл с test.bin.

Не ясно, так ли этопереопределение атрибутов -X theirs;вам придется проверить это, если вы установите свои собственные атрибуты merge и используете -X theirs, сравнивая то, что находится в рабочем дереве, с тем, что находится в слотах индекса 2 и 3.

В целом, однако,большинство подходов в основном оставляют «нашу» версию в рабочем дереве.Если это уместно, вы можете использовать git add, чтобы скопировать версию рабочего дерева обратно в нулевой слот и стереть слоты 1-3, помечая файл как разрешенный.Просто убедитесь, что если вы использовали -X theirs и / или какой-то интересный параметр merge, то вы знаете, что делаете, и дважды проверили все.

(Ваша лучшая ставка, конечно,чтобы избежать слияния бинарных файлов таким способом.)

0 голосов
/ 26 февраля 2019

Бывают случаи, когда уместно проверить двоичный файл, изображения, видео, офисные документы ... но их невозможно объединить.Вы должны выбрать одну или другую или создать новую версию.

Но это похоже на артефакты сборки;файлы, созданные как часть процесса сборки.Их не следует регистрировать. Они будут устаревать с их исходным кодом, и они будут отличаться на машинах разных людей, которые имеют разные компиляторы и разные библиотеки.

Удалите их с помощью git rm и затем добавить их в .gitignore проекта, чтобы они не возвращались.Возможно, вы захотите игнорировать целые классы файлов, такие как *.a и *.o и *.bin. gitignore.io может создать хороший стартовый файл игнорирования для вашего проекта.

...