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



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



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



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

957   8  

8 ответов:

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

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

оставляя другой путь здесь

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

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


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

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

Comments

    Ничего не найдено.