Git stash uncached: як прибрати всі нестандартні зміни?


96

Припустимо, в проект внесено два набори змін із версією git. Один набір сценічний, а інший - ні.

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

Це дуже нагадує git stashкоманду. Але я git stashб відклав як нестадійні, так і інсценізовані зміни від мого проекту. І я не можу знайти щось подібне git stash uncached.


На сьогоднішній день у моєму git 2.21 на це все ще немає хорошої відповіді. Усі відповіді нижче є неправильними ( -kваріант) або громіздкими у використанні.
Penghe Geng

Відповіді:


99

Оновлення 2:
Я не впевнений, чому люди скаржаться на цю відповідь, схоже, він ідеально працює зі мною, для непророблених файлів ви можете додати -uпрапор

Повна команда стає git stash --keep-index -u

І ось фрагмент git-stashдовідки

Якщо використовується параметр --keep-index, всі зміни, вже додані до індексу, залишаються недоторканими.

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

І це gif того, як це виглядає:

введіть тут опис зображення

Оновлення:

Незважаючи на те, що це обрана відповідь, багато хто зазначав, що [відповідь нижче] (https://stackoverflow.com/a/34681302/292408) є правильною, я рекомендую перевірити її.

Сьогодні я знову перевірив свою відповідь (31/1/2020) щодо версії git 2.24.0, і я досі вважаю, що вона правильна. Якщо ви вважаєте, що це не працює, також згадайте вашу версію git.

Стара відповідь :
Якщо використовується --keep-indexпараметр, усі зміни, вже додані до індексу, залишаються недоторканими:

git stash --keep-index

З документаціїgit-stash :

Тестування часткових комітів

Ви можете використовувати, git stash save --keep-indexколи ви хочете зробити два або більше комітів із змін у робочому дереві, і ви хочете перевірити кожну зміну перед фіксацією:

# ... hack hack hack ...
$ git add --patch foo            # add just first part to the index
$ git stash save --keep-index    # save all other changes to the stash
$ edit/build/test first part
$ git commit -m 'First part'     # commit fully tested change
$ git stash pop                  # prepare to work on all other changes
# ... repeat above five steps until one commit remains ...
$ edit/build/test remaining parts
$ git commit foo -m 'Remaining parts'

Але якщо ви просто хочете візуально перевірити лише поетапні зміни, ви можете спробувати difftool:

git difftool --cached

4
дивіться також, git stash [-p|--patch]що здається інтерактивним схованням. У розділі man git stash"За допомогою --patch ви можете інтерактивно вибирати куски з різниці між ГОЛОВОЮ та робочим деревом, яке потрібно сховати."
тут

1
Я зазвичай add -p, checkout -pі reset -pніколи не пробував stash -p, дякую за підказку: D
Mohammad AbuShady

19
Зверніть увагу, що ця відповідь також приховає зміни, які ви здійснили.
Бен Флінн

1
Ця відповідь насправді не є корисною, оскільки призведе до плутанини. Цю відповідь краще stackoverflow.com/a/34681302/292408 .
Елайджа Лінн,

1
@ElijahLynn Я зв’язав іншу відповідь, оскільки знайшов багато людей, які кажуть, що це краща відповідь, дякую за ваш коментар
Мохаммад АбуШаді

102

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

Ідея полягає в тому, щоб зробити тимчасовий коміт ваших поетапних змін, потім сховати нестадійні зміни, а потім зняти коміт тимчасового коміту:

# temp commit of your staged changes:
$ git commit --message "WIP"

# -u option so you also stash untracked files
$ git stash -u

# now un-commit your WIP commit:
$ git reset --soft HEAD^

На цьому етапі у вас буде схованка ваших нестадійних змін, і ваші поступові зміни будуть доступні лише у вашій робочій копії.


22
Це справді правильна відповідь IMO. --keep-indexВаріант в поточному загальноприйнятому відповідь ще тайниках , що в індексі, це як раз і утримує його в індексі. Тоді це дублюється, і настає веселість.
Ken Williams,

4
@KenWilliams <del> веселість </del> <ins> трагедія </ins>
вівторок

@KenWilliams Це мене справді дратувало. OP, будь ласка, скорегуйте вибрану відповідь?
MikeMurko

2
git add .Крок може хотіти бути поліпшений , git add --allяк слід захопити файли в директорії вище поточної робочої директорії теж.
Елайджа Лінн,

1
Наразі це найкраща відповідь, оскільки параметр --keep-index у прийнятій відповіді вводить в оману. Це має бути прийнятою відповіддю.
Елайджа Лінн,

21

Я виявив, що позначена відповідь не працює для мене, оскільки мені потрібно щось, що справді затаїло лише мої нестандартні зміни. Позначена відповідь git stash --keep-index,, зберігає як поетапні, так і нестадійні зміни. --keep-indexЧастина просто виходить індекс незайманого на робочій копії , а також. Це працює для OP, але лише тому, що він задав дещо інше запитання, ніж насправді хотів отримати відповідь.

Єдиний справжній спосіб, який я знайшов, щоб приховати незмінні зміни - це взагалі не використовувати схованку:

git diff > unstaged.diff
git apply -R unstaged.diff

git checkout -- .також буде працювати замість apply -R.

Робота Робота Робота ...

git apply unstaged.diff
rm unstaged.diff

1
Тут далі git version 2.6.1.windows.1, git stash -kпрацював, як описано.
koppor

Це має бути прийнятою відповіддю! Це єдиний з декількох потоків stackoverflow, який робить те, що заявляє, і не покладається на виконання тимчасових комітів!
user643011

1
@ user643011: Тимчасові коміти - це не погана річ у git. Вони нічого не коштують і нікому не шкодять.
Fritz

1
@Fritz: У деяких сценаріях жодні тимчасові коміти неможливі. Це може не вдатися, якщо у вас є гачок попереднього фіксації, який перевіряє поточний робочий код. Якщо ваші поетапні зміни хороші, а ваші нестадійні - ні, цей підхід не зможе здійснити поетапні зміни.
Penghe Geng

1
Сюди не входять файли без відстеження. Вам потрібно використовувати "git ls-файли", щоб знайти та включити їх до виправлення
різниці

5

Git: Зберігати незаплановані зміни

Це збереже всі модифікації, які ви не git додали:

git stash -k

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

git stash -k -u 

Крім того, ваш робочий каталог повинен бути чистим (тобто всі зміни потрібно додати), коли ви git stash pop пізніше.

http://makandracards.com/makandra/853-git-stash-unstaged-changes


13
Це еквівалентно git stash --keep-index. Поетапні файли включаються до схованки.
Бенджамін Чеа,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.