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.