git의 revision에 대해

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로 더 자세한 설명을 볼 수 있다.

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

%s에 연결하는 중