Git format-patch против git log -p
Я хотел бы получить список коммитов как патчи, а затем попытаться применить их к другому репо, в котором я сохранил очень близкий проект к тому, из которого я хочу получить патч: как я могу в одной команде получить все патчи? Каков наилучший метод (и различия) между git format-patch и git log -p?
3 ответа
Я считаю, что вы могли бы попытаться использовать git bundle
Команда также создать двоичный архив, а затем применить его к другой копии хранилища.
Однако я бы сказал, что этот подход не так гибок, чем использование git format-patch
а также git am
, но может быть быстрее, если вы не хотите просматривать каждый патч вручную.
git bundle create file.name revision..list
- создаст файл с file.name
в текущую папку и положить в нее содержимое указанных ревизий.
git bundle unbundle file.name
восстановить ревизии в другом месте.
git log -p
показывает изменения в обратном хронологическом порядке (самые последние сначала). Обычно это не очень хорошо для генерации патчей, так как вы хотите начать патч с самого раннего изменения, а не с самого последнего.
git format-patch
генерирует патчи в правильном направлении (патч 0001
будет самым ранним изменением), и он сохраняет патчи по одному файлу и форматирует их как сообщения электронной почты, подходящие для использования с git am
на принимающей стороне.
Так что для того, что вы хотите, вероятно, имеет смысл запустить git format-patch
в одном хранилище, а затем git am
в целевом хранилище:
cat *.patch | git am
Если вы отформатируете хеш, полученный в git log, добавив перед номером пути символ "-", все патчи могут быть сгенерированы одновременно в разных файлах. Пример:
git format-patch $(git log --reverse 073dd505f..fff28ff65 --pretty="%H" -- the/needed/path | awk '{print -NR, " ", $0}')
Это покроет весь фильтр, который вы можете применить из git log. Они не всегда последовательные коммиты. Например, принимая патчи, соответствующие данному пользователю:
git format-patch $(git log --reverse --author="John Doe" --pretty="%H" -- the/needed/path | awk '{print -NR, " ", $0}')
Опция --reverse необходима для того, чтобы предоставить вам патч в хронологическом порядке, потому что git log в первую очередь дает наибольшее количество изменений.