Я не видел этого решения, которое не требует использования git stash
:
Вам даже не нужно использовать git stash
. Вы можете решить это с помощью специальной ветки , как описано здесь. (ветки дешевые).
В самом деле, вы можете изолировать по отдельности не- и поэтапные изменения с помощью нескольких последовательных команд, которые можно связать вместе в псевдоним git:
Создайте новую ветку и переключитесь на нее, в которой вы будете фиксировать отдельно поэтапные и неустановленные изменения: см. Здесь
В любой момент вы можете git cherry-pick -e
одну фиксацию из созданной ветки, чтобы применить ее там, где вы хотите (-e
, чтобы изменить ее сообщение фиксации).
Когда он вам больше не нужен, вы можете удалить эту ветку тайника. Возможно, вам придется использовать параметр -D
для принудительного удаления (вместо обычного параметра -d
), потому что указанная ветвь не объединяется, и git может подумать, что вы рискуете потерять данные, если удалите ее. Это верно, если у вас нет выбранных коммитов, которые были на нем до удаления:
git branch -D separated-stashes
Вы также можете добавить псевдоним к своему ~/.gitconfig
, чтобы автоматизировать это поведение:
git config --global alias.bratisla '!git switch -c separated-stashes; git commit -m "staged changes"; git add -u; git commit -m "unstaged changes"; git switch -' # why this name ? : youtu.be/LpE1bJp8-4w
перед хранением
после сохранения
Конечно, вы также можете добиться того же результата, используя два последовательных тайника
Как указано в других ответах, у вас есть несколько способов спрятать только неустановленные или только поэтапные изменения, используя git stash (-k|--keep-index)
в сочетании с другими командами.
Я лично считаю, что параметр -k
очень сбивает с толку, поскольку он хранит все, но сохраняет поэтапные изменения в поэтапном состоянии (это объясняет, почему --keep-index
). В то время как прятание чего-либо обычно перемещает его в тайник. С -k
неустановленные изменения хранятся в обычном режиме, а поэтапные просто копируются в ту же запись тайника.
Шаг 0: у вас есть две вещи в вашем статусе git: файл, содержащий поэтапные изменения, и другой файл, содержащий неустановленные изменения.
Шаг 1: спрятать неустановленные + поэтапные изменения, но сохранить поэтапные в индексе:
git stash -k -m "all changes"
Часть -m "..."
является необязательной, git stash -k
на самом деле является псевдонимом для git stash push -k
(который ничего не передает удаленно, кстати, не беспокойтесь), который принимает параметр -m
для обозначения ваших записей для ясности (например, сообщение фиксации или тег, но для тайника Вход). Это более новая версия устаревшего git stash save
.
Шаг 1bis (необязательно):
git stash
Спрятанные поэтапные изменения (которые все еще находятся в индексе). Этот шаг не является обязательным для следующего, но показывает, что вы можете вносить только поэтапные изменения в запись тайника, если хотите. Если вы используете эту строку, вам нужно git stash (pop|apply) && git add -u
, прежде чем продолжить шаг 2.
Шаг 2 :
git commit -m "staged changes"
Делает коммит, содержащий только поэтапные изменения с шага 0, он содержит то же самое, что и запись в тайнике с шага 1bis.
Шаг 3 :
git stash (pop|apply)
Восстанавливает тайник с шага 1. Обратите внимание, что эта запись тайника содержала все, но, поскольку вы уже зафиксировали поэтапные изменения, этот тайник будет добавлять только неустановленные изменения с шага 0.
nb: restore здесь НЕ означает git restore, это другая команда.
Шаг 4:
git add -u
Добавляет содержимое всплывающего тайника в индекс
Шаг 5:
git commit -m "unstaged changes"
Неустановленный здесь, как указано в комментариях к шагам 2 и 3, относится к шагу 0. Фактически вы проводите и фиксируете поэтапные изменения с шага 0.
Сделанный ! Теперь у вас есть две отдельные фиксации, содержащие (не) поэтапные изменения с шага 0. Возможно, вы захотите исправить / перебазировать их либо для дополнительных изменений, либо переименовать / отбросить / раздавить их. В зависимости от того, что вы сделали со стеком своего тайника (pop
или apply
), вы также можете git stash (drop|clear)
это сделать. Вы можете видеть свои записи в тайнике с git stash (list|show)
person
dilavasso
schedule
18.10.2020