Git відрізняється від приховування


1358

Як я можу побачити зміни, які не змінить, внесені в поточне робоче дерево? Я хотів би знати, які зміни будуть внесені перед їх застосуванням!



1
Відносяться пост тут .
— RBT

Відповіді:


1870

Перегляньте останню скриньку:

git stash show -p

Дивіться довільну скриньку:

git stash show -p stash@{1}

Від git stashпосібників:

За замовчуванням команда показує diffstat, але вона прийме будь-який формат, відомий git diff (наприклад, git stash show -p stash @ {1} для перегляду другої останньої скриньки у формі виправлення).


72
stash@{0}є типовим; Вам потрібен аргумент, лише якщо ви хочете подивитися на попередні статки.
— Каскабель

52
Правильно. Я просто поставив це, щоб було зрозуміло, як дивитись на інші статки {0}.
— Бурштин

74
Це не відображатиме різницю між сховищем та поточним робочим режимом, але між скриньоком та оригінальним батьківським. Правильно? На сторінці сторінки: "Показати зміни, зафіксовані в сховці, як різницю між прихованим станом та його початковим початковим початком."
— Магне

14
@ Amber - Правда, хоча, якщо твоє поточне робоче дерево забруднене, воно має значення і робить його трохи складнішим. Я підійшов до цього з того кута, і знайшов процедуру, про яку я поділився у своїй відповіді нижче.
— Магне

6
що означає -pпідставка?
— Джеральд

308

Щоб переглянути останню скриньку:

git stash show -p

Щоб побачити довільну скриньку:

git stash show -p stash@{1}

Також я використовую git diff для порівняння скриньки з будь-якою гілкою.

Ви можете використовувати:

git diff stash@{0} master

Щоб побачити всі зміни порівняно з ведучим відділення.


Або ви можете використовувати:

git diff --name-only stash@{0} master

Щоб легко знайти лише змінені імена файлів.


10
Це не дає відповіді на конкретне запитання. Якщо ви створили скриньку з майстра (щоб зберегти роботу на потім), то виконайте деякі комісії для іншої роботи над майстром, тоді зробіть git diff stash@{0} master, ви отримаєте різницю вашої скрині в порівнянні з поточним майстром (що включає роботу, виконану на master після сховища) було зроблено), а не файли / рядки, про які буде змінено скрипт, про що йдеться.
— Том Де Леу

52
Я радий, що ти відповів на це питання, навіть якщо це не відповідь на точне запитання. Це дало більше інформації, і я думаю, що це чудово знати, як отримати різницю між гілкою та будь-якою іншою галуззю, яку ти хочеш порівняти. Також мені сподобалося дізнатися прапор
— Ребека Уотербері

6
це також дозволяє переглянути розбіжності за допомогою користувацького переглядача різниць, наприкладgit difftool --tool=... stash@{0} HEAD
— Андре Хольцнер

9
@TomDeLeu Добре спостереження та важливий момент. Щоб порівняти прихований предмет з його батьківським, це, здається, працює:git diff stash@{0}^ stash@{0}
— erikprice

1
Крім того, ви можете додати ім'я файлу, git diff stash@{0} master -- filenameщоб отримати зміни до певного файлу.
— Девід

104

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

git diff stash@{0}^!

Це порівнює приховування та зобов'язання, на яких ґрунтується.


так добре, я додав псевдонім до ~/.gitconfig:laststash = diff stash@{0}^!
— Sbeam

5
Ідеальна пара: git difftool stash^!для відмінності останнього тайму від фіксації він базувався, git difftool stash HEADдля відмінності останнього тайму від поточного
— комітету


"git diff stash @ {0} ^!" зводиться до "git diff stash @ {0} ^ stash @ {0} ~ 1 ^ stash @ {0} ~ 2 .......", але, оскільки git diff займає лише 2 коміти, він показує різницю між скришком @ {0} і ^ stash @ {0} ~ 1 і виглядає ^ на початку 2-го коміту не відрізняється, а git ігнорує це.
— Нага Кіран

Я вважаю за краще, щоб ця версія могла використовувати мій бажаний інструмент "розрізнення" (Поза межами порівняння!). Це також показує зміну цього скриньки, яке, на мою думку, є оригінальним питанням, на відміну від альтернативи, згаданої у вищезазначених коментарях, "git diff stash @ {X} ^ stash @ {X}", яка показує більше, ніж просто прихований розл.
— користувач107172

44

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

