Git stash uncached: как убрать все неустановленные изменения?

100

Предположим, что в проект с версией git внесены два набора изменений. Один сет постановочный, другой - нет.

Я хочу перепроверить поэтапные изменения, запустив свой проект в этом состоянии (до фиксации). Каков простой способ убрать все неустановленные изменения и оставить только постановочные? Поэтому мне нужно, чтобы неустановленные изменения исчезли из моего проекта, но были где-то сохранены для дальнейшей работы.

Это очень похоже на git stashкоманду. Но git stashубрал бы как неустановленные, так и постановочные изменения из моего проекта. И я не могу найти что-то подобное git stash uncached.

klm123
источник
1
На сегодняшний день с моим git 2.21 на этот вопрос все еще нет хорошего ответа. Все ответы ниже либо неверны ( -kвариант), либо неудобны в использовании.
Penghe Geng

Ответы:

100

Обновление 2:
я не уверен, почему люди жалуются на этот ответ, похоже, он отлично работает со мной, для неотслеживаемых файлов вы можете добавить -uфлаг

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

А вот отрывок из git-stashсправки

Если используется опция --keep-index, все изменения, уже добавленные в индекс, остаются без изменений.

Если используется параметр --include-untracked, все неотслеживаемые файлы также сохраняются, а затем очищаются с помощью git clean, оставляя рабочий каталог в очень чистом состоянии. Если вместо этого используется параметр --all, игнорируемые файлы сохраняются и очищаются в дополнение к неотслеживаемым файлам.

А вот гифка того, как это выглядит:

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

Обновить:

Несмотря на то, что это выбранный ответ, многие отметили, что [ответ ниже] (https://stackoverflow.com/a/34681302/292408) является правильным, я рекомендую проверить его.

Я снова проверил свой ответ сегодня (31.01.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 вы можете интерактивно выбирать блоки из разницы между HEAD и рабочим деревом, которые нужно сохранить».
здесь
1
Я обычно add -p, checkout -pне и reset -p, не пробовал stash -p, спасибо за совет: D
Мохаммад AbuShady
21
Обратите внимание, что этот ответ также сохранит внесенные вами изменения.
Бен Флинн,
1
Этот ответ бесполезен, поскольку приведет к путанице. Этот ответ лучше stackoverflow.com/a/34681302/292408 .
Элайджа Линн
1
@ElijahLynn Я связался с другим ответом, так как я нашел много людей, которые говорят, что это лучший ответ, спасибо за ваш комментарий
Mohammad AbuShady
108

Принятый ответ также содержит поэтапные изменения, как отметили некоторые. Вот способ сделать это, не получая поэтапных изменений в тайнике.

Идея состоит в том, чтобы сделать временную фиксацию ваших поэтапных изменений, затем спрятать неустановленные изменения, а затем отменить фиксацию временной фиксации:

# 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
ИМО, это действительно правильный ответ. Параметр --keep-indexв текущем принятом ответе по-прежнему сохраняет то, что находится в индексе, но также сохраняет его в индексе. Итак, это дублируется, и возникает веселье.
Кен Уильямс
4
@KenWilliams <del> веселье </del> <ins> трагедия </ins>
tuespetre
@KenWilliams Это меня действительно раздражало. OP, вы можете изменить выбранный ответ?
MikeMurko
2
git add .Шаг может хотеть быть улучшен , git add --allкак следует захватить файлы в директории выше текущей рабочей директории тоже.
Элайджа Линн
1
На данный момент это лучший ответ, поскольку параметр --keep-index в принятом ответе вводит в заблуждение. Это должен быть принятый ответ.
Элайджа Линн
22

Я обнаружил, что отмеченный ответ не сработал для меня, так как мне нужно было что-то, что действительно спрятало только мои неустановленные изменения. Отмеченный ответ 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-files", чтобы найти и включить их в патч diff
ACyclic
5

Git: спрятать неустановленные изменения

Это сохранит все изменения, которые вы не добавляли с помощью git add:

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. Поэтапные файлы включены в тайник.
Бенджамин Чеа,