Что на самом деле означает git checkouts?
каковы checkout
s в git?
Я знаю, как только вы делаете checkout
к определенной ветви,HEAD
указывает на эту ветвь. Но что это значит на самом деле? Значит ли это, что я могу работать на этой ветке? Если да, то, не проверяя ветку, я не могу работать над ней?
кроме того, что значит remote checkout
В смысле? Как это полезно?
3 ответа:
как вы заметили,
HEAD
- это метка, отмечающая, где вы находитесь в дереве фиксации. Он движется вместе с вами, когда вы переходите от одного коммита к другому.git checkout <commit>
является основным механизмом для перемещения в дереве фиксации, перемещая фокус (HEAD
) к указанной фиксации.фиксация может быть задана любым из нескольких способов, хэш фиксации, имя ветви, имя тега, относительный синтаксис (
HEAD^
,HEAD~1
и т. д.) и так далее. Часто бывает полезно рассмотреть возможность изменения проверки ветви, и есть некоторые параметры, которые работают с этой точки зрения, но все они ссылаются на коммиты.для проверки фиксации есть некоторые побочные эффекты, отличные от перемещения
HEAD
вокруг.
- рабочий каталог обновляется до состояния извлеченной фиксации.
- если указано имя ветви, checkout делает эту ветвь активной. Активная ветвь будет перемещаться вместе с любыми новыми коммитами, которые будут добавлены.
- С
-b
опция новая ветвь будет создана на основе текущей фиксации, а затем активирована.- С
--track
опция извлеченная ветвь может быть осведомлена об удаленной ветви- С
--orphan
опция создается новая ветка (например, с-b
) но не будет основываться на какой-либо существующей фиксации.есть еще несколько вариантов, о которых вы можете прочитать в git checkout man-page, все из которых вращаются вокруг перемещения от одного фиксации к другому - просто меняется в том, какой эффект это движение имеет в дополнение к перемещению
HEAD
.
"чтобы проверить" означает, что вы берете любую данную фиксацию из репозитория и повторно создаете состояние связанного файла и дерева каталогов в рабочем каталоге.
когда вы проверяете фиксацию, которая не отделение головы (например,
git checkout HEAD~2
), вы находитесь на так называемой отдельно стоящее головы. Вы можете создавать коммиты здесь, но как только вы переключитесь на другую ветвь, эти коммиты не будут восстанавливаться по имени ветви и могут даже быть удалены сборщик мусора через некоторое время.
позвольте мне объяснить некоторые случаи использования checkout с файлом, папкой и ветвями, чтобы это могло быть полезно для понимания.
Допустим у нас есть папка с именем
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 действительно означает".