HEAD ~ проти HEAD ^ проти HEAD @ {}, також відомий як тильда проти caret проти знака


78

HEAD - це вказівник на поточну гілку. Я бачив різні позначення для предків HEAD, у тому числі

  • HEAD~2
  • HEAD^2
  • HEAD@{2}
  • HEAD~~
  • HEAD^^

Що саме означає кожне з перерахованого? Де документація для цього?



5
git help revisions
Andrew C

Відповіді:


99

З документації тут .

  • HEAD~2 : 2 коміти старше HEAD
  • HEAD^2 : другий батько HEAD, якщо HEAD було об’єднанням, інакше незаконним
  • HEAD@{2} : посилається на 3-й перелік в огляді git reflog
  • HEAD~~ : 2 коміти старше HEAD
  • HEAD^^ : 2 коміти старше HEAD

Якщо HEAD було злиттям, то

  • перший батько - це гілка, до якої ми об’єдналися,
  • другий з батьків - це гілка, яку ми об’єднали.

Деякі комбінації та синоніми

First Parent    First Grandparent    Second Parent    Second Grandparent

HEAD~
HEAD^
HEAD~1          HEAD~2               HEAD^2           HEAD^2~        
HEAD^1          HEAD^^                                HEAD^2^ 

Посилання на документацію ідеальне. Git Book v2 має багато корисних доповнень до v1.
Шон Луттін,

4
HEAD~0це те саме, що HEAD, як і слід було очікувати. Дещо заплутано, HEAD^0це те саме, що HEAD.
Володимир Решетніков

3
Щоб запам’ятати, який символ який, я вважаю корисним, що ^ВИДАЄ, як дві гілки (внизу зліва та внизу праворуч), що об’єднуються в одну (вгорі)
mareoraft

23

суфікси посилань git (^ N, ~ N, @ {...})

ref~є скороченням ref~1і означає першого батька коміту. ref~2означає першого з батьків першого батька коміту. ref~3означає перший батько першого батька коміту. І так далі.

ref^є скороченням ref^1і означає першого батька коміту. Але де ці два відмінності - це ref^2означає другого батька коміту (пам’ятайте, коміти можуть мати двох батьків, коли вони об’єднуються).

Оператори ^ та ~ можна комбінувати.

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

src


4

Я рахую кожен ~або ^маю на увазі "повернення на один рівень назад". Якщо поруч ~(наприклад, ~n) є число, тоді n діє як множник. Якщо поруч ^(наприклад, ^n) є число, то n - це n-ий батько, який слід використовувати (або рух убік, що рухається з позиції стовпця зліва направо в git log --graph).

Приклад:

$ git log --oneline --graph 
*   29392c8 (HEAD -> master, tag: A) A
|\
| * a1ef6fd (tag: C) C
| |
|  \
*-. \   8ae20e9 (tag: B) B
|\ \ \
| | |/
| | *   03160db (tag: F) F
| | |\
| | | * 9df28cb (tag: J) J
| | * 2afd329 (tag: I) I
| * a77cb1f (tag: E) E
*   cd75703 (tag: D) D
|\
| * 3043d25 (tag: H) H
* 4ab0473 (tag: G) G

Координати для вищезазначених тегів:

A =      = A^0
B = A^   = A^1     = A~1
C = A^2
D = A^^  = A^1^1   = A~2
E = B^2  = A^^2
F = B^3  = A^^3
G = A^^^ = A^1^1^1 = A~3
H = D^2  = B^^2    = A^^^2  = A~2^2
I = F^   = B^3^    = A^^3^
J = F^2  = B^3^2   = A^^3^2

Результат git log --online --graphускладнює визначення того, які коміти знаходяться на одному рівні, тож ось ще одна презентація (де "A" - останній коміт, а старі коміти - вгорі):

G   H   I   J
 \ /     \ /
  D   E   F
   \  |  / \
    \ | /   |
     \|/    |
      B     C
       \   /
        \ /
         A

(Ілюстрації уривки з Яка різниця між HEAD ^ та HEAD ~ у Git? ).

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