Сохраняйте изменения, сохраняя изменения в рабочем каталоге в Git.

Есть ли команда git stash, которая сохраняет ваши изменения, но также сохраняет их в рабочем каталоге? То есть в основном git stash; git stash apply за один шаг?


person Michael Dorst    schedule 24.07.2013    source источник
comment
Тот же вопрос: stackoverflow.com/q/6315459/350384   -  person Mariusz Pawelski    schedule 27.03.2020
comment
@MariuszPawelski Нет, не совсем. Этот вопрос более конкретен, чем мой. Ответ на мой вопрос был просто нет. Тем не менее, спасибо за ссылку, она может быть полезной для некоторых людей, или даже для меня в более позднее время.   -  person Michael Dorst    schedule 29.03.2020
comment
Чтобы было ясно, мой вопрос отличается, потому что я не требую, чтобы файлы оставались нетронутыми. Я просто искал альтернативы git stash && git stash apply. Вы заметите, что ответы на этот вопрос сильно отличаются от моих.   -  person Michael Dorst    schedule 29.03.2020
comment
ах, правильно, ваш вопрос немного менее конкретен. Но я задаю этот вопрос, потому что ответы на него также соответствуют вашему требованию. Таким образом, этот вопрос отображается как «Связанный» на боковой панели, так что он может быть кому-то полезен.   -  person Mariusz Pawelski    schedule 29.03.2020


Ответы (5)


Что бы это ни стоило, другой способ сделать это — подготовить изменения, которые вы хотите сохранить, а затем спрятать все, используя --keep-index:

$ git add modified-file.txt
$ git stash push --keep-index

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

Из официальной документации Linux Kernel Git для git stash или из git-scm:

Если используется опция --keep-index, все изменения, уже добавленные в индекс, остаются нетронутыми.

person Community    schedule 25.07.2013
comment
это, безусловно, самое простое объяснение --keep-index, которое я когда-либо видел. Я не совсем понял смысл по тому, как это было сформулировано в документах. - person 40detectives; 17.03.2020

git stash, а затем git stash apply (git stash && git stash apply) спрячут файлы и применят stash сразу после него. Так что в конце концов у вас будут свои изменения в тайнике и в рабочем каталоге.

Вы можете создать псевдоним, если хотите, чтобы он был цельным. Просто поместите что-то вроде этого в ~/.gitconfig:

[alias]
    sta = "!git stash && git stash apply"

Недостатком этого подхода является то, что все файлы сохраняются и создаются заново. Это означает, что временные метки соответствующих файлов будут изменены. (Вызывает жалобу Emacs, когда я пытаюсь сохранить файл, если я открыл его до того, как сделал git sta, и может вызвать ненужные перестроения, если вы используете make или друзей.)

person madhead    schedule 24.07.2013
comment
а в чем разница между git stash; git stash apply и git stash && git stash apply? - person Michael Dorst; 25.07.2013
comment
comment
@антропоморфный git config --global alias.sta "!git stash && git stash apply" должен это сделать. - person ; 25.07.2013
comment
Как я могу изменить этот псевдоним, чтобы использовать git stash save с аргументом и затем сделать git stash apply? - person spinningarrow; 09.10.2014
comment
@spinningarrow попробуйте !git stash $1 && git stash применить - person madhead; 10.10.2014
comment
Почему перед командой «git» стоит удар (!)? Bash говорит мне -bash: !git: команда не найдена. - person Jay Sidri; 05.05.2017
comment
@JaySidri, bang означает, что на самом деле это внешняя команда, а не сам аргумент git. Согласно документам: как вы понимаете, Git просто заменяет новую команду тем, для чего вы ее называете. Однако, возможно, вы хотите запустить внешнюю команду, а не подкоманду Git. В этом случае вы начинаете команду с ! персонаж. - person madhead; 10.05.2017
comment
не большой поклонник этого, поскольку, если вы уже имели дело с конфликтом, это заставит вас иметь дело с ним снова. - person gabeio; 02.05.2018

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

$ git add modified-file.txt  
(OR $ git add .    ---- for all modified file)
$ git stash save --keep-index "Your Comment"
person Premchandra Singh    schedule 01.06.2016
comment
ПРИМЕЧАНИЕ: не работает без git add (например, для измененных, но не добавленных в фиксацию файлов) - person alex_1948511; 29.11.2019

Вы можете использовать git stash create для создания коммита тайника, а затем сохранить его в тайнике с помощью git stash store:

git stash store $(git stash create) -m "Stash commit message"

Это можно сохранить в псевдониме git, чтобы сделать его более удобным:

git config --global alias.stash-keep '!git stash store $(git stash create)'

git stash-keep -m "Stash commit message"

Обратите внимание, что это не делает всего, что делает git stash push. Например, он не добавляет имя ветки к фиксации, например. stash@{0}: On myBranch: Stash commit message.

person M. Justin    schedule 06.03.2020
comment
Нравится вот этот!! Однако одно исправление: man git-stash говорит, что -m <message> должен стоять перед хэшем коммита. За исключением того, что что-то изменилось в новейшем git. - person tanius; 13.06.2020
comment
Этот ответ на самом деле делает именно то, о чем спрашивал ОП! ???? - person jasongregori; 12.01.2021
comment
У меня были проблемы с тем, чтобы этот псевдоним работал, в конце концов я выбрал save = "!f() { git stash store $(git stash create); }; f", который сработал. - person jasongregori; 12.01.2021

Вам может помочь уловка, а не тайник, а FWIW:

git add -A
git commit -m "this is what's called stashing"       (create new stash commit)
git tag stash                               (mark the commit with 'stash' tag)
git reset HEAD~        (Now go back to where you've left with your working dir intact)

Итак, теперь у вас есть тайник с тегами фиксации, в любом случае невозможно сделать git stash pop, но вы можете делать такие вещи, как создание патча или сброс файлов и т. Д., Ваши рабочие файлы каталогов также остаются нетронутыми, кстати.

person KenIchi    schedule 22.04.2015
comment
рабочий каталог без изменений Нет, вы потеряете все поэтапные изменения, после этого они станут неустановленными. - person mattalxndr; 02.06.2021