ProGit 정리 - 조회하기
리비전 조회하기
#!/bin/bash
$ git log --abbrev-commit --pretty=oneline
$ git log --oneline --pretty=graph
위와 같은 명령으로 commit의 SHA-1 hash 값들을 확인 할 수 있다.
1. 커밋 하나 조회하기
git show 명령으로 commit을 조회할 수 있다.
git show [commit hash 값]
2. 브랜치로 가리키기
위에서 commit hash값 대신에 브랜치 명을 사용할 수 있다.
git show dev-week3-martin
예시를 보여주면 아래와 같다.
branch가 가리키는 개체의 SHA-1 값에 대한 궁금증은 rev-parse라는 Plumbing 도구가 해결해 준다.
Chapter 10에서 설명한다고 하니 일단 넘어간다.
rev-parse는 저수준 명령이라 평소에는 사용할 일이 없다. 그래도 사용해보면 어떤 결과가 나오나 봤다.
3. RefLog로 가리키기
Git은 자동으로 브랜치와 HEAD가 지난 몇 달 동안에 가리켰었던 커밋을 모두 기록한다. 이 로그가 Reflog다.
git 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}
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한 대상 브랜치이다.)
이를 그림으로 나타내면 아래와 같다.
위 상황에서
#!/bin/bash
$ git checkout master
$ git merge dev
명령을 수행하면 다음 그림처럼 변한다.
이 상황에서 HEAD
, HEAD^
, HEAD^2
의 위치는 다음과 같다.
외에도 commit을 중심으로 계층 관계로 이동할 수 있는 것은 HEAD~숫자
도 가능하다. 예상하는 것처럼 HEAD~3
명령은 HEAD^^^
와 동일한 표현이다.
5. 범위로 커밋 가리키기
5.1 DOUBLE DOT
범위를 표현하는 문법으로 Double Dot(..)을 많이 쓴다.
이를 이해하기 위해 비슷한 상황을 만들었다. 위 그림과 동일한 이름으로 커밋을 생성했다.
위와 같은 그림에서 master..dev라고 하면 master에는 없지만, dev에는 있는 커밋을 가리킨다.
git log master..dev
명령은 아래와 같다.
$ git log master..dev
B2
B1
반대로 dev..master라고 하면 dev에는 없지만 master에는 있는 커밋을 가리킨다.
git log 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 사이에서 공통으로 가지는 것을 제외하고 서로 다른 커밋만 보여준다.
위 그림에서 triple dot을 사용해서 로그를 보면 다음과 같이 나온다.
$ git log master...dev
A5
A4
B2
B1
–left-right 옵션을 추가하면 좀 더 이해하기 쉬워진다.
$ git log --left-righ master...dev
< A5
< A4
> B2
> B1
–left-right 옵션은 다음과 같이 나온다.
- 참고자료: ProGit - 7장 중 리비전 조회하기
댓글남기기