Пошук уроків, статей та іншого контенту
Дізнайтеся, що таке HEAD, хеші, гілки, HEAD~ та HEAD^, і як посилатися на потрібні commit.
HEADHEAD — це спеціальне посилання Git на commit, який зараз вибраний у поточному репозиторії.
Зазвичай HEAD вказує на поточну гілку, а гілка — на останній commit цієї гілки:
HEAD → main → commit CЯкщо створити новий commit, посилання гілки та HEAD перемістяться:
HEAD → main → commit DПеревірити, де перебуває HEAD, можна командою:
git statusТиповий результат:
On branch main
nothing to commit, working tree cleanТакож поточну гілку можна отримати командою:
git branch --show-currentЩоб побачити commit, на який безпосередньо посилається HEAD, використовуйте:
git log -1Або коротше:
git log -1 --onelineКожен commit має унікальний ідентифікатор — хеш. Наприклад:
f3a91c2e8d5b7a4c6e1f...Повний хеш зазвичай містить 40 шістнадцяткових символів. У командах часто достатньо скороченого хешу, наприклад:
f3a91c2Git може однозначно визначити commit за скороченим хешем, якщо цього фрагмента достатньо для розрізнення commit у репозиторії.
Подивитися історію зі скороченими хешами:
git log --onelineПриклад:
f3a91c2 Add validation
a81b4d0 Create form
72c6e11 Initial commitТепер кожен із цих commit можна використовувати як посилання:
git show f3a91c2Команда git show показує інформацію про commit і зміни, які він містить.
Повний хеш поточного commit можна отримати так:
git rev-parse HEADСкорочений варіант:
git rev-parse --short HEADГілка — це рухоме посилання на commit. Наприклад:
main → f3a91c2Якщо поточна гілка main, то:
git show mainпокаже commit, на який указує гілка main.
Після створення нового commit:
main → новий commitПосилання main переміщується вперед автоматично. Старий commit при цьому не змінюється.
Подивитися всі локальні гілки та commit, на які вони вказують:
git branch -vПриклад:
* main f3a91c2 Add validation
test a81b4d0 Create formСимвол * позначає поточну гілку.
HEADОскільки HEAD указує на поточний стан репозиторію, цю назву можна використовувати в командах.
Наприклад, показати поточний commit:
git show HEADПоказати зміни у файлах між поточним commit і робочою директорією:
git diff HEADПоказати назву поточної гілки:
git branch --show-currentУ звичайній ситуації HEAD указує на гілку:
HEAD → main → f3a91c2Це називається звичайним станом із приєднаним HEAD.
HEAD~Синтаксис HEAD~ використовується для посилання на предків поточного commit.
HEAD~1 — попередній commit;
HEAD~2 — commit на два кроки раніше;
HEAD~3 — commit на три кроки раніше.
Запис HEAD~ без числа означає те саме, що й HEAD~1.
Приклад історії:
A — B — C
↑
HEADУ цій ситуації:
HEAD посилається на C;
HEAD~1 посилається на B;
HEAD~2 посилається на A.
Подивитися попередній commit:
git show HEAD~Подивитися commit на два кроки раніше:
git show HEAD~2Переглянути коротку історію від попереднього commit:
git log --oneline HEAD~3..HEADУ цьому діапазоні Git покаже commit після HEAD~3 і до поточного HEAD.
HEAD^HEAD^ також означає батьківський commit поточного HEAD.
Для звичайної лінійної історії ці записи еквівалентні:
HEAD^
HEAD~1Наприклад:
git show HEAD^
git show HEAD~1Обидві команди посилаються на безпосередньо попередній commit.
Різниця стає важливою для merge commit. Merge commit може мати двох батьків:
B — C
/ \
A — M
\ /
D —У такому випадку:
M^1 — перший батьківський commit;
M^2 — другий батьківський commit.
Подивитися першого батька:
git show HEAD^1Подивитися другого батька:
git show HEAD^2Запис HEAD~2 означає перехід на два батьківські кроки через першого батька. Для звичайної історії без merge це просто commit на два кроки раніше.
Наведена послідовність створює невеликий репозиторій і кілька commit:
mkdir git-head-example
cd git-head-example
git init
git config user.name "Student"
git config user.email "student@example.com"
printf "Перша версія\n" > note.txt
git add note.txt
git commit -m "Create note"
printf "Друга версія\n" >> note.txt
git add note.txt
git commit -m "Add second line"
printf "Третя версія\n" >> note.txt
git add note.txt
git commit -m "Add third line"
git log --oneline --decorateПісля цього історія може мати такий вигляд:
c3d4e5f (HEAD -> main) Add third line
b2c3d4e Add second line
a1b2c3d Create noteТепер можна використовувати різні посилання:
git show HEAD
git show HEAD~
git show HEAD~2
git show b2c3d4e
git show mainУ цьому прикладі:
HEAD — commit c3d4e5f;
HEAD~ — commit b2c3d4e;
HEAD~2 — commit a1b2c3d;
main — той самий commit, що й HEAD;
b2c3d4e — конкретний commit за його хешем.
Посилання на commit можна використовувати не лише з git show, а й для порівняння.
Порівняти поточний commit із попереднім:
git diff HEAD~ HEADПорівняти два commit за хешами:
git diff a1b2c3d b2c3d4eПоказати тільки список змінених файлів:
git diff --name-only HEAD~ HEADВивести історію від певного commit до поточного:
git log --oneline HEAD~2..HEADВажливо: запис A..B означає commit, які доступні з B, але не входять до історії A.
Команда git switch --detach дозволяє перейти безпосередньо до commit:
git switch --detach HEAD~1Тепер HEAD указує не на гілку, а безпосередньо на commit:
HEAD → commit BТакий стан називається detached HEAD — «від’єднаний HEAD».
Перевірити стан:
git statusGit повідомить, що HEAD перебуває в detached state.
У цьому стані можна переглядати файли та історію. Але якщо створити новий commit, він не буде належати жодній гілці, якщо спочатку не створити гілку.
Повернутися до гілки main:
git switch mainЯкщо потрібно зберегти новий commit, створіть гілку під час переходу:
git switch -c experimentТепер HEAD знову приєднаний до гілки:
HEAD → experiment → новий commitДля простого перегляду старого commit достатньо перейти до нього, а потім повернутися на гілку:
git switch --detach HEAD~2
git switch mainGit підтримує кілька зручних способів указати commit:
повний хеш: f3a91c2e8d5b7a4c6e1f...;
короткий хеш: f3a91c2;
назва гілки: main;
HEAD — поточний commit;
HEAD~1 або HEAD~ — попередній commit;
HEAD^ — перший батьківський commit;
HEAD^2 — другий батьківський commit merge commit.
Посилання можна комбінувати. Наприклад:
git show main~2Це означає: узяти гілку main і перейти на два батьківські commit назад.
Також можна вказати батьківський commit конкретного commit за хешем:
git show f3a91c2^HEAD із назвою гілкиHEAD — не гілка. Це вказівник на поточне місце в історії. Найчастіше він указує на гілку, але в detached state може вказувати безпосередньо на commit.
HEAD~ означає будь-який старий commitHEAD~ без числа означає лише безпосереднього попередника. Для дальшого переходу потрібно вказати число:
HEAD~2
HEAD~3HEAD^2 у звичайній історіїЗвичайний commit має одного батька, тому для нього існує HEAD^1, але не HEAD^2. Другий батько з’являється у merge commit.
HEADПісля команди:
git switch --detach <commit>ви вже не перебуваєте на гілці. Перед створенням нового commit перевірте стан або створіть окрему гілку.
Скорочений хеш працює, поки він однозначний у конкретному репозиторії. Якщо згодом з’явиться інший commit із тим самим початком хешу, Git вимагатиме довший фрагмент.
HEAD указує на поточний commit.
Зазвичай HEAD указує на поточну гілку, а гілка — на останній commit.
Хеш — унікальний ідентифікатор commit.
Скорочений хеш можна використовувати, якщо він однозначний.
HEAD~ і HEAD~1 означають безпосереднього попередника.
HEAD~2, HEAD~3 та інші записи дозволяють перейти далі в історію.
HEAD^ означає першого батька commit.
HEAD^2 використовується для другого батька merge commit.
Гілки, хеші та вирази на основі HEAD можна використовувати в git show, git diff, git log та інших командах.
Перехід безпосередньо до commit створює стан detached HEAD.