) затем переключается на

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

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

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

Ответы на вопрос(9)

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

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

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

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

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

git checkout master
 Abizern21 мая 2012 г., 17:01
@HertzelGuinness Не совсем. Подмодуль проверяется при определенном коммите ша. Ветвь - это просто указатель на ша, и тот, на который он указывает, может измениться. Это бесполезно, потому что не останавливает состояние извлеченного субмодуля. Проверка ветки - это просто удобство, если вы вносите изменения в подмодуль.
 Erik B20 янв. 2011 г., 19:18
Не могли бы вы сказать мне, как это сделать?
 Hertzel Guinness21 мая 2012 г., 16:44
Есть ли способ обновить существующий субмодуль в этом режиме ветки по умолчанию? Обновитьgitmodules возможно?

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

git rebase HEAD master
git checkout master

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

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

git checkout master

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

git cherry-pick YOURSHA1

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

git merge YOURSHA1

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

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

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

git branch -f master HEAD
git checkout master

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

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

git branch newbranch
git checkout master 
git merge newbranch 
 Benjamin Oakes29 мар. 2012 г., 14:35
@ErikB Определенно верно. :) Ответ Бабая - это правильная форма того, что Алекс, похоже, пытался сделать.
 Erik B24 мар. 2012 г., 18:28
Как вы думаете, почему у него 31 ответ, и является ли он приемлемым ответом, если он не работает? Конечно, это работает. Вы даже пробовали это?
 Erik B29 мар. 2012 г., 02:40
@BenjaminOakes Это может быть так, но эти команды git даже недействительны.
 Benjamin Oakes28 мар. 2012 г., 00:02
@ErikB Возможно, он сделал несколько коммитов. В этом случае, смотрите ответ Бабая.

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

git checkout -b newbranch
git checkout master
git merge newbranch
git branch -d newbranch
 Toni Leigh02 дек. 2013 г., 10:01
Прекрасный ответ, на самом деле просто набрал его и работал, в отличие от почти всего, с чем сталкиваются как новички в GIT - вы могли бы отметить, что newbranch - произвольное имя и не предназначен для замены хешем коммита
 Konstantin Schubert01 дек. 2013 г., 08:28
@ErikB Я даже не знал, что есть такая вещь, как отсутствие на ветке. Этот ответ был очень полезным для меня.
 Erik B29 мар. 2012 г., 02:43
Не пробовал, но похоже, что это сработает. Однако я думаю, что это маловероятный сценарий. Я полагаю, что большинство людей поймут, что они не в какой-либо ветке, прежде чем совершить коммит и использовать принятый ответ, чтобы это исправить.
 Eric31 авг. 2012 г., 22:43
Вы были бы удивлены.
 Benjamin Oakes27 мар. 2012 г., 23:55
Если вы уже сделали несколько коммитов, это то, что вам нужно сделать.

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

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

git checkout some-branch
git merge commit-sha

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

git reflog
 babay04 окт. 2017 г., 09:41
это редкая (маловероятная) проблема для одного человека. Это не случалось со мной с 2012 года. Но если вы умножите шанс на количество пользователей git ... Это будет очень вероятно. Это может случиться каждый день с кем-то. :)
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
 Erik B08 июл. 2013 г., 15:32
Я не пробовал, но, похоже, все будет работать нормально. Я думаю, что если вы побежитеgit gc между выполнением этих двух команд вы потеряете эти коммиты, но если вы не запускаетеgit gc автоматически это должен быть довольно безрисковый подход. Я бы все равно согласился с ответом Бабая, но если вы хотите уберечь себя от написания двух дополнительных команд, я думаю, что это правильный путь.
 Matti Jokipii02 дек. 2013 г., 15:49
Я покинул главную ветку в какой-то момент, что я не совсем уверен. Я передал свои изменения, никаких изменений на мастере не было. Эти инструкции привели мои изменения в основную ветку и все хорошо.
 J-Dizzle28 янв. 2015 г., 22:39
+1 Я нервничал из-за того, что проверял другую ветку, оставляя коммиты, потому что это сообщение добавило уверенности, чтобы пойти на это.
Решение Вопроса

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

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
 Erik B08 июл. 2013 г., 15:38
@thinkanotherone Если вы уже зафиксировали свои изменения, нечего было бы спрятать, а проверить другую ветку - это не конец света. Коммит, который вы только что сделали, все еще там, и вы можете объединить его с этой веткой, используяgit merge <hash-of-the-commit-you-just-made>.
 araqnid18 мая 2012 г., 11:35
если вы уже зафиксировали: запишите хэш сделанного вами коммита (используйтеgit show или жеgit rev-parse HEAD), переключитесь на ветку и затемgit cherry-pick с последующим коммитом хеш.
 Daniel31 мая 2012 г., 15:31
Если зафиксировано, получите хэш последнего коммита. Оформите отделение, в котором вы хотите быть, иgit merge _hash_
 Dean Rather18 мая 2012 г., 07:14
Это не поможет, если вы уже совершили. Никаких отрицательных голосов, хотя это не было указано в вопросе.
 Pierre de LESPINAY14 авг. 2012 г., 17:47
Было бы здорово с комментариями перед каждой командой

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

git checkout existing_branch_name

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

git checkout -b new_branch_name

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

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

Ваш ответ на вопрос