git에서 revision이란 특정 Git object를 가리킬 수 있는 표현식을 의미한다. HEAD~2
, master
, a8dd808db6d87a1d809b1a223e08ab69602b2d3a
, HEAD:test.txt
등이 모두 “revision”이다.
문법
ABNF 로 표현해보면 대략 다음과 같다.
DIGIT = "0" / "1" / "2" / "3" / "4" / "5" / "6" / "7" / "8" / "9"
sha1 = 1*40HEXDIGIT
refname = name / "refs" "/" (name /
("tags" "/" name) /
("heads" "/" name) /
("remotes" "/" name) /
("remotes" "/" name "/" HEAD))
specifier = "@" "{" (date / num) "}"
rev = sha1 / refname [specifier] / specifier /
rev ("^" / "~" / "^" DIGIT / "~" DIGIT)
revision = rev / ":" "/" regexp / ":" ("0" / "1" / "2" / "3") ":" path
예
그닥 잘 알려져 있지는 않지만 간혹 유용한 몇가지 표현을 소개해 보겠다.
@{…}
@
을 이용해, 특정 refname(브랜치 등)이 과거에 가리켰던 커밋을 지칭할 수 있다. 쉽게 말해서 git reflog
에 나열되는 특정 커밋을 지칭할 수 있다.
<refname>@{n}
– refname이 과거에 가리켰던 커밋.git reflog
해보면 무슨 의미인지 알 수 있을 것이다.master@{5}
와 같은 표현이 가능하다.<refname>@{date}
– 특정 날짜, 시각에서 refname이 가리켰던 커밋.master@{yesterday}
식의 표현이 가능하다.
:n:path
:n:path
표현식으로, 주어진 path에 대해 특정 상태에서의 tree 혹은 blob을 지칭할 수 있다.
:0:path
– staging area
머지중인 상태에서는 공통 조상이나 특정 브랜치의 path에 대응하는 tree나 blob을 지칭할 수 있다.
:1:path
– 공통 조상(common ancestor):2:path
– 현재 브랜치:3:path
– 현재 브랜치에 머지되어지는 중인 브랜치
더 자세히
man gitrevisions
로 더 자세한 설명을 볼 수 있다.