Скажем, у меня есть незафиксированные изменения в моем рабочем каталоге. Как я могу сделать патч из тех, кто не создает коммит?
Скажем, у меня есть незафиксированные изменения в моем рабочем каталоге. Как я могу сделать патч из тех, кто не создает коммит?
Ответы:
git diff
для неустановленных изменений. git diff --cached
для поэтапных изменений.
git format-patch
также включает в себя двоичные различия и некоторую мета-информацию. На самом деле это было бы лучшим выбором для создания патча, но на самом деле это работает только для проверенных источников / изменений, верно?
git diff --relative
Если вы еще не зафиксировали изменения, то:
git diff > mypatch.patch
Но иногда случается, что часть того, что вы делаете, - это новые файлы, которые не отслеживаются и не будут в вашем git diff
выводе. Итак, один из способов сделать патч состоит в том, чтобы подготовить все для нового коммита ( git add
каждого файла или просто git add .
), но не делать коммит, а затем:
git diff --cached > mypatch.patch
Добавьте опцию 'binary', если вы хотите добавить двоичные файлы в патч (например, mp3-файлы):
git diff --cached --binary > mypatch.patch
Позже вы можете применить патч:
git apply mypatch.patch
Примечание: вы также можете использовать --staged
как синоним --cached
.
git diff --no-color
. В противном случае это выглядит как проблема кодирования.
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
git diff --cached > mypatch.patch
не работает.
file_name.patch
ли patch
команда использоваться? Совместимы ли они друг с другом?
Мне нравиться:
git format-patch HEAD~<N>
где <N>
число последних коммитов для сохранения как патчей.
Детали как использовать команду находятся в DOC
UPD
Здесь вы можете найти способ их применения.
UPD Для тех, кто не понял идею format-patch
добавления псевдонима:
git config --global alias.make-patch '!bash -c "cd ${GIT_PREFIX};git add .;git commit -m ''uncommited''; git format-patch HEAD~1; git reset HEAD~1"'
Затем в любом каталоге вашего репозитория проекта запустите:
git make-patch
Эта команда создаст 0001-uncommited.patch
в вашем текущем каталоге. Патч будет содержать все изменения и неотслеживаемые файлы, которые видны следующей команде:
git status .
Мы могли бы также указать файлы, чтобы включить только файлы с относительными изменениями, особенно когда они охватывают несколько каталогов, например
git diff ~/path1/file1.ext ~/path2/file2.ext...fileN.ext > ~/whatever_path/whatever_name.patch
Я обнаружил, что это не указано в ответах или комментариях, которые все актуальны и правильны, поэтому решил добавить его. Явное лучше, чем неявное!