Хорошо, скажем, однажды мы осуществляем кучу модификаций, и когда мы идем к их фиксации, мы замечаем, что работаем не с той веткой.
Как мы можем заставить git переключать ветки, не отказываясь от локальных изменений .
Я, вероятно, собираюсь говорить об этом наивно, пока я жду ответа, но я хотел бы знать, есть ли правильная процедура, потому что я бы соврал, если бы сказал, что этого не случалось со мной раньше ...
- Резервное копирование измененного репо
git reset --hard
git checkout right-branch
- Восстановить изменения
git commit -m "changes"
git
git-branch
megawac
источник
источник
git stash
git-scm.com/book/en/Git-Tools-StashingОтветы:
Есть множество разных способов, в зависимости от того, как далеко вы находитесь и на какой ветке (ах) вы хотите их получить.
Давайте возьмем классическую ошибку:
Итак, теперь вы хотите, чтобы эти изменения, которые вы еще не совершили
master
, были внесеныdevelop
.Если вы не
develop
тем не менее, метод тривиален:Это создает новую
develop
ветку, начиная с того места, где вы сейчас находитесь. Теперь вы можете делать коммиты, и все новое включеноdevelop
.Вы есть
develop
. Посмотрим, позволит ли Git переключаться, ничего не делая:Это либо удастся, либо пожаловаться. Если это удастся, отлично! Просто зафиксируй. Если нет (
error: Your local changes to the following files would be overwritten ...
), у вас еще есть много вариантов.Вероятно, проще всего
git stash
(как postговорили все остальные ответчики, которые избивали меня до щелчка ). Запуститеgit stash save
илиgit stash push
, 1 или просто обычный,git stash
что сокращенно отsave
/push
:Это фиксирует ваш код (да, он действительно делает некоторые коммиты), используя странный не-ответвительный метод. Коммиты, которые он делает, не «включены» ни в какую ветку, но теперь безопасно хранятся в репозитории, так что теперь вы можете переключать ветки, а затем «применять» тайник:
Если все идет хорошо, и вам нравятся результаты, вы должны тогда
git stash drop
заначить. Это удаляет ссылку на странные не-ветвящиеся коммиты. (Они все еще находятся в хранилище и иногда могут быть получены в чрезвычайной ситуации, но для большинства целей вы должны считать, что они исчезли в этот момент.)apply
Шаг делает слияние с спрятанных изменений, используя мощную базовую технику слияния Git, то же рода вещи он использует , когда вы делаете ветви слияния. Это означает, что вы можете получить «конфликты слияния», если ветвь, над которой вы работали по ошибке, достаточно отличается от ветки, над которой вы работали. Поэтому рекомендуется тщательно проверить результаты, прежде чем предполагать, что тайник применен корректно, даже если сам Git не обнаружил каких-либо конфликтов слияния.Многие люди используют
git stash pop
, что является сокращениемgit stash apply && git stash drop
. Это хорошо, насколько это возможно, но это означает, что если приложение приводит к путанице, и вы решаете, что не хотите идти по этому пути, вы не сможете легко вернуть тайник. Вот почему я рекомендую отдельноapply
, проверять результаты,drop
только если / когда выполнено. (Это, конечно, вводит еще один момент, когда вы можете сделать еще один перерыв на кофе и забыть о том, что вы делали, вернуться и сделать что-то не то, так что это не идеальное лекарство.)1
save
вgit stash save
старом глагол для создания нового притона. В Git версии 2.13 появился новый глагол, чтобы сделать вещи более согласованнымиpop
и добавить больше опций в команду создания. Git версии 2.16 формально не поддерживает старый глагол (хотя он все еще работает в Git 2.23, которая является последней версией на момент редактирования).источник
git stash
так, чтобы коммиты - так какgit stash
вы получаете два коммита на вход в тайник, в необычном расположении - ни на одной ветви. Однако, за исключением очень коротких особых случаев, я обычно предпочитаю делать нормальный коммит. Вы можетеgit reset --soft
илиgit reset --mixed
позже, или использовать,git commit --amend
чтобы отодвинуть это в сторону, когда вы вернетесь к работе над этой веткой. (В современной Git, вы можете также использоватьgit worktree add
, которые могут быть четным лучшим решением.)Используйте git stash
Это помещает изменения в стек. Когда вы хотите вытащить их обратно, используйте
Вы даже можете вытащить отдельные предметы. Чтобы полностью сдуть сундук:
источник
git stash drop
;git stash clear
уничтожит весь стек, включая, возможно, несвязанные тайники с этим набором команд.git stash
чтобы сохранить ваши незафиксированные измененияgit stash list
перечислить ваши сохраненные незафиксированные тайникиgit stash apply stash@{x}
где х может быть 0,1,2 .. нет тайников, которые вы сделалиисточник
Вы также можете :
Используйте
git stash
для хранения ваших изменений или,Создайте другую ветку и зафиксируйте ваши изменения там, а затем объедините эту ветку с вашим рабочим каталогом.
источник