Git checkout my_branch vs. git checkout origin/my_branch

Я был на branch1, когда я проверяю branch2 как это (обе ветки существуют).

git checkout origin/branch2

тогда я получил ошибку с отдельной головой:

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

Но тогда я просто проверяю branch2 (без origin), тогда он работает нормально:

git checkout branch2

Так какая разница между git checkout с и без origin/; и почему возникла ошибка detached HEAD при использовании origin/?

Ответ 1

Сообщение "отсоединенное HEAD" является предупреждением, а не ошибкой.

Причина этого достаточно проста. Git имеет два состояния, к которым вы можете относиться относительно ветвей:

  • на ветке, или
  • не на ветке.

Когда вы находитесь на ветке и делаете новые коммиты, ветка автоматически переходит к новым коммитам.

Когда вы не находитесь на ветке и делаете новые коммиты, не ветвь также продвигается, но - вот причина для предупреждения - если вы затем переключитесь на какую-либо другую ветвь (так, чтобы вы были на ней), Git забывает, где вы были. 1 Когда вы находитесь на ветке, имя ветки запоминает новые коммиты; когда вы этого не сделаете, им нечего запомнить.

Вы не можете находиться на ветке удаленного отслеживания

Ветвь origin/branch2 является ветвью удаленного отслеживания: то есть веткой, которая запоминает "где branch2 была на origin, когда мы (наши Git и origin git) имели разговор о ветвях". Поскольку это означает отслеживать, где они были, Git не позволит вам получить "on" эту ветку и сделать новые коммиты (которые затем будут помнить, где вы находитесь, а не там, где они были).

Из-за того, что вы не можете быть на нем, проверьте его, вместо этого вы получите это состояние "отдельно стоящего HEAD".

Но вы можете быть на нормальной (локальной) ветке

Ветвь branch2 является нормальной, обычной, локальной ветвью. Он ваш, как вы хотите. Вы можете получить его и совершить новые коммиты.

(Ваш локальный филиал также может помнить ветвь удаленного отслеживания, так как ее так называемая восходящая. Git запутанная терминология для этого заключается в том, что ваш локальный филиал затем "отслеживает" ветвь удаленного отслеживания. "здесь появляется слишком много раз, как и слово" ветвь ", все с разными значениями.)


1 На самом деле он сохраняет его некоторое время в reflog для HEAD, но это полезно только по 30 дней по умолчанию.

Ответ 2

вы должны использовать git checkout --track origin/branch2 для создания локальной ветки ветки2, которая отслеживает удаленный origin/branch2