Ответ 1
Хорошо, сначала несколько терминов слегка упрощены.
В git
a tag
(как и многие другие) - это то, что называется treeish. Это способ ссылаться на точку в истории проекта. Treeishes может быть тегом, фиксацией, спецификатором даты, порядковым спецификатором или многими другими вещами.
Теперь branch
похож на тег, но является подвижным. Когда вы являетесь "on" веткой и совершаете фиксацию, ветвь перемещается в новый фиксатор, который вы сделали, указывая на текущую позицию.
Ваш HEAD
является указателем на ветку, которая считается "текущей". Обычно, когда вы клонируете репозиторий, HEAD
указывает на master
, который, в свою очередь, укажет на фиксацию. Когда вы затем сделаете что-то вроде git checkout experimental
, вы переключите HEAD
, чтобы указать на ветвь experimental
, которая может указывать на другую фиксацию.
Теперь объяснение.
Когда вы выполняете git checkout v2.0
, вы переключаетесь на фиксацию, на которую не указывает branch
. HEAD
теперь "отсоединен" и не указывает на ветку. Если вы решили совершить фиксацию сейчас (как можете), там нет указателя ветки для обновления, чтобы отслеживать эту фиксацию. Переход на другую фиксацию заставит вас потерять эту новую фиксацию, которую вы сделали. Это то, что сообщение говорит вам.
Обычно, вы можете сказать, git checkout -b v2.0-fixes v2.0
. Это создаст новый указатель ветки в фиксации, на который указывает treeish v2.0
(в этом случае тег), а затем переместите ваш HEAD
, чтобы указать на это. Теперь, если вы совершаете фиксации, их можно будет отслеживать (используя ветвь v2.0-fixes
), и вы можете работать так, как обычно. Там ничего "неправильно" с тем, что вы сделали, особенно если вы просто хотите взглянуть на код v2.0
. Если, однако, вы хотите внести какие-либо изменения там, которые хотите отслеживать, вам понадобится ветка.
Вы должны потратить некоторое время на понимание всей модели DAG git. Это удивительно просто и делает все команды понятными.