Хранение только неустановленных изменений в Git - PullRequest
169 голосов
/ 04 октября 2011

Я бы хотел выполнить следующий рабочий процесс:

  1. Добавить изменения на сцену.
  2. Спрятать все остальные изменения, которые не были поставлены.
  3. Делать что-то с этапами (например, сборка, запуск тестов и т. Д.)

Есть ли способ выполнить шаг 2?

Пример

 echo "123" > foo
 git add foo # Assumes this is a git directory
 echo "456" >> foo
 git stash
 cat foo # Should yield 123

Ответы [ 9 ]

244 голосов
/ 04 октября 2011

git stash save имеет опцию --keep-index, которая делает именно то, что вам нужно.

Итак, запустите git stash save --keep-index.

28 голосов
/ 04 октября 2011
git stash save --keep-index

Кроме того, Re:

Почему бы не зафиксировать свои изменения после их постановки?- Шин

A: Поскольку вы всегда должны проверять проверенный код :) Это означает, что вам нужно запускать тесты с только теми изменениями, которые вы собираетесь зафиксировать

Все это помимо того факта, что, как опытный программист, у вас есть врожденное желание протестировать и просмотреть только эти изменения - только частично шучу

26 голосов
/ 25 апреля 2015

Это можно сделать за 3 шага: сохранить поэтапные изменения, спрятать все остальное, восстановить индекс с поэтапными изменениями. Что в основном:

git commit -m 'Save index'
git stash push -u -m 'Unstaged changes and untracked files'
git reset --soft HEAD^

Это будет делать именно то, что вы хотите.

11 голосов
/ 29 июня 2017

С git version 2.7.4 вы можете сделать:

git stash save --patch

git попросит вас добавить или нет ваши изменения в тайник.
И тогда вы просто отвечаете y или n

Вы можете восстановить рабочий каталог, как всегда:

git stash pop

или, если вы хотите сохранить сохраненные изменения в тайнике:

git stash apply
5 голосов
/ 21 января 2015

Расширяя предыдущие ответы, я иногда ставлю сложный набор изменений, но сначала хочу зафиксировать отдельное изменение.Например, я мог заметить ошибку или другой неправильный код, который я хотел бы исправить перед моими поэтапными изменениями.Один из возможных путей - это:

сначала спрятать все, но оставить инсценированные изменения без изменений

$ git stash save --keep-index [--include-untracked]

теперь также храните поэтапные изменения отдельно

$ git stash save

внести изменения для исправления;и тестирование;передайте их:

$ git add [--interactive] [--patch]

$ git commit -m "fix ..."

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

$ git stash pop

разрешите все конфликты и обратите внимание, что если были конфликты, git будет применяться, но не отбросил эту запись верхнего тайника.

(... Затем зафиксируйте поэтапные изменения, восстановите тайник всех остальных изменений и продолжите ...)

2 голосов
/ 21 января 2015

Еще один совет, связанный с вопросом:

Когда вы эффективно сохраняете свои неотмеченные изменения, используя

$ git stash save --keep-index

вы можете захотеть дать тайнику сообщение, так что когда вы делаете git stash list, становится более очевидным, что вы спрятали ранее, особенно если вы выполняете эту операцию при дальнейшем сохранении.Например,

$ git stash save --keep-index "изменения еще не поставлены"

(хотя на самом деле он содержит все изменения, как отмечено в других ответах).

Например, за вышеприведенным может сразу последовать:

$ git stash save "поэтапные изменения для функции X"

Осторожно, хотя, что вы не можете , тогда используйте

$ git stash apply "stash @ {1}" ### quite не совсем делает то, что вы могли бы

для восстановления только неустановленных изменений.

1 голос
/ 18 декабря 2018

Git не имеет команды, которая хранит только ваши не внесенные изменения.

Git, однако, позволяет указать, какие файлы вы хотите сохранить.

git stash push --message 'Unstaged changes' -- app/controllers/products_controller.rb test/controllers/products_controller_test.rb

Если вы толькочтобы сохранить определенные изменения в этих файлах, добавьте параметр --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 ответ , вероятно, проще.

1 голос
/ 23 ноября 2018

Чтобы добавить непомеченные (не добавленные для фиксации) файлы в stash, выполните следующую команду:

git stash -k

Затем вы можете зафиксировать поставленные файлы.После этого вы можете вернуть последние сохраненные файлы командой:

git stash pop
0 голосов
/ 22 апреля 2019

Современная форма этой команды - 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) .
(Объединено с Junio ​​C Hamano - gitster - в коммит 0ba1ba4 , 22 апреля 2019 г.)

встроенный stash: обработать :(glob) pathspecs снова

При передаче списка спецификаций пути, скажем, git add, мы должны быть осторожно используйте оригинальную форму, а не анализируемую форму pathspecs.

Это имеет значение, например при звонке

git stash -- ':(glob)**/*.txt'

, где исходная форма включает префикс :(glob) при разборе форма не.

Однако во встроенном git stash мы передали проанализированную (то есть неправильную) форму, и git add завершится ошибкой с сообщением об ошибке:

fatal: pathspec '**/*.txt' did not match any files

на этапе, когда git stash удаляет изменения из рабочего дерева, даже если refs/stash действительно успешно обновлено.

...