Git: "В настоящее время нет ни на одной ветке". Есть ли простой способ вернуться на ветку, сохранив изменения?

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

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

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

10 ответов

Решение

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

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

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

git checkout -b newbranch
git checkout master
git merge newbranch
git branch -d newbranch
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

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

Вы можете сделать это совершить ваш новый master при выполнении:

git branch -f master HEAD
git checkout master

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

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

git branch newbranch
git checkout master 
git merge newbranch 

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

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

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

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

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

git checkout master

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

git checkout existing_branch_name

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

git checkout -b new_branch_name

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

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

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

git rebase HEAD master
git checkout master

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


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

git checkout master

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

git cherry-pick YOURSHA1

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

git merge YOURSHA1

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

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

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

git checkout some-branch
git merge commit-sha

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

git reflog

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

Другие вопросы по тегам