Как избежать попадания в состояние отстраненной головы в git?
Я все время вхожу в отдельное государство. Я не знаю почему, и я не знаю, что это такое.
Каждый раз, когда я пытаюсь восстановиться из этого состояния, я теряю некоторые файлы (из последнего коммита, который я сделал в отдельном состоянии головы).
Можно ли полностью избежать этого состояния или оно задумано?
3 ответа
Состояние отсоединенной головы существует в git по своей конструкции и обычно не может быть отключено. Вы можете войти в отдельное состояние головы, только если вы, после клонирования своего хранилища, сделаете что-то подобное
git checkout $specific_commit
например, если вы находитесь на кончике названной ветви master
#1 -> #2 -> #3
^
master
^
HEAD
и вы делаете
git checkout HEAD~
который передается прямо перед тем, на что указывает HEAD. Тогда вы окажетесь в следующем состоянии
#1 -> #2 -> #3
^ ^
| master
|
HEAD
С этого момента вы находитесь в состоянии отдельного заголовка, т.е. HEAD указывает на конкретный коммит, а не на метку ветки. До этого HEAD указывал на метку ветки master
, который, в свою очередь, указывал на конкретный коммит (конец ветки). Теперь, что бы вы ни делали, они будут находиться в отдельной ветви, которая не имеет метки ветви (т.е. ссылки). Бег git branch
скажу вам, если вы в отдельном состоянии головы.
$ git branch
* (detached from 60e425a)
master
Обратите внимание на звезду *
, что указывает на вашу текущую ветку. Если вы сделаете новый коммит прямо сейчас, git repo будет выглядеть следующим образом.
#1 -> #2 -> #3
| ^
| master
|
\----> #5
^
HEAD
если вы переключитесь сейчас обратно к мастеру, выполнив git checkout master
затем HEAD
переключится master
и ветвь, которая была создана, когда вы создали коммит #5
больше не будет иметь метки, то есть символической ссылки для перехода к фиксации #5
, Что означает, что ваш коммит фактически потерян.
Следовательно, у вас есть два варианта.
- Если вы не хотите оказаться в состоянии отсоединенной головы, просто не делайте
git checkout $specific_commit
, Всегда оставайтесь на кончике одноименной ветви, такой какmaster
, Вы можете проверить это, запустивgit branch
, Если вы оказались в состоянии отсоединенной головы и, возможно, вы уже сделали коммиты, которые не хотите "потерять", то, как предложено выше в разделе " Потоки", вам нужно создать новую метку / ссылку на ветку, как показано ниже.
git checkout -b myNewBranch
что сделает ваш репозиторий выглядеть так
#1 -> #2 -> #3
| ^
| master
|
\----> #5
^
myNewBranch
^
HEAD
Тогда, если вы вернетесь к master
Вы всегда можете вернуться назад, чтобы совершить #5
и все последующие коммиты на этой ветке, выполнив git checkout myNewBranch
,
Работайте только с местными филиалами и тогда вы никогда не попадете в обособленное состояние. Например, вместо git checkout origin/master
делать git checkout master && git pull origin master
Смотрите также параметры отслеживания для филиалов.
Чтобы не потерять изменения, уже находящиеся в отдельном HEAD, создайте для них ветку: git branch someNameForTheBranch
Если вы привыкли делать git checkout sha1
, вы должны добавить -b
возможность автоматического создания новой ветки на коммит sha1 и перемещения по ней.
Приоритет состоит в том, чтобы не оказаться в этом состоянии. Если вы хотите исправить положение отсоединенной головы, вы можете сделать
git stash
git checkout -b StartingPointOfYourBranch
git stash pop
"StartingPointOfYourBranch" должен быть ссылкой: sha1, origin/master, ...