Як я можу відформатувати патч із тим, що я сховую


140

В git я приховую свої зміни. Чи можливо я можу створити виправлення з тим, що приховую? А потім застосувати цей патч у якомусь іншому сховищі (у мого колеги)?

Я знаю git format-patch -1, але думаю, що це за те, що я домігся. Але я шукаю те саме, що стосується змін, які я приховав.

І як я можу застосувати виправлення в іншому сховищі?

Відповіді:


156

Звичайно, 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
У мене пов'язане питання щодо застосування патчу. Скажімо, мій патч торкається декількох файлів. Чи є спосіб застосувати виправлення «інтерактивно»? Виберіть, до яких файлів патча я повинен застосувати патч? Чи можу я це зробити?
сріблобур

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

1
@silverburgh ви можете обмежити набір файлів, виправлених, використовуючи параметри "--exclude" та "--include" git.
Келвін

@silverburgh ви можете зробити наступне, якщо припустити, що ви маєте виправлення. застосуйте виправлення повністю, а потім зробіть, git add --interactive ${YOUR_FILES}і це дасть вам можливість частково виконати.
Олексій

15
Дякую. Це працювало для мене:git stash show -p stash@{1} > patch.txt
Райан

63

Ця відповідь містить інформацію про збереження патча та його застосування там, де ви хочете його використовувати.

Щоб сховати вихід у файл:

 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не підбирав розл.
Макс

16

Використовуйте

$> 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}

Потім ви можете опублікувати цю гілку, і ви, колега, зможете об'єднати або вишнево взяти цю команду.


13

Наведені вище рішення не працюватимуть для двійкових даних. Додано підтримку для неї:

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

Редагувати

Примітка. Я просто хотів додати коментар до вищезазначених відповідей, але моя репутація недостатня.


3

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

скажімо, на гілці A ви приховали деякі зміни, які називаються прихованими @ {1}.

Ви переходите до відділення B. Ви можете просто зробити:

$git stash apply stash@{1}

це стосується зміни вашого відділення A на гілку B.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.