Как переключаться между ветками в git, когда в текущей ветке есть несохраненные изменения?
Что имею? Две ветки. Одна — master . Другая — feature. Они отличаются. Я изменил некоторые файлы в папке project (пока работал в ветке feature ). Но тут мне очень понадобилось взглянуть на файлы, которые в master . Как сделать так, чтобы в папке project находились не те файлы, над которыми я сейчас работаю feature , а те, что были в ветке master ?
Отслеживать
34k 25 25 золотых знаков 130 130 серебряных знаков 222 222 бронзовых знака
задан 14 окт 2012 в 2:04
153 1 1 золотой знак 1 1 серебряный знак 9 9 бронзовых знаков
15 окт 2012 в 1:05
как вариант — спрятать изменения «git stash», перейти на другую ветку, взглянуть на то, что было нужно, перейти обратно и вытащить изменения обратно «git stash pop»
8 сен 2015 в 11:34
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
Если у вас уже есть ветка feature , то после коммита в нее сделайте git checkout master – это переключит текущую ветку на master .
Пока вы не вкоммитили изменения, вы не можете переключиться на другую ветку. Выхода два: вкоммитить изменения или отложить их. Второе можно сделать с помощью git stash – это добавит текущие незакоммиченные изменения в стек изменений и сбросит текущую рабочую копию до HEAD ‘а репозитория. Далее вы сможете:
- git stash list : показать все изменения в стеке
- git stash show : показать последнее изменение в стеке (патч)
- git stash apply : применить последнее изменение из стека к текущей рабочей копии
- git stash drop : удалить последнее изменение в стеке
- git stash pop : применить последнее изменение из стека к текущей рабочей копии и удалить его из стека
- git stash clear : очистить стек изменений
Отслеживать
ответ дан 14 окт 2012 в 2:14
3,807 16 16 серебряных знаков 29 29 бронзовых знаков
Также вместо stash можно использовать обычный commit (а потом откатить его) — это позволит «привязать» сохраненные изменения к ветке. Еще есть такой механизм как worktree для самых тяжелых случаев.
Как не коммитя и не теряя изменения переключиться на другую ветку Git.
Оказалось, что многие разработчики не знают, что можно не создавать коммит изменений в коде, чтобы переключиться на другую ветку, что-то поправить и вернуться к своей текущей задаче.
Бывает удобно, когда нужно быстро пофиксить баг и вернуться.
1. Способ через git stash
Если вы внесли изменения в вашем рабочем каталоге и хотите переключиться на другую ветку без коммита, вы можете использовать `git stash`. Это временно сохранит ваши изменения и очистит рабочий каталог.
- Сохраните изменения с помощью stash:
git stash
- Переключитесь на другую ветку:
git checkout [имя_ветки]
- Если вы захотите вернуть свои изменения на текущей ветке, используйте:
git stash apply
Если у вас несколько сохраненных изменений в stash, вы можете увидеть список всех stash с помощью:
git stash list
И применить конкретный stash с помощью:
git stash apply stash@
Учтите, что `git stash apply` применяет изменения, но оставляет их в stash. Если вы хотите применить изменения и удалить их из stash, используйте:
git stash pop
2. Способ через git worktree
git worktree позволяет вам иметь несколько рабочих копий одного репозитория. Таким образом, вы можете работать в одной ветке в одной рабочей копии, а в другой ветке — в другой рабочей копии.
- Добавление новой рабочей директории для другой ветки
Например, вы работаете над функцией в ветке `feature-x`, но вам также нужно срочно внести изменения в `master`.
git worktree add ../worktree-master master
Это создаст новую рабочую директорию `worktree-master`, где активной будет ветка `master`.
- Создание новой ветки в новой рабочей директории
Если вы хотите начать работу над новой функцией и хотите, чтобы у нее была своя рабочая директория:
git worktree add ../worktree-feature-y feature-y
Если ветка `feature-y` еще не существует, она будет создана автоматически.
- Просмотр списка рабочих директорий
git worktree list
Это покажет вам все текущие рабочие директории и их связанные ветки.
- Удаление рабочей директории
Если вы закончили работу в дополнительной рабочей директории и хотите ее удалить
rm -rf ../worktree-feature-y git worktree prune
Здесь мы сначала удаляем директорию, а затем говорим Git очистить устаревшие рабочие директории с помощью команды `prune`.
3. Самый не технологичный способ: сделать клон проекта в соседней дирректории
Да, можно сделать git clone репозитория в соседнюю дирректорию, сделать срочные изменения и запушить их, не трогая при этом ничего в текущей рабочей копии.
Git checkout
На этой странице рассматривается команда git checkout , включая примеры использования и пограничные случаи. В Git под термином checkout подразумевают переключение между различными версиями целевого объекта. Команда git checkout работает с тремя различными объектами: файлами, коммитами и ветками. Под переключением также обычно понимают действие, связанное с выполнением команды git checkout . В рамках темы «Отмена изменений» мы рассмотрели, каким образом команду git checkout можно использовать для просмотра старых коммитов. В этом документе основное внимание будет уделено операциям переключения на ветки.
Переключение веток аналогично переключению старых коммитов и файлов, в которых рабочий каталог обновляется в соответствии с выбранной веткой/ревизией; вместе с тем новые изменения сохраняются в истории проекта, то есть это не просто операция чтения.
Переключение веток
Команда git checkout позволяет перемещаться между ветками, созданными командой git branch . При переключении ветки происходит обновление файлов в рабочем каталоге в соответствии с версией, хранящейся в этой ветке, а Git начинает записывать все новые коммиты в этой ветке. Рассматривайте эту команду как способ выбрать направление своей разработки.
Наличие выделенной ветки для каждой новой функции сильно отличается от традиционного рабочего процесса в SVN. Это значительно облегчает проведение новых экспериментов без страха разрушить существующую функциональность и позволяет одновременно работать со множеством несвязанных функций. Кроме того, ветки облегчают ведение нескольких совместных рабочих процессов.
Иногда команду git checkout можно спутать с командой git clone . Разница между этими двумя командами заключается в том, что при клонировании (clone) выполняется извлечение кода из удаленного репозитория, тогда как при переключении (checkout) происходит переключение между версиями кода, который уже находится в локальной системе.

