Как выделить изменения из одного файла в другой?

У меня есть два файла с именами vvn.c и aqu.c. Я внес изменения в vvn.c, и у меня есть этот коммит в моем git. Как выбрать те же изменения в aqu.c Единственное отличие - это API.

vvn.c содержит API как vvn_function_names()

тогда как aqu.c содержит API как unions_function_names()

Я не знаю, как это сделать. Я знаю про сбор вишен в один и тот же файл. Есть ли способ сделать это?


person AQU    schedule 27.05.2016    source источник
comment
stackoverflow.com/a/16527024/702456 - это действительно ответ, который вы, вероятно, хотели. Если кто-то еще окажется здесь, следует упомянуть   -  person Adam McCormick    schedule 01.08.2017


Ответы (4)


Не совсем точный выбор, но вы можете использовать:

git checkout <branch or sha of commit> -- filename

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

Другая возможность - сгенерировать diff (вы можете просто сгенерировать diff из диапазона коммитов и ограничить его одним файлом), а затем применить diff. Проверьте: Как различать один и тот же файл между двумя разными коммитами в одной ветке?

person Tomas Kulich    schedule 27.05.2016
comment
Не могли бы вы привести пример по первому? - person AQU; 27.05.2016
comment
В вашем случае это будет примерно так: git checkout branch-witch-aqu-changes -- aqu.c - person Tomas Kulich; 27.05.2016
comment
Хм. У меня есть оба файла в одной ветке. vvn.c и aqu.c находятся в разных каталогах. Итак, как оформить заказ сейчас? - person AQU; 27.05.2016
comment
Насколько я понимаю, вы хотите получить только один файл из другой ветки ... Если это так, вам не нужно беспокоиться о vvn.c, вы просто делаете это из фиксации, где этот файл находится в правильной версии ...? - person Tomas Kulich; 27.05.2016

В основном вам нужно сделать разницу в vvn.c изменениях и применить их к aqu.c. См., Например, здесь: Как применить патч Git к файлу с другим именем и путем?

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

Наверное, лучше придумать какой-нибудь другой подход. Например. для C вы можете использовать #include и извлечь общую часть в отдельный файл.

person kan    schedule 27.05.2016

Другой вариант, который легче сохраняет информацию об авторе исходной фиксации:

  • git cherry-pick обычно
  • git mv файлы на место
  • git commit --amend, чтобы изменить выбранный коммит

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

  • git checkout --orphan temp/cherry-pick (ссылка)
  • git reset
  • Выполните первый набор шагов, чтобы применить фиксацию
  • Наконец, вернитесь к исходной ветке и git cherry-pick temp/cherry-pick
person We Are All Monica    schedule 14.11.2018

Пользуюсь патч-файлом. Таким образом, я могу отредактировать пути в файле патча, чтобы они соответствовали новому местоположению (ям).

Вы можете создать файл патча с помощью:

git format-patch {commit}~1...{commit}

Это сгенерирует .patch файл в локальном каталоге с изменениями.

-or-

git show {commit} > {my-changes.patch}

Где {my-changes.patch} - имя файла / путь, который вы определяете.

Теперь отредактируйте файл {my-changes.patch} в редакторе и замените старые пути новыми путями. В это время можно внести другие правки или изменения.

Теперь вы можете применить патч с помощью:

git am < {my-changes.patch}

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

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

Примечание. git am имеет несколько вариантов, например --ignore-whitespace и --interactive, которые могут вам помочь.

person ChuckEng    schedule 19.09.2019