Git ~과 ^의 차이

Git 사용법

Posted by jopemachine on December 8, 2021 Updated on September 25, 2022

Git ~과 ^의 차이

Rules of thumb (경험적으로 이렇게 사용한다)

  • ~는 이전 세대 커밋 오브젝트를 가리키기 위해 사용함. (Use ~ most of the time — to go back a number of generations, usually what you want)

  • ^는 커밋들을 병합할 때 (즉, 두 개 이상의 부모 커밋 오브젝트가 존재할 때) 사용 가능. (Use ^ on merge commits — because they have two or more (immediate) parents)

Tilde (틸드), ~

  • git rev-parse documentation에 따르면, ~은 아래와 같이 정의됩니다.
1
2
~<n> suffix는 n번째 조상 커밋 오브젝트를 가리킵니다. 이 때, 부모가 둘 이상이면 첫 번째 부모만을 가리킵니다.
예를 들어, <rev>~3은 rev^1^1^1과 같은 의미이며, rev^^^로도 축약할 수 있습니다.
  • 사실 ~을 사용하면 HEAD 뿐 아니라 모든 커밋의 부모에 접근할 수 있습니다.

  • 예를 들어 master~2는 병합 커밋의 첫 번째 부모의 끝의 두 번째 커밋 오브젝트를 가리킵니다.

Caret (캐럿), ^

  • Git history는 non-linear 합니다 (DAG 형태를 띕니다.)

  • 오직 한 개의 부모만을 갖는 커밋 오브젝트의 경우 rev~rev^는 같은 커밋 오브젝트를 가리킵니다.

  • 그렇기 때문에 ^은 오직 병합 커밋에서 유용합니다.

실제 예제

  • Tilde와 Caret의 실제 사용 예제는 아래와 같습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
G   H   I   J
 \ /     \ /
  D   E   F
   \  |  / \
    \ | /   |
     \|/    |
      B     C
       \   /
        \ /
         A

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

원문