Как сделать частичный git stash?

Периодически появляется необходимость сделать stash не всех измененных файлов, а только некоторых. Как это реализовать? Да, есть git stash --keep-index (--no-keep-index) или git stash --patch. Но (тут я могу ошибаться) ни то ни другое не дает мне полного контроля над происходящим. С флагом --keep-index в stash добавятся все staged файлы(to be committed, как сделал бы обычный commit, то что нужно), а также все not staged for commit в придачу, чего мне совсем не нужно. Почему нельзя просто добавить в stash только те, которые готовы к коммиту? Как вариант, чтобы добиться нужного результата, можно делать коммиты, а потом их отменять, но это уже какой-то намек на мусье, который знает толкъ...


Спасибо.


UPD. Спасибо всем ответившим.

Краткое резюме: добавить в stash только выбранные файлы не получится. Если такая необходимость возникла, то скорее всего Вы используете git неправильно. Посмотрите в сторону других схем использования гита: rebase, cherry-pick, merge workflows.
  • Вопрос задан
  • 9999 просмотров
Пригласить эксперта
Ответы на вопрос 5
@vovkab
Вы на стэш смотрите немного не правильно, он не предназначен для подготовки комитов.
Он предназначит для того что бы спрятать не нужные на данный момент изменения, потому он и называется stash, в переводе — прятать, припрятывать.
Ответ написан
@vovkab
Как то не правильно у вас написано.

С флагом --keep-index — в стэш уйдут все изменения кроме тех что уже добавлены в индекс(подготовлены для комита). Если нужно так же добавить в стэш untracked файлы, то надо указать --include-untracked.

Если делать руками, то можно создать отдельную ветку и туда сохранять что нужно, а потом просто делать git cherry-pick нужного комита, но это немного не удобно и требует больше телодвижений.
Ответ написан
@edelweard
Я бы предложил сделать бранч, коммитить туда, а потом при необходимости слить коммиты в один более осмысленный. Если вам нужно отложить часть файлов в сторону, сделайте это на другом бранче просто. Потом сможете подмёрджить или черри-пикнуть.
Собственно, в этом и заключается Git way: коммит, коммит и ещё раз коммит.

А вот на вопрос
Почему нельзя просто добавить в stash только те, которые готовы к коммиту?

вам тут, конечно, вряд ли ответят ;) Можно попробовать спросить в гитовой рассылке или IRC: git-scm.com/community
Ответ написан
Mark-Centurion
@Mark-Centurion
Ну да, добавить в stash только выбранные файлы не получится если не читать документацию и не найти команду
git stash push -- [filename]

P.S. Сам факт того, что вам понадобилось припрятать только часть файлов говорит о том, что вы собираетесь сделать хороший и понятный коммит и не желаете попадания в него нежелательных изменений. Мне кажется, что это наоборот свидетельствует о правильном использовании гита, а не о неправильном.
Ответ написан
Комментировать
@unreal_serg
Если нужно в stash Закинуть много файлов, а оставить только несколько то можно пойти по такому пути:
Сначала закидываем все в stash - git stash save "Comment" -u
Потом достаем из stash нужные файлы - git checkout stash@{0} -- path/to/file.ext

Сам искал как добавлять не все файлы, но пришел пока только к такому варианту. Пока он подходит, может и другим поможет.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы