Как я могу согласовать отдельную ГОЛОВКУ с мастером / происхождением? - PullRequest
1436 голосов
/ 24 апреля 2011

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

Где-то недавно я выполнил сброс некоторых файлов, чтобы вывести их из стадии фиксации, а позже сделал rebase -iчтобы избавиться от пары недавних местных коммитов.Сейчас я нахожусь в состоянии, которое я не совсем понимаю.

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

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

Я думаю, что "master / origin" отделен от HEAD, но я не на 100% уверен в том, что это значит, как визуализировать его с помощью инструментов командной строки и как это исправить.

Ответы [ 26 ]

6 голосов
/ 15 июля 2017

Как указал Крис, у меня была следующая ситуация

git symbolic-ref HEAD завершается с fatal: ref HEAD is not a symbolic ref

Однако git rev-parse refs/heads/master указывал на хороший коммит, из которого я мог бы восстановить (В моем случае последний коммит, и вы можете увидеть этот коммит, используя git show [SHA]

После этого я сделал много беспорядочных вещей, но то, что, похоже, исправило, это просто,

git symbolic-ref HEAD refs/heads/master

И голова прикреплена!

6 голосов
/ 17 октября 2014

Все, что вам нужно сделать, это «git checkout [имя-ветви]», где [имя-ветви] - это имя исходной ветви, из которой вы попали в состояние отсоединенного заголовка.(Отсоединено от asdfasdf) исчезнет.

Так, например, в ветке 'dev' вы извлекаете коммит asdfasd14314 ->

'git checkout asdfasd14314'

вы сейчас находитесь в отсоединенном состоянии головы

'git branch' выдаст что-то вроде ->

* (detached from asdfasdf)
  dev
  prod
  stage

, но чтобы выйти из состояния отсоединенной головы и вернуться к dev ->

'git checkout dev'

и затем 'git branch 'отобразит список ->

* dev
  prod
  stage

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

4 голосов
/ 30 ноября 2018

Я нашел этот вопрос при поиске You are in 'detached HEAD' state.

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

Мой нормальный поток:

git checkout master
git fetch
git checkout my-cool-branch
git pull

На этот раз я сделал:

git checkout master
git fetch
git checkout origin/my-cool-branch
# You are in 'detached HEAD' state.

Проблема в том, что я случайно сделал:

git checkout origin/my-cool-branch

Вместо:

git checkout my-cool-branch

Исправление (в моей ситуации) состояло в том, чтобы просто запустить вышеуказанную команду и затем продолжить поток:

git checkout my-cool-branch
git pull
4 голосов
/ 05 августа 2016

Вместо того, чтобы делать git checkout origin/master

просто сделай git checkout master

тогда git branch подтвердит вашу ветку.

4 голосов
/ 11 апреля 2018

У меня была эта проблема сегодня, когда я обновил подмодуль, но не был ни в одной ветке. Я уже совершил, так что копить, проверять, расстегивать не получится. Я закончил тем, что выбрал коммит из оторванной головы. Таким образом, сразу же после того, как я совершил (когда толчок не удался), я сделал:

git checkout master
git cherry-pick 99fe23ab

Мое мышление пошло: я нахожусь на отдельной голове, но я хочу быть мастером. Предполагая, что мое отдельное состояние не очень отличается от мастера, если бы я мог применить свой коммит к мастеру, я был бы настроен. Это именно то, что делает вишенка.

3 голосов
/ 27 декабря 2017

У меня была та же проблема, и я решил ее, выполнив следующие шаги:

Если вам нужно сохранить изменения

  1. Сначала вынеобходимо запустить команду git checkout master, чтобы вернуть вас в основную ветку.
  2. Если вам нужно сохранить изменения, просто запустите git checkout -b changes и git checkout -B master changes

Если вам не нужны ваши изменения

  1. Чтобы удалить все неотслеживаемые файлы из вашей ветки, запустите git clean -df.

  2. Тогда вынеобходимо очистить все неустановленные изменения в вашем хранилище.Для этого вам нужно выполнить git checkout --

  3. Наконец, вы должны вернуть свою ветвь в основную ветвь с помощью команды git checkout master.

3 голосов
/ 16 июня 2015

Для меня это было так же просто, как снова удалить локальную ветку, так как у меня не было локальных коммитов, которые я хотел нажать:

Итак, я сделал:

git branch -d branchname

А затем снова проверяем ветку:

git checkout branchname
3 голосов
/ 07 апреля 2017

Если вы сделали несколько коммитов поверх мастера и просто хотите «слить назад» master там (то есть вы хотите, чтобы master указывал на HEAD), однострочник быть:

git checkout -B master HEAD
  1. Это создает новую ветвь с именем master, даже если она уже существует (что похоже на перемещение master, и это то, что мы хотим).
  2. Вновь созданная ветвь настроена так, чтобы указывать на HEAD, где вы находитесь.
  3. Новая ветка извлечена, поэтому вы находитесь на master впоследствии.

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

1 голос
/ 12 октября 2017

Когда я лично оказываюсь в ситуации, когда оказывается, что я внес некоторые изменения, пока я не нахожусь в master (то есть HEAD отсоединен прямо над master и между ними нет коммитов) может помочь:

git stash # HEAD has same content as master, but we are still not in master
git checkout master  # switch to master, okay because no changes and master
git stash apply  # apply changes we had between HEAD and master in the first place
1 голос
/ 23 июля 2016

Проще говоря, состояние отсоединенного HEAD означает , что вы не проверены на HEAD (или на острие) какой-либо ветви .

Поймите с примером

AВ большинстве случаев ветвление представляет собой последовательность нескольких коммитов, например:

Фиксация 1: master -> branch_HEAD (123be6a76168aca712aea16076e971c23835f8ca)

Фиксация 2: master -> 123be6a76168aca712aea16076e971c23835f8ca -> branch_HEAD (100644a76168aca712aea16076e971c23835f8ca)

Как вы можете видеть выше в случае последовательности коммитов, ваша ветвь указывает на ваш последний коммит.Таким образом, в этом случае, если вы извлекаете, чтобы совершить 123be6a76168aca712aea16076e971c23835f8ca , то вы бы находились в состоянии отсоединенной головы, поскольку HEAD вашей ветви указывает на 100644a76168aca712aea16076e971c23835f8ca из тех, в которых вы не проверены и не являетесь 1010 *.Следовательно, вы находитесь в отсоединенном состоянии HEAD.

Теоретическое объяснение

В этом блоге ясно говорится, что репозиторий Git является деревом коммитов, с каждым коммитомуказатель на своего предка с каждым указателем фиксации обновляется, и эти указатели на каждую ветвь хранятся в подкаталогах .git / refs.Теги хранятся в .git / refs / tags, а ветки хранятся в .git / refs /head.Если вы посмотрите на любой из файлов, то обнаружите, что каждый тег соответствует одному файлу с хешем фиксации из 40 символов, и, как объяснено выше @Chris Johnsen и @Yaroslav Nikitenko, вы можете проверить эти ссылки.

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