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.