Каков предполагаемый вариант использования git stash?

143

Если я работаю в ветке A и внезапно мне нужно поработать в ветке B, прежде чем я буду готов к фиксации в ветке A, я сохраняю свои изменения в A, проверяю B, выполняю свою работу там, затем проверяю A и применяю тайник.

Если я работаю над A и хочу перестать работать в течение дня, следует ли мне спрятать свою работу, а затем применить ее на следующий день (когда я возобновлю свою работу), или я должен просто оставить все как есть - незафиксированные измененные файлы в рабочий каталог? Я не понимаю, почему мне нужно использовать тайник в этом случае, кроме тех случаев, когда есть какое-то преимущество в безопасности.

Еще один сценарий: работаю и на работе, и дома. Если я не готов с фиксацией, когда хочу вернуться домой, могу ли я спрятать свою работу, отправить ее на GitHub, а затем вытащить этот тайник дома?

Александр
источник
3
в значительной степени зависит от политики вашей компании, если таковая имеется. Как вы выберете «принятый» ответ?
Daemon Painter
1
Этот вопрос сформулирован просто просят мнения (я должен использовать мерзавец этот путь или что путь?) И , таким образом , должны быть закрыты или отредактированы.
TylerH,

Ответы:

162

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

Единственное место, где мне нравится прятать, - это если я обнаруживаю, что что-то забыл в своей последней фиксации и уже начал работать над следующей в той же ветке:

# Assume the latest commit was already done
# start working on the next patch, and discovered I was missing something

# stash away the current mess I made
git stash save

# some changes in the working dir

# and now add them to the last commit:
git add -u
git commit --amend

# back to work!
git stash pop
Mureinik
источник
2
Будет ли добавлена ​​недостающая вещь в тайник после того, как вы ее открепите? (Я все еще сомневаюсь, как работает временная шкала в git - я полагаю, вы перезаписываете историю ??)
Кики Джуэлл
Всплывающие изменения @KikiJewell применяются к индексу - они не фиксируются. поэтому, если вы сделаете это git stash popдважды, вы потеряете различие между этими двумя наборами изменений.
Mureinik 04
По состоянию на конец октября 2017 года в списке рассылки Git проводилось широкое обсуждение, в котором команда git stash save устарела в пользу существующей альтернативы git stash push. Основная причина этого заключается в том, что git stash pushвводится возможность сохранения выбранных спецификаций путей , которые git stash saveне поддерживаются.
Кришна Гупта
@Mureinik, что ты думаешь о новых ветках по сравнению с веткой git stash?
Pacerier
@Pacerier, как я уже сказал в первом абзаце, я почти всегда предпочитаю просто создать новую ветку, но это, вероятно, скорее сила привычки, чем какие-либо здравые технические соображения.
Mureinik
41

Разобью ответ на три абзаца.

Часть 1:

git stash(Чтобы сохранить незафиксированные изменения в «тайнике». Примечание: это удаляет изменения из рабочего дерева!)

git checkout some_branch(в этом случае перейдите на нужную ветку some_branch)

git stash list (список тайников)

Вы можете увидеть:
stash @ {0}: WIP на {branch_name}: {SHA-1 последней фиксации} {последняя фиксация вашей ветки}
stash @ {0}: WIP на master: модификация 085b095c6 для тестирования

git stash apply (чтобы применить тайник к рабочему дереву в текущей ветке)

git stash apply stash@{12}(если у вас будет много тайников, вы можете выбрать, какой тайник будет применяться - в этом случае мы применяем тайник 12)

git stash drop stash@{0}(удалить из списка тайников - в данном случае тайник 0)

git stash pop stash@{1} (чтобы применить выбранный тайник и удалить его из списка тайников)

