Скажем, у меня есть незафиксированные изменения в моем рабочем каталоге. Как я могу сделать патч из тех, кто не создает коммит?
Скажем, у меня есть незафиксированные изменения в моем рабочем каталоге. Как я могу сделать патч из тех, кто не создает коммит?
Ответы:
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 Logreset "<branch>" to this...MixedопциюИ как их применять:
Tortoise Git->Apply Patch SerialTortise Git->Show Logreset "<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
Я обнаружил, что это не указано в ответах или комментариях, которые все актуальны и правильны, поэтому решил добавить его. Явное лучше, чем неявное!