Создать 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 (я не рекомендую использовать этот инструмент):

  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. Щелкните правой кнопкой мыши на коммите до коммитов патча и выберите reset "<branch>" to this...
  5. Выберите Mixed вариант

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

git diff HEAD > file_name.patch

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

git format-patch HEAD~<N>

где <N> Количество последних коммитов для сохранения в виде патчей.

Подробности использования команды находятся в DOC

UPD
Здесь вы можете найти, как их применять тогда.

Если вы хотите сделать двоичный файл, дайте --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
Другие вопросы по тегам