Разрешение конфликта Git с двоичными файлами

я использовал Git в Windows (msysgit) для отслеживания изменений для некоторых дизайнерских работ, которые я делал.

сегодня я работаю на другом ПК (с удаленным РЕПО brian) и теперь я пытаюсь объединить изменения, сделанные сегодня, в мою обычную локальную версию на моем ноутбуке.

на моем ноутбуке, я использовал git pull brian master чтобы вытащить изменения в мою локальную версию. Все было хорошо, кроме основного документа InDesign - это показывает как конфликт.

В версия на ПК (brian) является последним, который я хочу сохранить, но я не знаю, какие команды говорят РЕПО использовать этот.

Я попытался напрямую скопировать файл на свой ноутбук, но это, похоже, сломает весь процесс слияния.

может ли кто-нибудь указать мне в правильном направлении?

9 ответов


git checkout принимает --ours или --theirs опция для таких случаев. Поэтому, если у вас есть конфликт слияния, и вы знаете, что вам просто нужен файл из ветви, в которой вы сливаетесь, вы можете сделать:

$ git checkout --theirs -- path/to/conflicted-file.txt

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

$ git checkout --ours -- path/to/conflicted-file.txt

вы должны разрешить конфликт вручную (копирование файла), а затем зафиксировать файл (независимо от того, скопировали ли вы его или использовали локальную версию), как это

git commit -a -m "Fix merge conflict in test.foo"

Git обычно автокоммит после слияния, но когда он обнаруживает конфликты, которые он не может решить сам, он применяет все патчи, которые он выяснил, и оставляет остальное для вас, чтобы решить и зафиксировать вручную. The Git Merge Man Page на аварийный курс Git-SVN или этой запись в блоге может пролить свет на то, как это должно работать.

Edit: см. сообщение ниже, вам на самом деле не нужно копировать файлы самостоятельно, но можно использовать

git checkout --ours -- path/to/file.txt
git checkout --theirs -- path/to/file.txt

чтобы выбрать нужную версию файла. Копирование / редактирование файла будет необходимо только в том случае, если вы хотите сочетание обеих версий.

пожалуйста, отметьте ответ mipadis как правильный.


вы также можете решить эту проблему с

git mergetool

какие причины git чтобы создать локальные копии конфликтующего двоичного файла и создать на них редактор по умолчанию:

  • {conflicted}.HEAD
  • {conflicted}
  • {conflicted}.REMOTE

очевидно, что вы не можете с пользой редактировать файлы двоичные файлы в текстовом редакторе. Вместо этого вы копируете новый {conflicted}.REMOTE file over {conflicted} без закрытия редактора. Затем, когда вы закрываете редактор git увидит, что недекорированная рабочая копия была изменена, и ваш конфликт слияния разрешен обычным способом.


чтобы решить, сохранив версию в текущей ветви (игнорируйте версию из ветви, в которой вы объединяетесь), просто добавьте и зафиксируйте файл:

git commit -a

чтобы решить проблему путем перезаписи версии в текущей ветви с версией из ветви, в которой вы объединяетесь, вам нужно сначала получить эту версию в свой рабочий каталог, а затем добавить / зафиксировать ее:

git checkout otherbranch theconflictedfile
git commit -a

объяснено более подробно


mipadi не совсем Работа для меня, мне нужно было сделать это :

git checkout --наш путь / к / файлу.бин

или, чтобы сохранить версию, объединяемую в:

git checkout --их путь/к / файлу.бин

затем

git добавить путь/в / файл.бин

и тогда я смог снова сделать "git mergetool" и продолжить следующий конфликт.


С git checkout docs

git checkout [-f|--ours|--theirs|-m|--conflict=<style>] [<tree-ish>] [--] <paths>...

--ours
--theirs
При проверке путей из индекса проверьте Этап #2 (ours) или #3 (theirs) для unmerged путей.

индекс может содержать несогласованные записи из-за предыдущего неудачного слияния. По умолчанию при попытке проверить такую запись из индекса операция проверки завершится неудачно и ничего не будет проверено. Используя -f будет игнорировать эти записи неслиянно. Содержимое с определенной стороны слияния можно проверить из индекса с помощью --ours или --theirs. С -m, изменения, внесенные в файл рабочего дерева, могут быть отброшены для повторного создания исходного конфликтного результата слияния.


я столкнулся с аналогичной проблемой (желая вытащить фиксацию, которая включала некоторые двоичные файлы, которые вызывали конфликты при объединении), но наткнулся на другое решение, которое можно сделать полностью с помощью git (т. е. не нужно вручную копировать файлы). Я решил, что включу его сюда, чтобы, по крайней мере, запомнить в следующий раз, когда он мне понадобится. :) Шаги выглядят следующим образом:

% git fetch

Это извлекает последние фиксации из удаленного репозитория (вам может потребоваться указать удаленное имя ветви, в зависимости от вашей настройки), но не пытается объединить их. Он записывает фиксацию в FETCH_HEAD

% git checkout FETCH_HEAD stuff/to/update

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


Я столкнулся с двумя стратегиями управления различиями / слиянием двоичных файлов с Git в windows.

  1. Tortoise git позволяет настраивать инструменты diff/merge для разных типов файлов на основе их расширений файлов. Увидеть 2.35.4.3. Diff / Merge Дополнительные Настройки http://tortoisegit.org/docs/tortoisegit/tgit-dug-settings.html. Эта стратегия, конечно, relys на подходящих инструментах diff / merge.

  2. используя атрибуты git вы можно указать инструмент / команду для преобразования двоичного файла в текст, а затем пусть ваш инструмент diff/merge по умолчанию делает это. См.http://git-scm.com/book/it/v2/Customizing-Git-Git-Attributes. В статье даже приведен пример использования метаданных для изображений diff.

Я получил обе стратегии для работы с двоичными файлами программных моделей, но мы пошли с tortoise git, поскольку конфигурация была простой.


если двоичный файл что-то больше, чем dll или то, что может быть редактировать непосредственно как изображение или файл blend (и вам не нужно выбрасывать / выбирать один файл или другой) реальное слияние будет похоже на:

Я предлагаю поиск инструмента diff, ориентированного на то, что вы двоичный файл, например, есть некоторые бесплатные для файлов изображений, например

и сравнить их.

если нет инструмента diff для сравнения ваших файлов, то если у вас есть оригинальный генератор файла bin (то есть существует редактор для него... как и blender 3d, вы можете вручную проверить эти файлы, также посмотрите журналы и спросите другого человека, что вы должны включить) и делать вывод файлов с https://git-scm.com/book/es/v2/Git-Tools-Advanced-Merging#_manual_remerge

$ git show :1:hello.blend > hello.common.blend $ git show :2:hello.blend > hello.ours.blend $ git show :3:hello.blend > hello.theirs.blend