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

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


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

  1. Зафиксируйте свои рабочие изменения
  2. Щелкните правой кнопкой мыши корневой каталог ветки и выберите Tortoise Git -> Создать серийный номер патча
    1. Выберите любой диапазон, который имеет смысл ( Поскольку : FETCH_HEAD будет работать, если вы хорошо синхронизированы)
    2. Создайте патч (патчи)
  3. Щелкните правой кнопкой мыши корневой каталог ветки и щелкните Tortise Git -> Показать журнал
  4. Щелкните правой кнопкой мыши фиксацию перед вашим временным фиксация (и) и нажмите сбросить "" на это ...
  5. Выберите вариант Смешанный

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

  1. Щелкните правой кнопкой мыши корневой каталог ветки и выберите Tortoise Git -> Применить серийный номер патча
  2. Выберите со исправьте исправления и примените их
  3. Щелкните правой кнопкой мыши корневой каталог ветви и выберите Tortise Git -> Показать журнал
  4. Щелкните правой кнопкой мыши фиксацию перед фиксацией (ями) патча и нажмите сбросить "" на это ...
  5. Выберите вариант Смешанный

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

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

  git format-patch   

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

  git reset --mixed   

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

На принимающей стороне вы можете использовать тот же трюк, чтобы применить изменения к рабочей копии, не имея история коммитов. Просто примените патч (патчи) и git reset --mixed .

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


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

  1. Зафиксируйте свои рабочие изменения
  2. Щелкните правой кнопкой мыши корневой каталог ветки и выберите Tortoise Git -> Создать серийный номер патча
    1. Выберите любой диапазон, который имеет смысл ( Поскольку : FETCH_HEAD будет работать, если вы хорошо синхронизированы)
    2. Создайте патч (патчи)
  3. Щелкните правой кнопкой мыши корневой каталог ветки и щелкните Tortise Git -> Показать журнал
  4. Щелкните правой кнопкой мыши фиксацию перед вашим временным фиксация (и) и нажмите сбросить "" на это ...
  5. Выберите вариант Смешанный

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

  1. Щелкните правой кнопкой мыши корневой каталог ветки и выберите Tortoise Git -> Применить серийный номер патча
  2. Выберите со исправьте исправления и примените их.
  3. Щелкните правой кнопкой мыши корневой каталог ветви и выберите Tortise Git -> Показать журнал
  4. Щелкните правой кнопкой мыши фиксацию перед фиксацией (ями) патча и нажмите сбросить "" на это ...
  5. Выберите вариант Смешанный

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

  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  

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

Оцените статью
techsly.ru
Добавить комментарий