Git: как объединить файл с его версией из предыдущего коммита?

Есть некоторые изменения, которые я внес в файл в коммите A, затем я по ошибке отменил изменения и продолжил вносить изменения в коммиты B и C.

Я хочу, чтобы изменения в фиксации A были в моем файле, но изменения в B и C также не должны быть потеряны.

Скажем, моя ветка сейчас находится на C.

Я не хочу

$ git checkout --patch 

потому что я хочу, чтобы файл содержал изменения, которые я сделал в B и C, и выполнение проверки файла из фиксации A перезапишет файл как в индексе, так и в рабочем дереве.

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

Есть ли другой способ, кроме ручного копирования изменений, которые я хочу в файл?


person rivendell    schedule 10.07.2013    source источник


Ответы (1)


Вы можете создать патч и попытайтесь применить исправление. Если у вас возникли проблемы с конфликтами, например

error: patch failed: <file_name>:1
error: <file_name>: patch does not apply

слияние потребует ручного вмешательства.

Вот пример:

$ git format-patch -n <sha_from_commit_you_want_to_merge> > patch_file.patch
$ git apply patch_file.patch

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

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

person eebbesen    schedule 11.07.2013
comment
Надеюсь, есть способ более естественный! - person rivendell; 11.07.2013
comment
Я не знаю, насколько это может быть проще, чем две команды для объединения кода (да, одна команда была бы проще :)). Если есть непримиримые проблемы слияния, я не знаю системы контроля версий, которая может помочь вам лучше, чем Git. Если у вас есть проблемы с этим подходом, отредактируйте свой пост или добавьте комментарий, и мы посмотрим, что мы можем сделать. - person eebbesen; 11.07.2013
comment
Прошу прощения за неаккуратный ответ! Нет оправдания, но я был занят исправлением ошибок в коде и обнаружил, что эта проблема с git является помехой! Ну, я действительно думал, что git-merge-file сделает что-то похожее на решение моей проблемы здесь, но оказалось, что это для слияния двух файлов, которые основаны на одном и том же файле! Однако ваш метод работает отлично! Большое тебе спасибо! - person rivendell; 11.07.2013