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



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



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



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



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



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



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

630   9  

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 обычно автокоммитирует после слияния, но когда он обнаруживает конфликты, которые он не может решить сам по себе, он применяет все патчи, которые он выяснил, и оставляет остальное для вас, чтобы разрешить и зафиксировать вручную. Элемент Git Merge Man Page на git-SVN Crash Course или этой запись в блоге может пролить свет на то, как это должно работать.

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) для несвязанных путей.

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

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

% git fetch

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

% git checkout FETCH_HEAD stuff/to/update

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

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

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

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

Я получил обе стратегии для работы с двоичными файлами программных моделей, но мы пошли с 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

Comments

    Ничего не найдено.