ProGit 정리 - 조회하기

2 분 소요

리비전 조회하기

#!/bin/bash
$ git log --abbrev-commit --pretty=oneline
$ git log --oneline --pretty=graph

위와 같은 명령으로 commit의 SHA-1 hash 값들을 확인 할 수 있다.

git log

1. 커밋 하나 조회하기

git show 명령으로 commit을 조회할 수 있다.

git show [commit hash 값]

2. 브랜치로 가리키기

위에서 commit hash값 대신에 브랜치 명을 사용할 수 있다.

git show dev-week3-martin 예시를 보여주면 아래와 같다.

show branch

branch가 가리키는 개체의 SHA-1 값에 대한 궁금증은 rev-parse라는 Plumbing 도구가 해결해 준다.

Chapter 10에서 설명한다고 하니 일단 넘어간다.

rev-parse는 저수준 명령이라 평소에는 사용할 일이 없다. 그래도 사용해보면 어떤 결과가 나오나 봤다.

rev-parse

3. RefLog로 가리키기

Git은 자동으로 브랜치와 HEAD가 지난 몇 달 동안에 가리켰었던 커밋을 모두 기록한다. 이 로그가 Reflog다.

git reflog를 실행하면 다음과 같이 로그를 볼 수 있다.

reflog

Git은 브랜치가 가리키는 것이 달라질 때마다 그 정보를 임시 영역에 저장한다. @{n} 규칙을 사용해서 HEAD가 n번 전에 가리켰던 것을 알 수 있다.

git show HEAD@{n}

순서뿐 아니라 시간도 사용할 수 있다. 어제 날짜의 master 브랜치를 보고 싶으면 다음처럼 한다.

git show master@{yesterday}

나는 master branch의 변화가 거의 없으므로 dev-week3-martin 브랜치를 봤다.

git show dev-week3-martin@{yesterday}

show yesterday

Reflog의 일은 모두 로컬의 일이기 때문에 원격 저장소나 다른 동료의 저장소에는 내 Reflog가 있을 수 없다.

또한 git show HEAD@{몇일 전} 과 같은 명령도 몇일 전에 이 저장소에서 HEAD가 이동한 일이 있어야 결과가 나온다.

4. 계통 관계로 가리키기

계통 관계라고 표현했는데, 부모 커밋과 자식 커밋간의 관계를 말하는 것 같다.

HEAD를 이동 시킬 때 HEAD의 부모 커밋을 가리키는 것은 HEAD^ 이다.

git show HEAD^ 명령은 HEAD의 부모 커밋을 보여주는 명령이다.

위 명령에서 HEAD 위치에는 commit hash값이 들어가도 된다.

HEAD^2도 가능한데, 이는 HEAD^^와는 다르다. HEAD^2는 HEAD의 두 번째 부모 커밋을 가리킨다.

따라서 현재 HEAD는 두 번째 부모가 있는 Merge 커밋이어야 한다. (첫 번째 부모 커밋은 merge할때 checkout한 브랜치, 두 번째 부모 커밋은 merge한 대상 브랜치이다.)

이를 그림으로 나타내면 아래와 같다.

before merge

위 상황에서

#!/bin/bash
$ git checkout master
$ git merge dev

명령을 수행하면 다음 그림처럼 변한다.

after merge

이 상황에서 HEAD, HEAD^, HEAD^2의 위치는 다음과 같다.

merge head

외에도 commit을 중심으로 계층 관계로 이동할 수 있는 것은 HEAD~숫자도 가능하다. 예상하는 것처럼 HEAD~3 명령은 HEAD^^^와 동일한 표현이다.

5. 범위로 커밋 가리키기

5.1 DOUBLE DOT

범위를 표현하는 문법으로 Double Dot(..)을 많이 쓴다.

double dot

이를 이해하기 위해 비슷한 상황을 만들었다. 위 그림과 동일한 이름으로 커밋을 생성했다.

dot practice


위와 같은 그림에서 master..dev라고 하면 master에는 없지만, dev에는 있는 커밋을 가리킨다.

git log master..dev 명령은 아래와 같다.

$ git log master..dev
B2
B1

master..dev


반대로 dev..master라고 하면 dev에는 없지만 master에는 있는 커밋을 가리킨다.

git log dev..master 명령은 아래와 같다.

dev..master

$ git log dev..master
A5
A4

만약 dev 브랜치를 master에 머지 할때 마다나 리모트 저장소에 푸시할 때 무엇이 바뀌었는지 확인해보고 싶을 때 유용하게 쓸 수 있다.

git log origin/master..HEAD 명령으로 origin/master에는 없지만, HEAD가 가리키고있는 브랜치에는 있는 커밋들이 나온다.

한쪽 Refs를 생략하면 Git은 HEAD라고 가정한다. 따라서 git log origin/master..git log origin/master..HEAD와 동일하다.

not이나 ^ 옵션으로 위와 동일한 명령을 할 수 있다. 아래 명령을 모두 같은 명령이다.

#!/bin/bash
$ git log refA..refB
$ git log ^refA refB
$ git log refB --not refA

–not이나 ^ 옵션을 사용해서는 세 개 이상의 Refs에서 포함하지 않는 커밋을 볼 수 있다.

예를 들어 refA, refB에는 있지만 refC에는 없는 커밋을 보려면 다음 명령을 사용하면 된다.

#!/bin/bash
$ git log refA refB ^refC
$ git log refA refB --not refC

5.2 TRIPLE DOT

Triple Dot은 두 Refs 사이에서 공통으로 가지는 것을 제외하고 서로 다른 커밋만 보여준다.

double dot

위 그림에서 triple dot을 사용해서 로그를 보면 다음과 같이 나온다.

$ git log master...dev
A5
A4
B2
B1

–left-right 옵션을 추가하면 좀 더 이해하기 쉬워진다.

$ git log --left-righ master...dev
< A5
< A4
> B2
> B1

dot practice

master..dev

–left-right 옵션은 다음과 같이 나온다.

master..dev

  • 참고자료: ProGit - 7장 중 리비전 조회하기

태그:

카테고리:

업데이트:

댓글남기기