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
лучший способ, который я сделал, - скопировать файлы, в которые я внес изменения, в отдельную папку, затем удалить папку репозитория, которая у меня сейчас есть на моем компьютере, затем клонировать основной репозиторий и вернуть файлы