Есть ли у git одна команда для сброса рабочего дерева в HEAD, но сохранить поэтапные изменения в индексе? - PullRequest
0 голосов
/ 28 января 2020

Я знаю, что в этой топике c есть тонны сообщений, но я не могу найти этот конкретный c ответ.

Очевидно, что способ сделать это будет: git commit поэтапные изменения, git reset --hard HEAD, затем git reset --soft HEAD~, затем git add -u, что довольно многословно.

Поведение по умолчанию для reset - --mixed, которое выполняет обратное тому, о чем я прошу. Для этого, безусловно, должно быть решение с одной командой или, по крайней мере, лучший способ.

Ответы [ 2 ]

2 голосов
/ 28 января 2020

До Git 2.23, №

В Git 2.23 или более поздних версиях git restore может выполнять работу:

git restore -s HEAD

Обратите внимание, что git stash -k не сделать трюк: он оставляет рабочее дерево, соответствующее index , а не HEAD commit. 1

Во всех Git версиях начиная с 2.5, он может проще и / или лучше использовать git worktree add для создания второго рабочего дерева на основе текущего коммита:

git worktree add --detach <path> HEAD

где <path> - это то место, где вы хотите, чтобы новое рабочее дерево отображалось вверх. Преимущество в том, что вы не касаетесь существующего рабочего дерева. (В Git версиях до 2.15 я советую сделать то, что вы делаете в этом добавленном рабочем дереве, в течение двух недель, а затем удалить его, поскольку в этих версиях Git есть небольшая неприятная ошибка, связанная с добавленными рабочими деревьями. Если вы просто делаете это для файлов рабочего дерева , ошибка сама по себе безвредна.)

В версиях Git до 2.23 вы можете сделать:

git stash
# do whatever your job is here, followed by `git reset --hard` if needed
git stash apply --index
git stash drop

(или git stash pop --index; я просто хотел бы оставить заявку и отказаться от нее сам).


1 git stash -k делает две позиции sh фиксируется обычным способом, поэтому они такие же, как всегда. Но затем вместо git reset --hard, что делает обычный не -k git stash, он принудительно корректирует рабочее дерево в соответствии с коммитом sta sh.

Точка git stash -k это позволяет вам запустить какой-то тест, который использует содержимое work-tree , без необходимости извлекать сохраненный индекс в другое рабочее дерево. Например, если у вас есть автоматизированная система тестирования, которая использует то, что находится в рабочем дереве, а не то, что в индексе, вы можете git stash -k, запустить тесты, затем git reset --hard, чтобы снова применить sta sh и применить и отбросить sta sh.

досадно, поскольку git stash не делает sta sh, если индекс и рабочее дерево совпадают HEAD, git stash -k это сложно использовать для проведения такого рода автоматического тестирования, потому что нет никакой гарантии, что оно действительно сделало sh.

1 голос
/ 28 января 2020

Уверен, что вы просите git stash --keep-index

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...