Как отформатировать патч с тем, что я припрятал


146

В git я прячу свои изменения. Могу ли я создать патч из того, что припрятал? А затем применить этот патч в каком-нибудь другом репозитории (мой коллега)?

Я знаю git format-patch -1, но думаю, что это за то, что я совершил. Но я ищу то же самое для изменений, которые я спрятал.

А как я могу применить патч в другом репозитории?

Ответы:


164

Конечно, git stash showподдерживает это:

git stash show -p

Итак, используйте

git stash list

чтобы узнать номер тайника, который вы хотите экспортировать как патч, затем

git stash show -p stash@{<number>} > <name>.patch

экспортировать его.

Например:

git stash show -p stash@{3} > third_stash.patch

1
У меня есть связанный с этим вопрос о применении патча. Скажем, мой патч касается нескольких файлов. Есть ли способ применить патч «интерактивно»? Выберите, к каким файлам патча я должен применить патч? Могу ли я сделать это?
silverburgh

1
@silverburgh: Я быстро просмотрел man patchи не увидел никаких вариантов для интерактивного применения патчей. Однако, поскольку файлы патчей сами по себе представляют собой простые текстовые файлы, обычно нужно отредактировать патч в текстовом редакторе, чтобы вырезать соответствующие части для применения patch. В качестве альтернативы, если вы применяете патч в другом репозитории Git, вы можете применить его все, а затем выборочно git checkoutфайлы, которые вы не хотите изменять ( git checkoutс именем файла отбрасываются неустановленные изменения).
Грег Хьюгилл

1
@silverburgh вы можете ограничить набор исправленных файлов с помощью параметров "--exclude" и "--include" команды git apply.
Кельвин

@silverburgh, вы можете сделать следующее, если у вас есть патч. примените патч полностью, а затем сделайте это, git add --interactive ${YOUR_FILES}и это даст вам возможность частично зафиксировать.
Александр О

15
Спасибо. У меня это сработало:git stash show -p stash@{1} > patch.txt
Райан

66

Этот ответ предоставляет информацию как о сохранении патча, так и о его применении там, где вы хотите его использовать.

Чтобы сохранить вывод в файле:

 git stash show -p --color=never > my-patch-name.patch

Убедитесь, что патч выглядит хорошо:

git apply --stat my-patch-name.patch

Убедитесь в отсутствии ошибок:

git apply --check my-patch-name.patch

Применить патч

git apply my-patch-name.patch

Этот работал у меня с файлами с простым текстовым кодом, но мне пришлось учитывать пробелы. Убедитесь, что патч выглядит хорошо: git apply --check --ignore-space-change --ignore-whitespace my-patch-name.patch Примените патч: git apply --ignore-space-change --ignore-whitespace my-patch-name.patch
Крейг Боланд,

Красивое и лаконичное объяснение. Чтобы он работал, мне нужно было быть в корне репо при применении патча, иначе git applyне получилось бы различий.
Макс

17

Использовать

$> git stash list
stash@{0}: WIP on master: 84fx31c Merged with change to /public/
stash@{1}: WIP on master: 463yf85 FlupResource: also takes json as a query parameter

чтобы получить список недавно спрятанных вещей. Git фактически создает объекты фиксации, когда вы храните их.

Они такие же коммиты, как и все остальное. Вы можете проверить их в ветке:

$> git checkout -b with_stash stash@{0}

Затем вы можете опубликовать эту ветку, и ваш коллега сможет объединить или выделить этот коммит.


15

Вышеупомянутые решения не будут работать с двоичными данными. Следующее добавляет поддержку для него:

git stash show stash@{0} -p --binary

редактировать

Примечание: я просто хотел добавить комментарий к приведенным выше ответам, но моей репутации недостаточно.


3

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

скажем, в ветке A вы спрятали некоторые изменения, называемые stash @ {1}.

теперь вы переключаетесь на ветку B. вы можете просто сделать:

$git stash apply stash@{1}

это применяет изменения вашей ветки A к ветке B.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.