Що таке ГОЛОВКА в кишці?


232

Здається, є різниця між останньою коміткою, HEAD та станом файлу, який я бачу у своєму каталозі.

Що таке HEAD, що я можу з цим зробити і яку помилку слід уникати?



1
Починаючи з Git версії 1.8.4, всі відповіді нижче , що використовують HEADабо headможуть тепер використовувати @замість HEADзамість цього. Дивіться цю відповідь (останній розділ), щоб дізнатися, чому ви можете це зробити.

3
Від git-scm : HEAD у Git - це вказівник на поточну посилання гілки, яка, у свою чергу, є вказівником на останнє, яке ви здійснили, або на останнє зобов’язання, яке було зареєстровано у вашому робочому каталозі. Це також означає, що це буде батьком наступного зобов’язання, яке ви виконуєте. Як правило, це найпростіше думати про це, оскільки HEAD - це знімок останнього вчинку.
Куазі Ірфан

3
Можливий дублікат Що таке HEAD у Git?
Буц

Відповіді:


185

HEAD - це посилання на останню комісію в поточній перевіреній галузі.


З цього є невеликий виняток, який є відокремленою ГОЛОВОЮ. Отдельностоящая ГОЛОВА ситуація ви в кінцевому підсумку в кожен раз , коли ви витягаєте зробити (або тег) замість філії. У цьому випадку ви повинні уявити це як тимчасову гілку без назви; тож замість того, щоб називати посилання на галузь, ми маємо лише HEAD. Це все ще дозволить вам робити комісії (що оновлюватиме HEAD), тому вищевикладене коротке визначення все-таки є вірним, якщо ви думаєте про відокремлену HEAD як тимчасову гілку без назви.


1
То чому ти можеш мати дві голови?
e-satis

1
@ e-satis: іноді ви побачите гілки, які називаються головами - вони зберігаються в refs/heads. HEADХоча нижній регістр відрізняється від головного . Моя відповідь це трохи уточнює.
Каскабель

7
@ e-satis: Це не регулярний вираз. ^Це позначення всього в Git для «фіксації , перш ніж» - це зобов'язання перед поточним. (Якщо струм є злиттям, він використовує перший батьків.)
Каскабель

1
@ e-satis: Для отримання додаткової інформації про всі способи встановлення комісій див. розділ із уточненням версії сторінки man для git-rev-list. Це лише один крихітний фрагмент. kernel.org/pub/software/scm/git/docs/…
Cascabel

1
Ні, коли rev і HEAD вказують на одне і те ж фіксацію, різниці немає. І ви навіть можете написати ідентифікатор фіксації (значення SHA-1) замість rev або HEAD. І не хвилюйтеся, ви не переслідуєте нас питаннями :) (мені щонайменше: P)
ткнути

87

HEAD - це посилання (посилання) на перевірений на даний момент комітет.

У звичайних станах це насправді символічний перелік перевіреної вами гілки - якщо ви подивитесь на вміст .git / HEAD, ви побачите щось на кшталт "ref: refs / heads / master". Сама гілка є посиланням на коміт на кінчику гілки. Тому в нормальному стані HEADефективно відноситься до фіксації на кінчику поточної гілки.

Можливо також мати "відокремлену ГОЛОВУ". Це відбувається, коли ви перевіряєте щось, окрім (локальної) гілки, наприклад, віддалену гілку, певну комісію чи тег. Найбільш поширене місце, щоб побачити це під час інтерактивної бази даних, коли ви вирішили редагувати комісію. У відімкненому стані HEAD ваша HEAD є прямим посиланням на комісію - вміст .git / HEAD буде хешем SHA1.

Взагалі кажучи, HEAD - це просто зручне ім'я, яке означає "те, що ви перевірили", і вам не потрібно дуже хвилюватися з цього приводу. Просто пам’ятайте про те, що ви перевірили, і пам’ятайте, що ви, мабуть, не хочете виконувати зобов’язання, якщо ви не знаходитесь у відділенні (окремий стан HEAD), якщо ви не знаєте, що робите (наприклад, перебуваєте в інтерактивному базі даних) .


6
Це те, чого я не розумію. Якщо ви перевіряєте віддалену гілку, чому ви закінчуєте "відокремленою головою". Чому ви автоматично не стрибнете у відділення вашого місцевого репо, яке відповідає вашому дистанційному?
e-satis

