Создайте патч git из изменений в текущем рабочем каталоге

Скажем, у меня есть незафиксированные изменения в моем рабочем каталоге. Как я могу сделать патч от тех, у кого нет необходимости создавать коммит?

Ответ 1

git diff для неустановленных изменений. git diff --cached для поэтапных изменений.

Ответ 2

Если вы еще не зафиксировали изменения, то:

git diff > mypatch.patch

Но иногда случается, что часть того, что вы делаете, - это новые файлы, которые не отслеживаются и не будут отображаться в вашем git diff. Итак, один из способов сделать патч состоит в том, чтобы подготовить все для нового коммита (git add каждый файл или просто git add.), Но не делать коммит, а затем:

git diff --cached > mypatch.patch

Добавьте опцию "двоичный", если вы хотите добавить двоичные файлы в патч (например, mp3 файлы):

git diff --cached --binary > mypatch.patch

Позже вы можете применить патч:

git apply mypatch.patch

Примечание. Вы также можете использовать --staged как синоним --cached.

Ответ 3

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 GitCreate Patch Serial
    • Выберите, какой диапазон имеет смысл (Since: FETCH_HEAD будет работать, если вы хорошо синхронизированы)
    • Создайте патч (ы)
  • Щелкните правой кнопкой мыши корневой каталог ветки и нажмите Tortise GitShow Log
  • Щелкните правой кнопкой мыши фиксацию перед вашей временной фиксацией и нажмите reset "<branch>" to this...
  • Выберите опцию Mixed

И как их применять:

  • Щелкните правой кнопкой мыши корневой каталог ветки и нажмите Tortoise GitApply Patch Serial
  • Выберите правильный патч и примените их
  • Щелкните правой кнопкой мыши корневой каталог ветки и нажмите Tortise GitShow Log
  • Щелкните правой кнопкой мыши фиксацию перед фиксацией патча и нажмите reset "<branch>" to this...
  • Выберите опцию Mixed

Ответ 4

Чтобы создать патч с измененными и новыми файлами (поэтапно), вы можете запустить:

git diff HEAD > file_name.patch

Ответ 5

Мне нравится:

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 .

Ответ 6

Если вы хотите сделать двоичный код, укажите --binary при запуске git diff.