Ви також можете скористатися наступним підходом, щоб порівняти два сташі один з одним (у такому випадку спочатку просто викладіть одну із скринь).

  • Введіть ваше брудне робоче дерево:

    git add .
    git commit -m "Dirty commit"
    
  • Відмінніть скриньку від цього коміту:

    git diff HEAD stash@{0}
    
  • Потім ви можете скасувати команду і повернути її в робочий режим:

    git reset --soft HEAD~1
    git reset .
    

Тепер ви розрізнили брудне робоче дерево зі сховищем та повертаєтесь туди, де ви були спочатку.


Чи є спосіб зробити це, окрім того, щоб побачити лише розрізнення файлів, які були б змінені тим, що знаходиться в сховці?
— lagweezle

У 2020 році це набагато простіше; перевірити мою останню відповідь .
— Девід Депрост

Цікаво, про що я не знав git stash show -l . Чи відрізняється вона від останньої скриньки від робочої (брудної) копії? Як ви користуєтесь ним, не отримуючи error: switch l requires a value?
— Магне

Так, це відрізняється від (можливо, брудної) робочої копії. Ви використовуєте його просто, ввівши git stash show -l. Що стосується того, чому це не працює для вас, я можу лише здогадуватися, що ви могли бути на старій версії git? Я на git v2.20.1, і він працює бездоганно без помилок.
— Девід Депрост

25

@ Магна відповідь є єдиним (дуже пізно) датою, відповіді найбільш гнучкою / корисної інтерпретація питання, але справедливе трохи складнішим , ніж це необхідно. Замість того, щоб робити та скидати, просто сховіть свою робочу копію, порівняйте та видаліть.

git stash save "temp"
git diff stash@{0} stash@{1}
git stash pop

Це показує вам відмінності між вершиною стека та вашою робочою папкою, тимчасово перетворюючи зміни робочої папки у верхню частину стека (stash @ {0}), переміщуючи початковий верхній вниз (stash @ {1} ), а потім порівнюючи використання вихідного верху в позиції "новий набір", щоб ви побачили зміни, які були б наслідком застосування його поверх вашої поточної роботи.

"Але що робити, якщо я не маю поточної роботи?" Тоді ви у звичайному нудному випадку. Просто використовуйте відповідь @ Amber

git stash show

або відповідь @ czerasz

git diff stash@{0}

або визнати, що прибирання та зняття волосся швидко і легко, просто зніміть зміни та огляньте їх. Якщо ви не хочете, щоб їх наразі викидайте (поточний індекс / робоча папка змінюється). Повністю це

git stash apply
git diff
git reset
git checkout

3
Цей простий підхід (сховати, а потім порівняти з іншим сховищем) безпечний і зрозумілий. Для деяких випадків використання ви можете також git stash save -u
— зберігати непотрібні

19

Це працює для мене на версії 1.8.5.2 git:

git diff stash HEAD

2
Зман! Питання полягає в тому, як я можу побачити зміни, які буде скасовано в поточному робочому дереві? Це показує різницю між сховищем та ГОЛОВОЮ, яка може бути ДУЖЕ відрізнятися від того, що буде застосовано git stash apply.
— MikeJansen

Будь ласка, прочитайте детальніше питання "Я хотів би знати, які зміни будуть внесені перед їх застосуванням!". Я даю швидку відповідь на це.
— yerlilbilgin

Також ви можете бачити, що всі інші відповіді якимось чином відрізняються від поточної голови (або робочого набору) проти сховища. Чому лише моя відповідь вводить в оману? Це не справедливо.
— yerlilbilgin

@yerlilbilgin Дивіться мою відповідь на вашу відповідь нижче.
— MikeJansen

Ми можемо опустити HEAD, це за замовчуванням, чи не так?
— Ал.Г.

10

На всякий випадок, щоб порівняти файл у робочому дереві та в скрині, скористайтеся командою нижче

git diff stash@{0} -- fileName (with path)

9

Якщо у вас є інструменти для розходження (наприклад, поза порівнянням)

git difftool stash HEAD

1
Зман! Питання полягає в тому, як я можу побачити зміни, які буде скасовано в поточному робочому дереві? Це показує різницю між сховищем та ГОЛОВОЮ, яка може бути ДУЖЕ відрізнятися від того, що буде застосовано git stash apply.
— MikeJansen

1
Якщо ви вважаєте, що це вводить в оману, перевірте всі інші відповіді. Це не справедливо!
— yerlilbilgin

1
Ви зауважите, що я скопіював цей самий коментар до іншої відповіді, який був так само неправдивим (майже та сама відповідь). Інші відповіді, які вже мали подібний коментар, я залишив у спокої. Якщо ви розумієте, як працює git stash, тоді ви зрозумієте, що розмежування скриньки проти HEAD - це не те, що застосовується (про що запитує ОП). Фактичний "приховування" - це відмінність між прихованим комітетом і тим, що було до цього. Потім цей пластир наноситься на HEAD. Отже, якщо ви хочете знати, що запитувала ОП, ви повинні показати різницю між сховищем та зобов’язанням перед ним, що правильні відповіді.
— MikeJansen

