Что на самом деле означает git checkouts?

96

Что есть checkoutв git?

Я знаю, что когда вы делаете checkoutэто с определенной веткой, HEADточки на эту ветку. Но что это на самом деле означает? Означает ли это, что я могу работать над этой веткой? Если да, то без проверки ветки я не смогу с ней работать?

Кроме того, что remote checkoutзначит? Чем это полезно?

Daehaai
источник
1
Ни одного. Да, я сталкивался с теорией того, что это значит. т.е. указать на ГОЛОВУ и т. д. Но я хочу знать с точки зрения «код проверки - внесение изменений - проверка» или это другое?
daehaai 08
25
@antonijn - Я пробовал поискать в Google вопрос - это первый результат - грустно, что как только я попал сюда, я увидел, что вопрос был закрыт, и это сумасшедшее отношение, которое есть у всех - я пришел из фона TFS, и Я начинаю подозревать, что "Checkout" означает что-то совершенно другое в GIT. Я хочу знать, что это значит в git-land.
BrainSlugs83

Ответы:

60

Как вы заметили, HEADэто метка, указывающая, где вы находитесь в дереве фиксации. Он движется вместе с вами, когда вы переходите от одной фиксации к другой. git checkout <commit>- это основной механизм перемещения по дереву фиксации, перемещая ваш focus ( HEAD) на указанную фиксацию.

Фиксация может быть указана любым из нескольких способов: хешем фиксации, именем ветки, именем тега, относительным синтаксисом ( HEAD^, HEAD~1и т. Д.) И т. Д. Часто бывает полезно рассматривать оформление как изменение ветвей, и есть некоторые варианты, которые работают с этой точки зрения, но все они ссылаются на коммиты.

Чтобы оформить заказ, фиксация имеет некоторые побочные эффекты, кроме перемещения HEAD.

  • Рабочий каталог обновляется до состояния извлеченного коммита.
  • если указано имя ветки, checkout делает эту ветку активной. Активная ветка будет перемещаться вместе с любыми новыми добавленными коммитами.
    • с этой -bопцией будет создана новая ветка на основе текущего коммита, а затем сделана активной.
    • с --trackопцией проверенная ветка может быть уведомлена об удаленной ветке
    • с --orphanопцией создается новая ветка (например, с -b), но она не будет основана на какой-либо существующей фиксации.

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

Дэвид Калп
источник
Итак, похоже, что «проверка» означает нечто совершенно иное (в любом случае, по сравнению с TFS - эквивалент TFS будет «получение» определенного «набора изменений»). Рад, что посмотрел на это! - есть ли магическая константа для "последнего"? (в TFS это "T") - таким образом мы можем просто загрузить последнюю версию кода, не зная метки "HEAD"?
BrainSlugs83
1
Если вы находитесь в ветке, имя ветки является последней фиксацией для этой ветки - если вы не в ветке, вы находитесь в последней фиксации. Я бы использовал команду log, чтобы найти самую последнюю фиксацию в репозитории без учета ветки, а затем вручную перейти к ней, но я уверен, что при необходимости это можно автоматизировать.
Дэвид Калп
По поводу последнего абзаца: обратите внимание, что git checkout <commit> <path>не переключает ветки.
galath
Ваше объяснение не является неправильным , но Вы забыли очень важный (и потенциально опасный) случай использования: git checkout <path>.
Eric
24

Позвольте мне объяснить некоторые варианты использования проверки с файлом, папкой и ветвями, чтобы это могло быть полезно для понимания.

Допустим, у нас есть папка с именем, devа index.htmlтакже все отслеживается, и рабочий каталог чист.

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

Теперь, если я внес изменения в devпапку и хочу ее восстановить. Я могу использовать, git checkout devно что, если уже есть указанная ветка, devвместо того, чтобы проверять эту папку, она откроет эту ветку. Чтобы избежать этого, я бы предпочел git checkout -- dev.

Теперь здесь пустое двойное тире обозначает текущую ветку и запрашивает у git папку devиз текущей выбранной ветки.

Точно так же, если я это сделаю, git checkout alpha devон вытащит папку dev из альфа-ветки.

Это ответ на ваш первый вопрос: «git checkout действительно означает».

Bawa G
источник
2
В вашей последней строке Ответ на ваш первый вопрос «git checkout действительно означает». Вы
извлекаете
22

«Чтобы проверить» означает, что вы берете любую данную фиксацию из репозитория и воссоздаете состояние связанного файла и дерева каталогов в рабочем каталоге.

Когда вы проверяете фиксацию, которая не является головкой ветки (например git checkout HEAD~2), вы находитесь на так называемой отдельной головке. Здесь вы можете создавать коммиты, но как только вы переключитесь на другую ветку, эти коммиты не будут восстановлены по имени ветки и могут даже быть удалены сборщиком мусора через некоторое время.

Майкл Уайлд
источник