В отличие от традиционных систем контроля версий, 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
См. Работа с удаленными устройствами для более.