1
Це відповідає на питання більш безпосередньо, ніж будь-який інший (без потреби) довгих відповідей, і робить саме те, що задав ОП, не маючи вилучення HEAD. Я міг би змінити відповідь @ yerlilbilgin для видалення HEAD, але я думаю, що кожен, хто використовує git, може зрозуміти цю частину, і я подовжуючи відповідь зробить її менш зрозумілою. Ніхто не звинувачує @yerlibilgin.
— Шрідхар Сарнобат

4

Один із способів зробити це, не рухаючи нічого, - скористатися тим, що patchможе читати git diff (уніфікована різниця)

git stash show -p | patch -p1 --verbose --dry-run

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


2

Поєднуючи те, що я дізнався у цій темі та в цій , коли я хочу побачити "що всередині скриньки", я спочатку запускаю:

git stash show stash@{0}

Це покаже, які файли були змінені. Потім, щоб отримати гарну візуальну різницю в difftool, я роблю:

git difftool --dir-diff stash@{0} stash@{0}^

Це відобразить всі відмінності одразу даного скриньку щодо його батьків.

Ви можете налаштувати інструмент diff у ~/.gitconfig, наприклад, за допомогою Meld :

...
[diff]
    tool = meld

1

FWIW Це може бути трохи зайвим для всіх інших відповідей і дуже схоже на прийняту відповідь, яка знаходиться на місці; але, можливо, це комусь допоможе.

git stash show --helpдасть тобі все, що тобі потрібно; включаючи інформацію про приховування шоу.

показати [<сташ>]

Показати зміни, записані в сховці даних, як відмінності між прихованим станом та його початковим батьківським. Коли не вказано, показується найновіший. За замовчуванням команда показує diffstat, але вона прийме будь-який формат, відомий git diff (наприклад, git stash show -p stash @ {1} для перегляду другої останньої скриньки у формі виправлення). Ви можете використовувати конфігураційні змінні stash.showStat та / або stash.showPatch для зміни поведінки за замовчуванням.


1

Вона списку схованок

git stash list 
stash@{0}: WIP on feature/blabla: 830335224fa Name Commit
stash@{1}: WIP on feature/blabla2: 830335224fa Name Commit 2

Тож отримайте номер скриньки і зробіть:

Ви можете зробити:

 git stash show -p stash@{1}

Але якщо ви хочете, щоб різниця (це інакше, щоб показати скриньку, тому я пишу цю відповідь. DiffРозгляньте поточний код у вашій галузі та showпросто покажіть, що ви будете застосовувати )

Ви можете використовувати:

git diff stash@{0}

або

git diff stash@{0} <branch name>

Ще одна цікава річ:

git stash apply
git stash apply stash@{10}

Це стосується прихованої скриньки, не видаляючи її зі списку, ви можете git checkout .видалити ці зміни або якщо ви радіgit stash drop stash@{10} вийняти приховування зі списку.

Звідси я ніколи не рекомендую використовувати git stash popта використовувати комбінацію git stash applyта git stash dropЯкщо ви застосуєте приховану скриньку в неправильній гілці ... ну іноді важко відновити код.


1

Залежно від того, з чим ви хочете порівняти скриньку (локальне робоче дерево / батьківська комісія / головна фіксація), насправді є кілька команд, серед яких старі добрі git diffта більш конкретні git stash show:

╔══════════════════════╦═══════════════════════════════╦═══════════════════╗
║ Compare stash with ↓ ║ git diff                      ║ git stash show    ║
╠══════════════════════╬═══════════════════════════════╬═══════════════════╣
║ Local working tree   ║ git diff stash@{0}            ║ git stash show -l ║
║----------------------║-------------------------------║-------------------║
║ Parent commit        ║ git diff stash@{0}^ stash@{0} ║ git stash show -p ║
║----------------------║-------------------------------║-------------------║
║ HEAD commit          ║ git diff stash@{0} HEAD       ║   /               ║
╚══════════════════════╩═══════════════════════════════╩═══════════════════╝

Незважаючи git stash showна те, що з першого погляду виглядає більш зручним для користувача, git diffвін насправді є більш потужним, оскільки дозволяє вказувати назви файлів для більш цілеспрямованого розгляду. Я особисто створив псевдоніми для всіх цих команд у своєму плагіні zsh git .

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