Разрешение конфликта 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 [-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.
Tortoise git позволяет настраивать инструменты diff/merge для разных типов файлов на основе их расширений файлов. Увидеть 2.35.4.3. Diff / Merge Дополнительные Настройки http://tortoisegit.org/docs/tortoisegit/tgit-dug-settings.html. Эта стратегия, конечно, relys на подходящих инструментах diff / merge.
используя атрибуты git вы можно указать инструмент / команду для преобразования двоичного файла в текст, а затем пусть ваш инструмент diff/merge по умолчанию делает это. См.http://git-scm.com/book/it/v2/Customizing-Git-Git-Attributes. В статье даже приведен пример использования метаданных для изображений diff.
Я получил обе стратегии для работы с двоичными файлами программных моделей, но мы пошли с tortoise git, поскольку конфигурация была простой.
если двоичный файл что-то больше, чем dll или то, что может быть редактировать непосредственно как изображение или файл blend (и вам не нужно выбрасывать / выбирать один файл или другой) реальное слияние будет похоже на:
Я предлагаю поиск инструмента diff, ориентированного на то, что вы двоичный файл, например, есть некоторые бесплатные для файлов изображений, например
- npm install-g imagediff IIRC от https://github.com/uber/image-diff
- или python https://github.com/kaikuehne/mirror.git
- там есть
и сравнить их.
если нет инструмента 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