Table of Contents
Open Table of Contents
git caret (^) and tilde (~) operators
git reset
이나 git cherry-pick
을 사용할 때,
특정 커밋을 지정하기 위해 ^
(caret)과 ~
(tilde) 연산자를 사용한다.
^<n>
: 여러 부모 중 n 번째 커밋을 가리킨다.~<n>
: n 번째 조상을 가리킨다. 부모의 부모로 몇번 거슬러 갔는지.^^^
=^1^1^1
=~3
G H I J\ / \ /D E F\ | / \\ | / |\|/ |B C\ /\ /AA = = A^0B = A^ = A^1 = A~1C = A^2D = A^^ = A^1^1 = A~2E = B^2 = A^^2F = B^3 = A^^3G = A^^^ = A^1^1^1 = A~3H = D^2 = B^^2 = A^^^2 = A~2^2I = F^ = B^3^ = A^^3^J = F^2 = B^3^2 = A^^3^2
G H I J\ / \ /D E F\ | / \\ | / |\|/ |B C\ /\ /AA = = A^0B = A^ = A^1 = A~1C = A^2D = A^^ = A^1^1 = A~2E = B^2 = A^^2F = B^3 = A^^3G = A^^^ = A^1^1^1 = A~3H = D^2 = B^^2 = A^^^2 = A~2^2I = 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^..CommitId99
는 D..CommitId99
로 해석되고,
따라서 M
을 포함하지 않는다.
결론: cherry-pick을 할 때는 ~
를 사용하는 것이 더 안전하다.