Що насправді означають git checkouts?


96

Що таке checkouts у git?

Я знаю, що коли ви робите checkoutпевну гілку, HEADвказуєте на цю гілку. Але що це насправді означає? Чи означає це, що я можу тоді працювати над цією галуззю? Якщо так, то, не перевіряючи гілку, я не можу працювати над нею?

Крім того, що remote checkoutозначає? Чим це корисно?


1
Жоден не взяв. Так, я стикаюся з теорією того, що це означає. тобто вкажіть на HEAD тощо. Але я хочу знати з точки зору "checkout code - внесіть зміни - check in" чи це інше?
daehaai

25
@antonijn - Я спробував погугліти питання - це перший результат - якийсь сумний, що коли я потрапив сюди, то побачив, що питання закрите, і це шалене ставлення у всіх - я походжу з ТФС, і я Починаючи підозрювати, що "Checkout" означає щось зовсім інше в GIT. Я хочу знати, що це означає в git-land.
BrainSlugs83,

Відповіді:


59

Як ви зазначали, HEADмітка зазначає, де ви знаходитесь у дереві фіксації. Він рухається разом із вами, коли ви переходите від одного коміту до іншого. git checkout <commit>є основним механізмом переміщення в дереві комітів, переміщення вашого фокусу ( 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>не змінюється галузь.
Галат

Ваше пояснення не є неправильним , але Ви забули дуже важливий (і потенційно небезпечний) випадок використання: git checkout <path>.
Ерік Думініл

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 дійсно означає".


2
В останньому рядку Ця відповідь на ваше перше запитання "git checkout дійсно означає". ти перевіряєш папку "дійсно" із "середньої" гілки: P
Парамвір Сінгх Карвал

22

"Оформити" означає, що ви берете будь-який заданий коміт із сховища та заново створюєте стан відповідного файлу та дерева каталогів у робочому каталозі.

Коли ви перевіряєте коміт, який не є головкою гілки (наприклад git checkout HEAD~2), ви знаходитесь на так званій від'єднаній голові. Ви можете створювати коміти тут, але як тільки ви перейдете на іншу гілку, ці коміти не будуть відновлені за назвою гілки і навіть можуть бути видалені збирачем сміття через деякий час.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.