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


100

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

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

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


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. Поэтапные файлы включены в тайник.
— Бенджамин Чеа,
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.