Создать git patch из изменений в текущем рабочем каталоге
Скажем, у меня есть незафиксированные изменения в моем рабочем каталоге. Как я могу сделать патч из тех, кто не создает коммит?
8 ответов
git diff
для неустановленных изменений. git diff --cached
для поэтапных изменений.
Если вы еще не зафиксировали изменения, то:
git diff > mypatch.patch
Но иногда случается, что частью того, что вы делаете, являются новые файлы, которые не отслеживаются и не будут в вашем git diff
выход. Итак, один из способов сделать патч состоит в том, чтобы подготовить все для нового коммита (но не коммитить), а затем:
git diff --cached > mypatch.patch
Добавьте опцию 'binary', если вы хотите добавить двоичные файлы в патч (например, mp3-файлы):
git diff --cached --binary > mypatch.patch
Позже вы можете применить патч:
git apply mypatch.patch
git diff
а также git apply
будет работать для текстовых файлов, но не будет работать для двоичных файлов.
Вы можете легко создать полный двоичный патч, но вам придется создать временную фиксацию. После того как вы сделали ваш временный коммит (ы), вы можете создать патч с:
git format-patch <options...>
После того, как вы сделали патч, запустите эту команду:
git reset --mixed <SHA of commit *before* your working-changes commit(s)>
Это откатит ваши временные коммиты. Окончательный результат оставляет вашу рабочую копию (намеренно) грязной с теми же изменениями, которые у вас были изначально.
На принимающей стороне вы можете использовать тот же трюк, чтобы применить изменения к рабочей копии, не имея истории фиксации. Просто примените патч (ы), и git reset --mixed <SHA of commit *before* the patches>
,
Обратите внимание, что вам, возможно, придется хорошо синхронизироваться, чтобы эта опция работала. Я видел некоторые ошибки при применении патчей, когда человек, производящий их, не выпал столько изменений, сколько я. Возможно, есть способы заставить его работать, но я не стал вдаваться в подробности.
Вот как можно создать такие же патчи в Tortoise Git (я не рекомендую использовать этот инструмент):
- Зафиксируйте ваши рабочие изменения
- Щелкните правой кнопкой мыши корневой каталог филиала и выберите
Tortoise Git
->Create Patch Serial
- Выберите тот диапазон, который имеет смысл (
Since
:FETCH_HEAD
будет работать, если вы хорошо синхронизированы) - Создать патч
- Выберите тот диапазон, который имеет смысл (
- Щелкните правой кнопкой мыши корневой каталог филиала и выберите
Tortise Git
->Show Log
- Щелкните правой кнопкой мыши на коммите перед вашим временным коммитом и выберите
reset "<branch>" to this...
- Выберите
Mixed
вариант
И как их применять:
- Щелкните правой кнопкой мыши корневой каталог филиала и выберите
Tortoise Git
->Apply Patch Serial
- Выберите правильный патч (ы) и примените их
- Щелкните правой кнопкой мыши корневой каталог филиала и выберите
Tortise Git
->Show Log
- Щелкните правой кнопкой мыши на коммите до коммитов патча и выберите
reset "<branch>" to this...
- Выберите
Mixed
вариант
Чтобы создать патч с измененными и новыми файлами (поэтапно), вы можете запустить:
git diff HEAD > file_name.patch
Если вы хотите сделать двоичный файл, дайте --binary
вариант при запуске git diff
,
Мы также можем указать файлы, чтобы включить только файлы с относительными изменениями, особенно когда они охватывают несколько каталогов, например
git diff ~/path1/file1.ext ~/path2/file2.ext...fileN.ext > ~/whatever_path/whatever_name.patch
Я обнаружил, что это не указано в ответах или комментариях, которые все актуальны и правильны, поэтому решил добавить это. Явное лучше, чем неявное!
необработанный
git diff --cached > name.patch
совершено (гораздо полезнее)
git diff HEAD~commit_count > name.patch