Что действительно означает 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 действительно означает".