Ответ 1
git stash save
имеет опцию --keep-index
, которая делает именно то, что вам нужно.
Итак, запустите git stash save --keep-index
.
Я бы хотел сделать следующий рабочий процесс:
Есть ли способ сделать шаг 2?
Пример
echo "123" > foo
git add foo # Assumes this is a git directory
echo "456" >> foo
git stash
cat foo # Should yield 123
git stash save
имеет опцию --keep-index
, которая делает именно то, что вам нужно.
Итак, запустите git stash save --keep-index
.
git stash save --keep-index
Кроме того, Re:
Почему бы не зафиксировать свои изменения после их размещения? - Шин
A: Потому что вы всегда должны проверять проверенный код:) Это означает, что вам нужно запускать тесты только с изменениями, которые вы собираетесь совершить.
Все это, кроме того, что, конечно, как опытный программист, у вас есть врожденное желание испытать и проанализировать только эти изменения - только частично издеваясь над
Это можно сделать в 3 этапа: сохранить поэтапные изменения, спрятать все остальное, восстановить индекс с поэтапными изменениями. Что в основном:
git commit -m 'Save index'
git stash push -u -m 'Unstaged changes and untracked files'
git reset --soft HEAD^
Это будет делать именно то, что вы хотите.
С помощью git version 2.7.4
вы можете:
git stash save --patch
git
попросит вас добавить или не внести изменения в тайник.
И тогда вы просто отвечаете y
или n
Вы можете восстановить рабочий каталог так, как вы это делаете:
git stash pop
или, если вы хотите сохранить сохраненные изменения в тире:
git stash apply
Расширяя предыдущие ответы, я иногда выполняю сложный набор изменений, но сначала хочу совершить отдельное изменение. Например, я, возможно, заметил ошибку или другой неверный код, который я хотел бы исправить, прежде чем мои поэтапные изменения. Один из возможных путей:
сначала закройте все, но оставьте поэтапные изменения неповрежденными
$git сохранить резервную копию --keep-index [-include-untracked]
теперь также сбрасывают поэтапные изменения отдельно
$git сохранение закладок
внести изменения для исправления; и испытание; зафиксируйте их:
$git добавить [--interactive] [--patch]
$git commit -m "fix..."
теперь восстанавливает ранее выполненные изменения:
$git stash pop
разрешить любые конфликты и отметить, что если бы были конфликты, git применил, но не удалил эту верхнюю запись.
(... Затем совершите поэтапные изменения и восстановите регистр всех других изменений и продолжите...)
Другой совет, связанный с вопросом:
Когда вы эффективно сохраняете свои неустановленные изменения, используя
$git сохранить резервную копию --keep-index
возможно, вы захотите передать сообщение, так что, когда вы сделаете git stash list
, это станет более очевидным, что вы уже спрятали раньше, особенно если вы последуете этой операции затира, продолжая экономить. Например
$git изменения сохраняемых изменений --keep-index "еще не поставлены"
(хотя на самом деле он содержит все изменения, как указано в других ответах).
Например, вышеприведенное может быть выполнено сразу:
$git сохранить сохранение "поэтапных изменений для функции X"
Остерегайтесь, однако, что вы не можете, затем используйте
$git применить stash "stash @{1}" ### ✘ не совсем то, что вам может понадобиться
чтобы восстановить только неустановленные изменения.
Чтобы добавить неразмеченные (не добавленные для фиксации) файлы в stash, выполните следующую команду:
git stash -k
Затем вы можете зафиксировать поставленные файлы. После этого вы можете вернуть последние сохраненные файлы с помощью команды:
git stash pop
У Git нет команды, которая прячет только ваши неустановленные изменения.
Однако Git позволяет вам указать, какие файлы вы хотите сохранить.
git stash push --message 'Unstaged changes' -- app/controllers/products_controller.rb test/controllers/products_controller_test.rb
Если вы хотите --patch
только определенные изменения в этих файлах, добавьте --patch
.
git stash push --patch --message 'Unstaged changes' -- app/controllers/products_controller.rb test/controllers/products_controller_test.rb
Опция --include-untracked
позволяет вам хранить неотслеживаемые файлы.
git stash push --include-untracked --message 'Untracked files' -- app/controllers/widgets_controller.rb test/controllers/widgets_controller_test.rb
Запустите git help stash
(или man git-stash
) для получения дополнительной информации.
Примечание. Если ваши неустановленные изменения довольно дезорганизованы, ответ @alesguzik, вероятно, будет проще.
Поскольку git stash --keep-index
все еще хранит индекс (поэтапные изменения), это не совсем ответ. Следующий псевдоним git сделает это:
stashu = !git commit -q -m 'tmp' && git stash -q && git reset -q --soft HEAD~1
Добавьте эту строку в ваш ~/.gitconfig
в разделе [alias]
. И тогда следующая команда достигнет желаемого эффекта:
git stashu
("stashu" означает "тайник без ножек")
Объяснение:
У нас есть две конечные цели для конечного состояния:
В приведенном выше псевдониме:
!
означает выполнение этой строки с оболочкойgit reset --soft HEAD~1
чтобы отменить временную фиксацию и переместить эти изменения в индекс (объект №1 достигнут) Современная форма этой команды - git stash push [--] [<pathspec>...]
, начиная с Git 2. 16+ ( git stash save
устарело)
Вы можете комбинировать это с подстановочной формой, например:
git stash push --all --keep-index ':(glob)**/*.testextension'
Но это не работает с Git для Windows, пока Git 2.22 (Q2 2019), см. Выпуск 2037, учитывая, что git stash
был повторно реализован в C (вместо сценария оболочки)
См. Коммит 7db9302 (11 марта 2019 г.) Томаса Гуммерера (tgummerer
).
См. Коммит 1366c78, коммит 7b556aa (07 марта 2019 г.) Йоханнеса dscho
(dscho
).
(Объединено Junio C Hamano - gitster
- в коммите 0ba1ba4, 22 апреля 2019 г.)
снова встроенный
stash
: handle:(glob)
pathspecsПри передаче списка спецификаций пути, скажем,
git add
, мы должны быть осторожны, чтобы использовать исходную форму, а не разобранную форму спецификаций пути.Это имеет значение, например, при звонке
git stash -- ':(glob)**/*.txt'
где исходная форма включает префикс
:(glob)
а анализируемая форма - нет.Однако во встроенном
git stash
мы передали проанализированную (то есть неправильную) форму, иgit add
завершится ошибкой с сообщением об ошибке:fatal: pathspec '**/*.txt' did not match any files
на этапе, когда
git stash
удаляет изменения из рабочего дерева, даже еслиrefs/stash
действительно успешно обновлен.