Использование `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
для отправки определенных частей истории.