В чем разница между git checkout remotes / origin / branch и git checkout branch? - PullRequest
1 голос
/ 24 января 2020

Когда я выполняю

git checkout remotes/origin/test_branch

, моя ГОЛОВА переходит в отдельное состояние . Ниже выводится:

C:\..\git_test>git checkout remotes/origin/test_branch
Note: checking out 'remotes/origin/test_branch'.

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.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

  git checkout -b <new-branch-name>

HEAD is now at 4590fa2 Test branch commit
M       src/test/resources/**

C:\..\git_test>git branch -a
* (HEAD detached at origin/test_branch)
  test_branch
  master
  remotes/origin/HEAD -> origin/master
  remotes/origin/test_branch
  remotes/origin/master

И если я выполню

git checkout test_branch

в той же ветке, то я больше не в отсоединенном состоянии.

C:\..\git_test>git checkout test_branch
Switched to branch 'test_branch'
M       src/test/resources/**
Your branch is up to date with 'origin/test_branch'.

C:\..\git_test>git branch -a
* test_branch
  master
  remotes/origin/HEAD -> origin/master
  remotes/origin/test_branch
  remotes/origin/master

Пожалуйста Может кто-нибудь объяснить, в чем разница и почему он переходит в отключенное состояние, когда ветвь такая же?

Ответы [ 2 ]

3 голосов
/ 24 января 2020

Ветка не тоже самое.

<branch> - ваша локальная версия. Фактическая ветвь.

remotes/origin/<branch> является ветвью удаленного отслеживания. У вас нет прямого контроля над ними, они автоматически обновляются после fetch, это образы удаленных ветвей, для сравнения.

Вы не должны проверять это, потому что принятие их или перемещение их позиции нанесло бы ущерб их цели. Если вы попытаетесь (как и вы), git сделает следующую лучшую вещь, она проверит коммит, на который указывает эта ссылка. Приводит к отделенному состоянию HEAD.

2 голосов
/ 24 января 2020

В отличие от традиционных систем контроля версий, Git обычно не общается с центральным сервером. У вас есть полная копия хранилища и вся его история. Все команды выполняются локально, за исключением нескольких таких, как git pull, git push и git fetch.

Вместо этого Git отслеживает состояние удаленных репозиториев с помощью «ветвей удаленного отслеживания». Это как обычные ветки, за исключением того, что они отмечают последнее место, где он видел ветку на удаленном сервере, и вы не можете зафиксировать их. Они обновляются, когда вы делаете git fetch, что происходит как часть git pull.

(Одна из важных вещей, которую нужно знать, это то, что Git "ветвь" - это не более чем метка, указывающая на коммит.)

test_branch - это локальная ветка в вашем хранилище. remotes/origin/test_branch, обычно называемый origin/test_branch, - это местоположение ветви с именем test_branch на пульте, называемой origin в последний раз, когда вы выполняли git fetch. Если они связаны, test_branch будет иметь origin/test_branch в качестве восходящего потока.

Когда вы git checkout test_branch git проверяете коммит, на который указывает test_branch, перемещает HEAD в этот коммит (HEAD отслеживает текущий извлеченный коммит) и помечает вас как участника test_branch.

. Если вы git commit, вы продвигаетесь HEAD и test_branch.

git checkout master

              [HEAD]
A - B - C - D [master]
         \
          E - F [test_branch]

git checkout test_branch

A - B - C - D [master]
         \
          E - F [test_branch]
                [HEAD]

git commit -a

A - B - C - D [master]
         \
          E - F - G [test_branch]
                    [HEAD]

Когда вы git checkout origin/test_branch git проверяете коммит, на который указывает origin/test_branch, перемещает HEAD в этот коммит (HEAD отслеживает извлеченный в данный момент коммит) ... и потому что это ветка удаленного отслеживания это оно. Вы больше не находитесь на ветке, вы находитесь в состоянии «отсоединенная ГОЛОВА».

Если вы git commit, вы продвигаетесь HEAD, но origin/test_branch остается на том же месте.

git checkout master

              [HEAD]
A - B - C - D [master]
         \
          E - F [origin/test_branch]

git checkout origin/test_branch

A - B - C - D [master]
         \
          E - F [origin/test_branch]
                [HEAD]

git commit -a

A - B - C - D [master]
         \
          E - F [origin/test_branch]
               \
                G [HEAD]

Без связанной ветки ничего не ссылается на этот новый коммит. Если вы наберете git checkout master, то G будет зависнуть, фактически потерян, хотя его можно найти с помощью git reflog.

git checkout master

              [HEAD]
A - B - C - D [master]
         \
          E - F [origin/test_branch]
               \
                G

См. Работа с удаленными устройствами для более.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...