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

Следовательно, у вас есть два варианта.

  1. Если вы не хотите оказаться в состоянии отсоединенной головы, просто не делайте git checkout $specific_commit, Всегда оставайтесь на кончике одноименной ветви, такой как master, Вы можете проверить это, запустив git branch,
  2. Если вы оказались в состоянии отсоединенной головы и, возможно, вы уже сделали коммиты, которые не хотите "потерять", то, как предложено выше в разделе " Потоки", вам нужно создать новую метку / ссылку на ветку, как показано ниже.

    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, ...

Другие вопросы по тегам