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


каковы checkouts в git?

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

кроме того, что значит remote checkout В смысле? Как это полезно?

3 74

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