Skip to content
  • Jan
  • Feb
  • Mar
  • Apr
  • May
  • Jun
  • Jul
  • Aug
  • Sep
  • Oct
  • Nov
  • Dec
  • Sun
  • Mon
  • Tue
  • Wed
  • Thu
  • Fri
  • Sat

2024-07-03

Published:

Table of Contents

Open Table of Contents

git caret (^) and tilde (~) operators

git reset 이나 git cherry-pick 을 사용할 때,

특정 커밋을 지정하기 위해 ^(caret)과 ~(tilde) 연산자를 사용한다.

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
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

git cherry-pick

git cherry-pick A..B 로 범위를 지정해서 여러 커밋을 가져올 수 있다.

이때, A가 더 오래된 커밋이어야한다. A 가 더 최신 커밋이면 sliently fail 한다.

A는 포함되지 않고 B는 포함된다.

A까지 포함해서 B까지를 가져오고 싶으면 A~..B 라고 하면 된다.

A^..B를 하게되면 A가 머지 커밋인 경우에 기대와 다르게 동작하는 경우가 있으므로 주의해야한다.

A---B---C-------D---E--CommitId99 <- master
\ /
X---Y---M <- feature (CommitId1 is M)
A---B---C-------D---E--CommitId99 <- master
\ /
X---Y---M <- feature (CommitId1 is M)

M 이 일반커밋이면

M^, M~ 둘 다 우리가 기대한대로 Y 를 가르키지만,

M이 머지 커밋인 경우에는 D가 첫번째 부모, Y가 두번째 부모로 M^D를 가리키게 된다. (머지 커밋 동작은 더 알아봐야할듯 …)

M^..CommitId99D..CommitId99로 해석되고,

따라서 M을 포함하지 않는다.

결론: cherry-pick을 할 때는 ~를 사용하는 것이 더 안전하다.

참고