Создать git patch из изменений в текущем рабочем каталоге - PullRequest
741 голосов
/ 01 марта 2011

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

Ответы [ 6 ]

1570 голосов
/ 15 марта 2013

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

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.

338 голосов
/ 01 марта 2011

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

79 голосов
/ 26 марта 2012

git diff и git apply будут работать для текстовых файлов, но не будут работать для двоичных файлов.

Вы можете легко создать полное двоичное исправление, но вам придется создать временную фиксацию.После того как вы сделали ваш временный коммит (ы), вы можете создать патч с помощью:

git format-patch <options...>

После того, как вы сделали патч, выполните следующую команду:

git reset --mixed <SHA of commit *before* your working-changes commit(s)>

Thisоткатит ваш временный коммит (ы).Окончательный результат оставляет вашу рабочую копию (намеренно) грязной с теми же изменениями, которые у вас были изначально.

На принимающей стороне вы можете использовать тот же трюк, чтобы применить изменения к рабочей копии, не имея истории фиксации,Просто примените патч (ы), и git reset --mixed <SHA of commit *before* the patches>.

Обратите внимание, что вам, возможно, придется хорошо синхронизироваться, чтобы весь этот вариант работал.Я видел некоторые ошибки при применении патчей, когда человек, производящий их, не выпал столько изменений, сколько я.Возможно, есть способы заставить его работать, но я не стал вдаваться в подробности.


Вот как создать такие же патчи в Tortoise Git (я не рекомендую использовать этот инструмент):

  1. Подтвердите свои рабочие изменения
  2. Щелкните правой кнопкой мыши корневой каталог филиала и выберите Tortoise Git -> Create Patch Serial
    1. Выберите любой диапазон значений (Since:FETCH_HEAD будет работать, если вы хорошо синхронизированы)
    2. Создайте патч (ы)
  3. Щелкните правой кнопкой мыши корневой каталог ветки и выберите Tortise Git ->Show Log
  4. Щелкните правой кнопкой мыши на коммите перед вашим временным коммитом и выберите reset "<branch>" to this...
  5. Выберите Mixed параметр

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

  1. Щелкните правой кнопкой мыши корневой каталог филиала и выберите Tortoise Git -> Apply Patch Serial
  2. Выберите правильные патчи и примените их
  3. Щелкните правой кнопкой мыши корневой каталог ветви и выберите Tortise Git -> Show Log
  4. Щелкните правой кнопкой мыши на коммите перед коммитом патча (s) и нажмите reset "<branch>" to this...
  5. Выберите вариант Mixed
30 голосов
/ 13 октября 2015

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

git diff HEAD > file_name.patch
10 голосов
/ 08 октября 2012

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

9 голосов
/ 13 сентября 2018

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

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 .
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...