Сжатие только неустановленных изменений в Git

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

  • Добавить изменения на сцене.
  • Отметьте все остальные изменения, которые не были поставлены.
  • Сделайте некоторые вещи с вещами на сцене (например, выполните сборку, запустите тесты и т.д.).
  • Примените кошелек.

Есть ли способ сделать шаг 2?

Пример

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

Ответ 1

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

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

Ответ 2

git stash save --keep-index

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

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

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

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

Ответ 3

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

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

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

Ответ 4

С помощью git version 2.7.4 вы можете:

git stash save --patch

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

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

git stash pop

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

git stash apply

Ответ 5

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

сначала закройте все, но оставьте поэтапные изменения неповрежденными

$git сохранить резервную копию --keep-index [-include-untracked]

теперь также сбрасывают поэтапные изменения отдельно

$git сохранение закладок

внести изменения для исправления; и испытание; зафиксируйте их:

$git добавить [--interactive] [--patch]

$git commit -m "fix..."

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

$git stash pop

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

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

Ответ 6

Другой совет, связанный с вопросом:

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

$git сохранить резервную копию --keep-index

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

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

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

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

$git сохранить сохранение "поэтапных изменений для функции X"

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

$git применить stash "stash @{1}" ### ✘ не совсем то, что вам может понадобиться

чтобы восстановить только неустановленные изменения.

Ответ 7

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

git stash -k

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

git stash pop

Ответ 8

У 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, вероятно, будет проще.

Ответ 9

Поскольку 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" означает "тайник без ножек")


Объяснение:

У нас есть две конечные цели для конечного состояния:

  1. Постановочные изменения остаются прежними
  2. Неустановленные изменения в тайник

В приведенном выше псевдониме:

  • ! означает выполнение этой строки с оболочкой
  • Сначала мы делаем временную фиксацию для поэтапных изменений
  • Затем мы храним оставшиеся изменения, которые будут неустановленными (цель № 2 достигнута)
  • Затем мы делаем git reset --soft HEAD~1 чтобы отменить временную фиксацию и переместить эти изменения в индекс (объект №1 достигнут)

Ответ 10

Современная форма этой команды - 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 действительно успешно обновлен.