Что действительно означает git checkouts?
Что такое checkout
в git?
Я знаю, как только вы сделаете checkout
для конкретной ветки, HEAD
указывает на эту ветку. Но что это значит? Означает ли это, что я смогу работать в этой отрасли? Если да, то, не проверяя ветку, я не могу работать над ней?
Кроме того, что означает remote checkout
? Как это полезно?
Ответы
Ответ 1
Как вы отметили, HEAD
- это метка, указывающая, где вы находитесь в дереве фиксации. Он перемещается вместе с вами, когда вы переходите от одной фиксации к другой. git checkout <commit>
- это основной механизм перемещения в дереве фиксации, перемещение фокуса (HEAD
) к указанному фиксации.
Фиксирование может быть задано любым из нескольких способов: хеш-код, имя ветки, имя тега, относительный синтаксис (HEAD^
, HEAD~1
и т.д.) и т.д. Часто бывает полезно рассмотреть вопрос об изменении веток, и есть некоторые варианты, которые работают с этой точки зрения, но все они ссылаются на коммиты.
Чтобы проверить, что фиксация имеет некоторые побочные эффекты, кроме перемещения HEAD
вокруг.
- Рабочий каталог обновляется до состояния проверенного фиксации.
- Если указано имя ветки, проверка делает этот филиал активным. Активная ветка будет двигаться вместе с новыми добавленными коммитами.
- с опцией
-b
новая ветвь будет создана на основе текущей фиксации и затем активирована.
- с опцией
--track
выданную ветку можно узнать о удаленной ветке
- с опцией
--orphan
создается новая ветка (например, с -b
), но не будет основана на какой-либо существующей фиксации.
Есть еще несколько опций, о которых вы можете прочитать в git man-странице checkout, все из которых вращаются вокруг перехода от одной фиксации к другой - просто изменяя, какой эффект этот ход имеет помимо перемещения HEAD
.
Ответ 2
"Чтобы проверить" означает, что вы берете какое-либо данное сообщение из репозитория и заново создаете состояние связанного дерева файлов и каталогов в рабочем каталоге.
Когда вы проверяете фиксацию, которая не является ветвью ветки (например, git checkout HEAD~2
), вы находитесь на так называемой отдельной голове. Вы можете создавать коммиты здесь, но как только вы переключитесь на другую ветвь, эти коммиты не будут восстановлены по имени ветки и могут даже быть удалены сборщиком мусора через некоторое время.
Ответ 3
Позвольте мне объяснить некоторые варианты использования checkout с файлом, папкой и ветвями, чтобы он мог быть полезным в понимании.
Скажем, у нас есть папка с именем dev
и index.html
и все отслеживается, а рабочий каталог чист.
Если я случайно изменил имя файла index.html
, и я хочу отменить, что я просто использую git checkout index.html
, он восстановит это состояние файла из выбранной в данный момент ветки репозитория.
Теперь, если я внес изменения в папку dev
и хочу восстановить это. Я могу использовать git checkout dev
, но что, если уже существует ветвь с именем dev
вместо того, чтобы проверять эту папку, она потянет эту ветку. Чтобы этого избежать, я предпочел бы сделать git checkout -- dev
.
Теперь здесь bare double dash обозначает текущую ветку и задает git для папки dev
из выбранной в данный момент ветки.
Аналогично Если я делаю git checkout alpha dev
, он вытащит папку dev из альфа-ветки.
Этот ответ для вашего первого вопроса "git checkout действительно означает".