3
@ e-satis: Якщо ви хочете локальну гілку, перегляньте місцеву гілку. Пам’ятайте, що обидва необов’язково однакові - вам потрібно сказати місцевому, щоб він з’єднав віддалений (або потягнув). Відстеження просто так, щоб воно знало, кого з них автоматично витягувати, коли ви запитуєте. Причина, по якій вона відокремлюється, полягає в тому, що віддалена гілка призначена для вказівника на останній раз бачив місце розташування гілки у віддаленому репо. Якщо ви спробуєте взяти на себе зобов'язання, віддалене репо не змінюється, тому віддалене відділення також не повинно.
Каскабель

1
Гаразд, це те, чого я не отримав: мати місцевою гілкою, названою певним чином, не означає, що це те саме, що і віддалену. Насправді важко дістатись на початку, тому що я родом зі світу SVN :-) Дякую. До речі, як ви переміщаєте безголову голову до місцевого відділення, щоб зробити це тут?
e-satis

3
@ e-satis: Загальна відповідь така git rebase <branch> HEAD. Це знайде останнього спільного предка <branch>і HEAD, а потім візьміть звідти всі доручення HEADі застосуйте їх (перезавантажте їх) на <branch>. По суті це робить, застосовуючи їх як патчі, тому якщо дві гілки дійсно різні, то можуть виникнути конфлікти. Але якщо <branch>це пращур HEAD(тобто ви були в потрібному місці, просто забули, що ви відключилися HEAD), база даних - це просто швидке злиття вперед.
Каскабель

3
Це одне з найбільш чітких і точних описів git HEAD, яке я бачив, після деякого пошуку.
LarsH

21

Я завжди думав, що HEAD~5означає перейти до 5 комісій раніше. Але вона не несе частину команди GO. Він містить лише посилання / "куди до" частини команди.

Простіше кажучи, це використовується для відповіді на питання: ДЕ Я повинен іти? До якого зобов’язання?

  • HEAD означає (посилання на) поточну комісію
  • HEAD~1 означає (посилання на) 1 вчинення раніше
  • HEAD~ ТАКОЖ означає (посилання на) 1 вчинення раніше
  • HEAD~87 означає (посилання на) 87 здійснює раніше

Використання:

  • git checkout HEAD~1 буде фактично GO / checkout на 1 комісію / посилання раніше
  • git reset HEAD~3 скасує ваші останні 3 зобов’язання - не видаляючи зміни, тобто ви можете бачити всі зміни, внесені протягом останніх 3 зобов’язань разом, видаліть все, що вам не подобається, або додайте до нього, а потім виконувати їх знову.
  • git reset --hard HEAD~3відключить вашу останню комісію та видалить їх зміни . Це зміни повністю усуне. Детальніше дивіться тут .
  • git diff HEAD~3 для перевірки змін за останні 3 коміти

3
повертаючись до власної відповіді :)
Мед

15

Вказівник HEAD в Git

Git підтримує змінну, що називається HEAD. І ми називаємо цю змінну покажчиком, тому що її мета полягає в посиланні або вказівці на певний комітет у сховищі. Коли ми робимо нові фіксатори, покажчик зміниться або переміститься, щоб вказати на новий коміт. HEAD завжди вказує на кінчик поточної гілки нашого сховища. Тепер це стосується нашого сховища, а не нашого індексу поетапних дій чи робочого каталогу.

Ще один спосіб подумати про це - останній стан нашого сховища або те, що було востаннє перевірено, і тому, що там сховане сховище або останній стан, ви також можете сказати, що HEAD вказує на батьків наступного комітету або це де відбуватиметься написання фільмів.

Думаю, що хороша метафора для роздумів про це - відтворення та запис запису на касетофоні. Коли ми починаємо записувати аудіо, стрічка рухається повз голову, і вона записується на неї. коли ми натискаємо "Зупинити", місце, де зупинена головка запису, - це місце, яке ми знову почнемо записувати, коли натиснемо "Записати" вдруге. коли ми знову натискаємо Record, саме звідки починається запис.

Вказівник HEAD у Git дуже схожий, він вказує на місце, де ми збираємось розпочати запис наступним. Це місце, де ми залишилися у нашому сховищі для речей, які ми зробили.


0

Простіше кажучи, HEAD - це посилання на останнє зобов’язання у філії, що наразі є виїздом.

Подумайте про ГОЛОВУ як про "поточну гілку". Коли ви перемикаєте гілки з git checkout, редакція HEAD змінюється, щоб вказувати на кінчик нової гілки.

Ви можете бачити, на що вказує HEAD:

cat .git/HEAD

HEAD може посилатися на певну редакцію, яка не пов'язана з назвою гілки. Таку ситуацію називають відокремленою ГОЛОВОЮ.

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