Часть 2:
Вы можете скрыть свои изменения с помощью этой команды, но это не обязательно.
Вы можете продолжить на следующий день без тайника.
Эти команды предназначены для скрытия ваших изменений и работы с разными ветвями или для реализации некоторой реализации вашего кода и сохранения в тайниках без ветвей и фиксации вашего индивидуального случая!
А потом вы можете использовать некоторые тайники и проверить, что лучше.

Часть 3:
Команда Stash для локального скрытия ваших изменений.
Если вы хотите работать удаленно, вы должны зафиксировать и нажать.

Александр Юшко
источник
10

Основная идея

Уберите изменения в грязный рабочий каталог

Итак, команда Basicallly Stash сохраняет некоторые изменения, которые вам не нужны или не нужны в данный момент; но они могут вам понадобиться.

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

nzrytmn
источник
8

Вы можете использовать следующие команды:

  • Чтобы сохранить незафиксированные изменения

    git stash

  • Чтобы перечислить ваши сохраненные тайники

    git stash list

  • Чтобы применить / вернуть незавершенные изменения, где x равно 0,1,2 ...

    git stash apply stash@{x}

Примечание:

  • Чтобы применить тайник и удалить его из списка тайников

    git stash pop stash@{x}

  • Чтобы применить тайник и оставить его в списке тайников

    git stash apply stash@{x}

Анушил Кумар
источник
4

Если вы нажмете, git stashкогда у вас есть изменения в рабочей копии (не в промежуточной области), git создаст спрятанный объект и поместит его в стек тайников (точно так же, как и вы, git checkout -- .но вы не потеряете изменения). Позже вы можете выскочить из вершины стопки.

gyorgyabraham
источник
2

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

Severin
источник
2
Нет, git stashне будет менять вашу ветку. В частности, он не будет «отменять» зафиксированные изменения. Он только (временно) отменит любые незафиксированные изменения в ваших файлах. - Это может показаться придирчивым, но в контексте git такие слова имеют особое значение. Вы действительно не должны путать их.
michas
Спасибо что подметил это. Я соответственно изменил свой ответ.
Северин
В git «ветвь» определяется как серия коммитов. git stashне будет касаться каких-либо коммитов и, следовательно, вообще не будет изменять никакую ветку. Он не будет ничего «удалять» из ветки и никак не «сбрасывать» ее. Ветка остается прежней, изменяются только файлы в рабочем дереве. - Это две совершенно разные вещи.
michas
Он не будет отбрасывать, а «спрятать» ваши изменения! Git поддерживает структуру LIFO для тайников, поэтому тайник на самом деле является толчком, и вы можете вытолкнуть его сверху. Слово «сбросить» означает, что вы что-нибудь потеряете, но не потеряете.
gyorgyabraham
2

Я знаю, что StackOverflow - не место для ответов, основанных на мнениях, но на самом деле у меня есть хорошее мнение о том, когда откладывать изменения в тайник.

Вы не хотите вносить экспериментальные изменения

Когда вы вносите изменения в свое рабочее пространство / рабочее дерево, если вам нужно выполнить какие-либо операции на основе ветвей, такие как слияние, push, выборка или извлечение, вы должны быть в чистой точке фиксации. Поэтому, если у вас есть изменения в рабочем пространстве, вам необходимо их зафиксировать. Но что, если вы не хотите их совершать? Что, если они экспериментальные? Что-то, что вам не нужно в истории коммитов? Что-то, чего вы не хотите, чтобы другие видели, когда вы нажимаете на GitHub?

Вы не хотите потерять локальные изменения с помощью аппаратного сброса

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

Итак, что касается ответа «когда вы должны спрятать», то ответ заключается в том, что вам нужно вернуться к чистой точке фиксации с синхронизированным рабочим деревом / индексом / фиксацией, но вы не хотите потерять свои локальные изменения в процесс. Просто отложите свои изменения в тайник, и все будет хорошо.

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

Git stash и GitHub

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

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

git diff > git-dif-file.diff

открыть тайник

Кэмерон Маккензи
источник