Создайте патч git для определенного коммита

Мне нужно написать script, который создает исправления для списка номеров фиксации SHA1.

Я попытался использовать git format-patch <the SHA1>, но сгенерировал патч для каждой фиксации с этого SHA1. После того, как было создано несколько сотен исправлений, мне пришлось убить процесс.

Есть ли способ создать патч только для конкретного SHA1?

Ответ 1

Пытаться:

git format-patch -1 <sha>

или же

git format-patch -1 HEAD

Согласно приведенной выше ссылке на документацию, флаг -1 сообщает git, сколько -1 должно быть включено в патч;

- <п>

Подготовьте патчи из верхних коммитов.


Примените патч с помощью команды:

git am < file.patch

Ответ 2

Для создания патчей с самого верхнего значения происходит фиксация определенного хэша sha1:

git format-patch -<n> <SHA1>

Последние 10 патчей из головы в одном файле патча:

git format-patch -10 HEAD --stdout > 0001-last-10-commits.patch

Ответ 3

Скажите, что у вас есть идентификатор 2 после фиксации 1, который вы могли бы запустить:

git diff 2 1 > mypatch.diff

где 2 и 1 являются SHA-хешами.

Ответ 4

Эта команда (как уже было предложено @Naftuli Tzvi Kay):

git format-patch -1 HEAD

Замените HEAD специальным хешем или диапазоном.

создаст файл исправления для последней фиксации, отформатированной так, чтобы она напоминала формат почтового ящика UNIX.

-<n> - Подготовьте исправления от самых верхних коммитов.

Затем вы можете повторно применить файл исправления в формате почтового ящика:

git am -3k 001*.patch

Смотрите: man git-format-patch.

Ответ 5

git format-patch commit_Id~1..commit_Id  
git apply patch-file-name

Быстрое и простое решение.

Ответ 6

Если вы хотите быть уверенным, что исправление (одиночная фиксация) будет применено поверх определенной фиксации, вы можете использовать новую опцию git format-patch --base 2.9 (июнь 2016 г.) git format-patch --base

git format-patch --base=COMMIT_VALUE~ -M -C COMMIT_VALUE~..COMMIT_VALUE

# or
git format-patch --base=auto -M -C COMMIT_VALUE~..COMMIT_VALUE

# or
git config format.useAutoBase true
git format-patch -M -C COMMIT_VALUE~..COMMIT_VALUE

Смотрите коммит bb52995, коммит 3de6651, коммит fa2ab86, коммит ded2c09 (26 апреля 2016 г.) от Xiaolong Ye ('').
(Объединено Junio C Hamano - gitster - в коммите 72ce3ff, 23 мая 2016 г.)

format-patch: добавить --base " --base " для записи информации о базовом дереве

Сопровождающие или сторонние тестировщики могут узнать точное базовое дерево, к которому относится серия исправлений. Обучите git format-patch опции ' --base ', чтобы записать информацию о базовом дереве и добавить ее в конце первого сообщения (либо сопроводительное письмо, либо первое исправление в серии).

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

"Базовый коммит" отображается как " base-commit: ", за которым следует 40-шестнадцатеричный код имени объекта коммита.
"Предварительно установленное исправление" отображается как " prerequisite-patch-id: ", за которым следует 40-шестнадцатеричный "идентификатор исправления", который можно получить, пропустив исправление с помощью команды " git patch-id --stable ".


Git 2.23 (Q3 2019) улучшит это, потому что опция " --base " " format-patch " вычисляла patch-ids исправлений для обязательных исправлений нестабильным способом, который был обновлен для вычисления способом, совместимым с git patch-id --stable " git patch-id --stable ".

Смотрите коммит a8f6855, коммит 6f93d26 (26 апреля 2019) Стивена Бойда (akshayka).
(Объединено Junio C Hamano - gitster - в коммите 8202d12, 13 июня 2019 г.)

format-patch: сделать --base patch-id format-patch --base patch-id стабильным

Мы не очищали контекст каждый раз, когда обрабатывали diff.c в коде генерации patch-id в diff.c, но мы делали это, когда генерировали "стабильные" идентификаторы заплат с помощью инструмента " patch-id ".

Позвольте перенести эту похожую логику из patch-id.c в diff.c чтобы мы могли получить тот же хэш, когда генерируем patch-id для типов командных вызовов format-patch --base=.

Ответ 7

Чтобы создать путь из определенного коммита (а не последнего коммита):

git format-patch -M -C COMMIT_VALUE~1..COMMIT_VALUE

Ответ 8

если вы просто хотите изменить указанный файл, вы можете:

git diff master 766eceb - connections/> 000-mysql-connector.patch

Ответ 9

Каков способ создания патча только для конкретного SHA1?

Это довольно просто:

Вариант 1. git show commitID > myFile.patch

Вариант 2. git commitID~1..commitID > myFile.patch

Примечание. Замените commitID на фактический идентификатор фиксации (код фиксации SHA1).