Skip to main content

Чим відрізняється HEAD~1 від HEAD^?

Коротко

  • HEAD~1 - це попередній коміт за ланцюгом
  • HEAD^ - це батько коміту

У звичайних (не merge) комітах вони однакові. Різниця з'являється тільки при merge.


HEAD~1 - крок назад по історії

Запис:

bash
HEAD~1

Означає:

  • «взяти першого батька»
  • «перейти на один коміт назад»

Можна продовжувати:

bash
HEAD~2 HEAD~3

Тобто ~ - це кількість кроків назад.


HEAD^ - батько коміту

Запис:

bash
HEAD^

Означає:

  • «перший батько поточного коміту»

Для merge-коміту є кілька батьків:

bash
HEAD^1 # перший батько HEAD^2 # другий батько

Де з'являється різниця (ключовий момент)

Уявімо merge-коміт:

C---D (feature) / \ A---B-------M (main)
  • HEADM
  • HEAD^1B (гілка main)
  • HEAD^2D (гілка feature)
  • HEAD~1B (завжди перший батько)

~ завжди йде по першій лінії історії, ^ дає вибір, якого батька взяти.


Важливий висновок для співбесіди

  • HEAD~1HEAD^ якщо коміт не merge
  • при merge:
    • ~ - тільки основний шлях
    • ^ - доступ до конкретних батьків

Коротка таблиця

ЗаписЩо означає
HEAD~1один коміт назад
HEAD~2два коміти назад
HEAD^перший батько
HEAD^2другий батько (merge)

Коротка відповідь для співбесіди

HEAD~1 - це перехід на попередній коміт по основній лінії історії. HEAD^ - це батько коміту. У звичайних комітах вони однакові, але при merge ^ дозволяє обрати конкретного батька, а ~ завжди йде по першому.


Часта помилка

«Це просто два способи написати одне й те саме» - неправильно. Вони збігаються тільки в лінійній історії.

Коротка відповідь

Для співбесіди
Premium

Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.