Допустим, у меня есть незафиксированные изменения в моем рабочем каталоге. Как я могу сделать патч из них, не создавая фиксации?
git diff
для неустановленных изменений.
git diff --cached
для поэтапных изменений.
git diff HEAD
как для поэтапных, так и для неустановленных изменений.
Если вы еще не зафиксировали изменения, тогда:
git diff> mypatch.patch
Но иногда бывает, что часть того, что вы делаете, — это новые файлы, которые не отслеживаются и не будут в вашем git diff
output. Итак, один из способов сделать патч — подготовить все для новой фиксации ( git add
каждый файл или просто git add.
), но не выполните фиксацию, а затем:
git diff --cached> mypatch.patch
Добавьте параметр ‘binary’, если вы хотите добавить в патч двоичные файлы (например, mp3-файлы):
git diff --cached --binary> mypatch.patch
Вы можете позже применить патч:
git apply mypatch.patch
Если вы еще не зафиксировали изменения, тогда:
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
git diff
и git apply
будут работать для текстовых файлов, но не будут работать для двоичных файлов. .
Вы можете легко создать полный двоичный патч, но вам нужно будет создать временную фиксацию. После того, как вы сделали временные фиксации, вы можете создать патч с помощью:
git format-patch
После внесения патча выполните следующую команду:
git reset --mixed
Это откатит вашу временную фиксацию (и). Конечный результат оставляет вашу рабочую копию (намеренно) грязной с теми же изменениями, которые были у вас изначально.
На принимающей стороне вы можете использовать тот же трюк, чтобы применить изменения к рабочей копии, не имея история фиксации. Просто примените патч (патчи) и git reset --mixed
.
Обратите внимание, что вам может потребоваться хорошо синхронизирован, чтобы вся эта опция работала. Я видел некоторые ошибки при применении патчей, когда человек, который их делал, не внес столько изменений, сколько я. Вероятно, есть способы заставить его работать, но я не вдавался в подробности.
Вот как создать такие же патчи в Tortoise Git (не то чтобы я рекомендовал использовать этот инструмент):
- Зафиксируйте свои рабочие изменения
- Щелкните правой кнопкой мыши корневой каталог ветки и выберите
Tortoise Git
->Создать серийный номер патча
- Выберите любой диапазон, который имеет смысл (
Поскольку
:FETCH_HEAD
будет работать, если вы хорошо синхронизированы) - Создайте патч (патчи)
- Выберите любой диапазон, который имеет смысл (
- Щелкните правой кнопкой мыши корневой каталог ветки и щелкните
Tortise Git
->Показать журнал
- Щелкните правой кнопкой мыши фиксацию перед вашим временным фиксация (и) и нажмите
сбросить "" на это ...
- Выберите вариант
Смешанный
И как их применить:
- Щелкните правой кнопкой мыши корневой каталог ветки и выберите
Tortoise Git
->Применить серийный номер патча
- Выберите со исправьте исправления и примените их
- Щелкните правой кнопкой мыши корневой каталог ветви и выберите
Tortise Git
->Показать журнал
- Щелкните правой кнопкой мыши фиксацию перед фиксацией (ями) патча и нажмите
сбросить "" на это ...
- Выберите вариант
Смешанный
git diff
и git apply
будут работать для текстовых файлов, но не будут работать для двоичных файлов.
Вы можете легко создать полный бинарный патч, но вам нужно будет создать временную фиксацию. После того, как вы сделали временные фиксации, вы можете создать патч с помощью:
git format-patch
После внесения патча выполните следующую команду:
git reset --mixed
Это откатит вашу временную фиксацию (и). Конечный результат оставляет вашу рабочую копию (намеренно) грязной с теми же изменениями, которые были у вас изначально.
На принимающей стороне вы можете использовать тот же трюк, чтобы применить изменения к рабочей копии, не имея история коммитов. Просто примените патч (патчи) и git reset --mixed
.
Обратите внимание, что вам может потребоваться хорошо синхронизирован, чтобы вся эта опция работала. Я видел некоторые ошибки при применении патчей, когда человек, который их делал, не внес столько изменений, сколько я. Вероятно, есть способы заставить его работать, но я не вдавался в подробности.
Вот как создать такие же патчи в Tortoise Git (не то чтобы я рекомендовал использовать этот инструмент):
- Зафиксируйте свои рабочие изменения
- Щелкните правой кнопкой мыши корневой каталог ветки и выберите
Tortoise Git
->Создать серийный номер патча
- Выберите любой диапазон, который имеет смысл (
Поскольку
:FETCH_HEAD
будет работать, если вы хорошо синхронизированы) - Создайте патч (патчи)
- Выберите любой диапазон, который имеет смысл (
- Щелкните правой кнопкой мыши корневой каталог ветки и щелкните
Tortise Git
->Показать журнал
- Щелкните правой кнопкой мыши фиксацию перед вашим временным фиксация (и) и нажмите
сбросить "" на это ...
- Выберите вариант
Смешанный
И как их применить:
- Щелкните правой кнопкой мыши корневой каталог ветки и выберите
Tortoise Git
->Применить серийный номер патча
- Выберите со исправьте исправления и примените их.
- Щелкните правой кнопкой мыши корневой каталог ветви и выберите
Tortise Git
->Показать журнал
- Щелкните правой кнопкой мыши фиксацию перед фиксацией (ями) патча и нажмите
сбросить "" на это ...
- Выберите вариант
Смешанный
Чтобы создать патч как с измененными, так и с новыми файлами (поэтапно), вы можете запустить:
git diff HEAD> file_name.patch
Чтобы создать патч с измененными и новыми файлами (поэтапно), вы можете запустить:
git diff HEAD> имя_файла.patch
Мне нравится:
git format-patch HEAD ~
где
— количество последних коммитов для сохранения как патчи.
Подробная информация о том, как использовать команду, находится в DOC
UPD g>
Здесь вы можете узнать, как их применить.
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 format-patch HEAD ~
, где
— количество последних коммитов для сохранения в виде исправлений.
Подробная информация о том, как использовать команду, находится в 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.
Если вы хотите использовать двоичный код, укажите параметр - binary
при запуске git diff код>.
Если вы хотите использовать двоичный код, укажите - двоичный
при запуске git diff
.
Мы также можно указать файлы, чтобы включить только файлы с относительными изменениями, особенно когда они охватывают несколько каталогов ex
git diff ~/path1/file1.ext ~/path2/file2 .ext ... fileN.ext> ~/Any_path/Any_name.patch
Я обнаружил, что это не указано в ответах или комментариях, которые являются актуальными и правильными, поэтому выбрал добавить это. Явное лучше, чем неявное!
Мы также можем указать файлы, чтобы включить только файлы с относительными изменения, особенно когда они охватывают несколько каталогов ex
git diff ~/path1/file1.ext ~/path2/file2.ext ... fileN.ext> ~/Any_path/ Any_name.patch
Я обнаружил, что это не указано в ответах или комментариях, которые являются актуальными и правильными, поэтому решил добавить его. Явное лучше, чем неявное!