Git: «В настоящее время нет ни на одной ветке».Есть ли простой способ вернуться на ветку, сохранив изменения? - PullRequest
185 голосов
/ 19 января 2011

Итак, я проделал некоторую работу в репозитории, и когда я собираюсь сделать коммит, я понимаю, что в настоящее время я не нахожусь ни в одной ветви.

Это часто случается при работе с подмодулями, и яЯ могу решить ее, но процесс утомителен, и я подумал, что должен быть более простой способ сделать это.

Есть ли простой способ вернуться на ветку, сохранив изменения?

Ответы [ 9 ]

189 голосов
/ 19 января 2011

Если вы не совершали:

git stash
git checkout some-branch
git stash pop

Если вы совершили и ничего не изменили с тех пор:

git log --oneline -n1 # this will give you the SHA
git checkout some-branch
git merge ${commit-sha}

Если вы совершили, а затем проделали дополнительную работу:

git stash
git log --oneline -n1 # this will give you the SHA
git checkout some-branch
git merge ${commit-sha}
git stash pop
154 голосов
/ 26 марта 2012

это помогло мне

git checkout -b newbranch
git checkout master
git merge newbranch
git branch -d newbranch
22 голосов
/ 31 мая 2013
git checkout master

Вот как-то так:

Warning: you are leaving 2 commits behind, not connected to
any of your branches:

1e7822f readme
0116b5b returned to clean django

If you want to keep them by creating a new branch, this may be a good time to do so with:
git branch new_branch_name 1e7822f25e376d6a1182bb86a0adf3a774920e1e

Итак, давайте сделаем это:

git merge 1e7822f25e376d6a1182bb86a0adf3a774920e1e
11 голосов
/ 24 марта 2012

Оставив здесь другой путь

git branch newbranch
git checkout master 
git merge newbranch 
9 голосов
/ 19 января 2011

В качестве альтернативы, вы можете настроить свои подмодули так, чтобы вместо того, чтобы находиться в их состоянии отдельного головного устройства по умолчанию, вы просматривали ветку.

Отредактировано, чтобы добавить:

Одинспособ заключается в извлечении определенной ветви подмодуля, когда вы добавляете ее с флагом -b:

git submodule add -b master <remote-repo> <path-to-add-it-to>

Другой способ - просто зайти в каталог подмодуля и просто проверить его

git checkout master
4 голосов
/ 09 октября 2012

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

git checkout existing_branch_name

Если вы хотите работать с новой веткой, это должно работать для вас:

git checkout -b new_branch_name

Оформить заказпотерпит неудачу, если у вас возникнут конфликты в рабочем дереве, но это должно быть довольно необычно, и если это произойдет, вы можете просто спрятать его, всплыть и разрешить конфликт.Вы выполняете две команды, которые в любом случае не требуют много времени.Поэтому я не приму этот ответ, если он чудесным образом не получит больше голосов (или, по крайней мере, близко), чем принятый в настоящее время ответ.

2 голосов
/ 14 января 2017

Может работать следующий метод:

git rebase HEAD master
git checkout master

Это отменит текущие изменения HEAD поверх мастера.Затем вы можете переключить ветку.


Альтернативный способ - сначала оформить ветку:

git checkout master

Затем Git должен отобразить SHA1 ваших отдельных коммитов, затем вы можете выбрать их.Например,

git cherry-pick YOURSHA1

Или вы также можете объединить последнюю версию:

git merge YOURSHA1

Чтобы увидеть все ваши коммиты из разных веток (чтобы убедиться, что вы их), запустить: git reflog.

0 голосов
/ 12 марта 2019

Один из способов оказаться в этой ситуации - выполнить ребаз из удаленной ветки.В этом случае на новые коммиты указывает HEAD, но master не указывает на них - он указывает на то, где он был до того, как вы перебазировали другую ветку.

Вы можете сделать этот коммит своимnew master, выполнив:

git branch -f master HEAD
git checkout master

Это принудительно обновляет master, указывая на HEAD (без установки master), затем переключается на master.

0 голосов
/ 11 июля 2016

Я знаю, что сказал бабею в 2012 году, что я подумал, что вряд ли кто-то не поймет, что они не были на ветке и совершают коммиты. Это только что произошло со мной, поэтому я должен признать, что был неправ, но, учитывая, что до 2016 года это случилось со мной, можно утверждать, что это на самом деле маловероятно.

В любом случае, создание новой ветки, на мой взгляд, излишне. Все, что вам нужно сделать, это:

git checkout some-branch
git merge commit-sha

Если вы не скопировали commit-sha перед проверкой другой ветки, вы можете легко найти ее, запустив:

git reflog
...