git detached - что делать

Очень часто, работая с гитом можно столкнуться в проблемой, когда у вас есть предупреждение о detached HEAD. По просьбе трудящихся пишу почему эта проблема возникает и как её решить.

В гите есть такие понятия как коммиты и ветки. Коммит - это по сути изменения в файлах, но давайте же рассматривать коммит как некое состояние проекта (файлов проекта). 

Ветка - это по сути серия коммитов, а HEAD ветки - указатель на последний (или не последний) коммит. То есть если у нас есть ветка master и ветка dev, но HEAD ветки мастер может указывать на один коммит, а HEAD ветки dev на другой. Впрочем оба они могут указывать на один и тот же коммит, да :).

Так вот detached HEAD означает, что вы сейчас находитесь не на HEAD ветки, то есть вообще не на ветке, а на каком-то коммите.. возможно у вас даже есть незакоммиченные изменения, но что они Вам, если вы не знаете куда их коммитить.

Если вы попытаетесь сделать checkout какой нибудь ветки, то вы можете потерять текущий коммит/изменения.. и что же нам делать?

А на самом деле всё просто. Нам нужно:

  1. Создать временную ветку на текущем коммите. Таким образом HEAD этой ветки будет указывать на наш коммит, который был detached.
  2. Перейти на основную ветку, куда вы хотели этот коммит записать.
  3. Смержить основную ветки и новую (которую вы только что создали)
  4. Удалить временную ветку (ну а зачем она нам?)

Теперь тожесамое, но в командах

git checkout -b tmp
git add . && git commit -m 'my changes'
git checkout master
git merge tmp
git branch -d tmp

Продолжение следует. Чуть позже я допишу статью - как искать потерянные коммиты и тд.