Связанные материалы
Расширенный журнал Git
СМ. РЕШЕНИЕ
Изучите Git с помощью Bitbucket Cloud
Использование: существующие ветки
Если предположить, что ваш рабочий репозиторий уже содержит существующие ветки, вы можете переключаться между этими ветками с помощью команды git checkout . Чтобы узнать, какие ветки доступны и как называется текущая ветка, выполните команду git branch .
$> git branch
main
another_branch
feature_inprogress_branch
$> git checkout feature_inprogress_branch
В вышеприведенном примере показано, как просмотреть список доступных веток с помощью команды git branch и переключиться на конкретную ветку (в данном случае — на ветку feature_inprogress_branch ).
Новые ветки
Команда git checkout часто используется вместе с командой git branch. С помощью команды git branch можно создать новую ветку. Когда вы захотите начать работу над новой функцией, создайте новое ответвление от ветки main с помощью команды git branch new_branch . Затем переключитесь на новую ветку с помощью команды git checkout new_branch . Команда git checkout также принимает аргумент -b , который действует как вспомогательный метод, позволяя создать новую ветку и сразу переключиться на нее. Вы можете работать сразу с несколькими функциями в одном репозитории, переключаясь между ними с помощью git checkout .
git checkout -b <new-branch>
В вышеприведенном примере одновременно создается ветка и сразу же выполняется переключение на нее. Опция -b — это удобный способ сообщить системе Git, чтобы она выполнила команду git branch перед выполнением команды git checkout .
git checkout -b <new-branch> <existing-branch>
По умолчанию команда git checkout -b создает ветку новая-ветка от текущего указателя HEAD . Команде git checkout можно передать необязательный параметр с указанием ветки. В приведенном выше примере передается < существующая-ветка> , поэтому новая-ветка будет создана от ветки существующая-ветка , а не от текущего указателя HEAD .
Переключение веток
Переключение веток — простая операция. При выполнении следующей команды указатель HEAD будет перенесен на последний коммит ветки .
git checkout <branchname>
Git отслеживает историю операций переключения в журнале ссылок reflog. Чтобы просмотреть эту историю, выполните команду git reflog .
Переключение на удаленную ветку
При совместной работе команды нередко используют удаленные репозитории. Такие репозитории могут размещаться на сервере с предоставлением общего доступа либо это может быть локальная копия другого коллеги. Каждый удаленный репозиторий содержит собственный набор веток. Для переключения на удаленную ветку нужно сначала извлечь содержимое этой ветки.
git fetch --all
В современных версиях Git переключение на удаленную ветку не отличается от переключения на локальную ветку.
git checkout <remotebranch>
В старых версиях Git необходимо создавать новую ветку на основе удаленного репозитория ( remote ).
git checkout -b <remotebranch> origin/<remotebranch>
Кроме того, можно переключиться на новую локальную ветку и сбросить ее до последнего коммита удаленной ветки.
git checkout -b <branchname>
git reset --hard origin/<branchname>
Открепленные указатели HEAD
Теперь, когда мы рассмотрели три основных варианта использования команды git checkout на ветках, важно обсудить состояние detached HEAD , или состояние открепленного указателя HEAD. Помните, что HEAD — это указатель на текущий снимок в Git. По сути дела, команда git checkout просто обновляет указатель HEAD , чтобы он ссылался на указанную ветку или коммит. Когда HEAD указывает на ветку, Git молчит, но при попытке переключиться на коммит система переходит в состояние detached HEAD (открепленный указатель HEAD).
Это сообщение предупреждает о том, что вся текущая работа «откреплена» от остальной части вашего проекта. Если вы начнете разрабатывать функцию, находясь в состоянии открепленного указателя HEAD , у вас не будет ветки, которая позволила бы вам вернуться к этой функции. Когда вы неизбежно переключитесь на другую ветку (например, чтобы слить код своей функции), вы уже никак не сможете сослаться на свою функцию:
Всегда ведите разработку на ветке, а не на открепленном указателе HEAD . Это гарантия того, что у вас всегда будет ссылка на ваши новые коммиты. Вместе с тем при просмотре предыдущего коммита состояние указателя HEAD не имеет значения: он может быть как откреплен, так и нет.
Резюме
На этой странице было рассмотрено использование команды git checkout при смене ветки. В общем и целом при использовании команды git checkout на ветках происходит изменение позиции указателя HEAD . С помощью этой команды можно создавать ветки, менять текущую ветку и переключаться на удаленные ветки. Команда git checkout — важный инструмент при стандартной работе в Git. Она представляет собой аналог команды git merge. Команды git checkout и git merge критически важны для реализации рабочих процессов Git.
Как в git перенести некомиченные изменения из одной ветки в другую?
В процессе работы забыл создать ветку и переключиться на неё и продолжил работу уже в законченной ветке. Работы достаточно много, как создать ветку и перенести все изменения с текущей без потерь? Заранее спасибо!
- Вопрос задан более трёх лет назад
- 8708 просмотров
Комментировать
Решения вопроса 1

Alexey Sosnovsky @sosnovskyas
просто сделать ветку не делая чекаут при этом и находясь в этой ветке сделать коммит
Ответ написан более трёх лет назад
Нравится 1 3 комментария
Амир Гафуров @amir73911 Автор вопроса
Вы имеете ввиду вот так? joxi.ru/wGrqj66tz5QJmz

Alexey Sosnovsky @sosnovskyas
именно. я так в вебшторме делал и результат предсказуемый получился
* в ветке dev на делал изменений
* понял что это задел под новую фичу сделал новый бранч
* в новом бранче сделал коммит
* сделал пуш на сервер
там пару коммитов назад есть на схеме подобный кусочек ответвления где мердж уже сделан