Использование `git show` для создания и применения патчей, охватывающих несколько коммитов

В последнее время я использую git show <hash> для создания diffs для более поздней ссылки, потому что легче набирать, чем git diff <hash>~ <hash>, и отображает информацию о фиксации (timestamp, user, hash, comment). Затем вы можете использовать git apply <filename> для применения исправления.

Я обнаружил, что git show -3 покажет последние три коммита вместе с той же дополнительной информацией. Тем не менее, git apply выдаст все в рабочий каталог как неустановленные изменения и потеряет всю информацию о фиксации.

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

Ответ 1

Вы можете использовать git format-patch для генерации MIME-писем, представляющих коммиты, включая их метаданные (сообщение, авторство и т.д.). Затем вы можете повторно применить их с помощью git am.

Итак, git format-patch HEAD~3 будет генерировать 3 патча для последних 3 коммитов, и вы можете передать их все в git am. Если вы хотите быть более простым, git format-patch --stdout HEAD~3 отправит MIME-сообщения на stdout, чтобы вы могли обходить их туда, где хотите, вместо того, чтобы иметь дело с 3 отдельными файлами.

Конечно, если вы пытаетесь сохранить фиксации для ссылки позже, почему бы просто не пометить их? Затем вы можете повторно применить коммиты от них, используя git cherry-pick.

Ответ 2

В Linux вы можете подключить свой дельта-генератор --- git-show или git-diff, например, с помощью команды git-apply.

(Также вероятно, что безопаснее всегда включать 3-стороннее слияние с опцией -3)

> git show <sha1> [<path>] | git apply -3
> git diff <sha1-a> <sha1-b> [<path>] | git apply -3

Примеры:

  • применить изменения в конкретном файле, выполненном в abcdef:
> git show abcdef dir/file.c | git apply -3
  • применить разницу в файле двух разных коммитов abcdef и 123456

> git diff abcdef 123456 foo.h | git apply -3

Смотрите также: fooobar.com/questions/26769/...

Ответ 3

попробуйте git bundle для отправки определенных частей истории.