숏컷 코드
git log main..feature
git log main...feature
git diff main...feature
git show HEAD~1
git show HEAD^2문법
A..B는 B에서 닿지만 A에서는 닿지 않는 commit 집합이다
A..B는 "B에는 있고 A에는 없는 commit"을 볼 때 쓴다. feature branch가 main에 비해 어떤 commit을 추가했는지 확인할 때 자주 사용한다. 이 표기는 diff의 방향과 commit 집합의 의미가 섞여 오해되기 쉬우므로, 먼저 git log A..B로 어떤 commit이 잡히는지 확인하는 습관이 좋다.
git log --oneline main..featureA...B는 양쪽 차이를 보는 symmetric difference다
세 점 표기 A...B는 양쪽 중 한쪽에서만 도달 가능한 commit 집합을 뜻한다. git log main...feature는 양쪽 branch가 공통 조상 이후 어떻게 갈라졌는지 볼 때 유용하다. 다만 git diff main...feature는 명령마다 의미가 다르게 느껴질 수 있으므로, diff에서는 merge base 기준 비교라는 점을 확인해야 한다.
~와 ^는 부모 commit을 고르는 방식이 다르다
HEAD~1은 첫 번째 부모를 한 단계 따라간 commit이다. HEAD~2는 첫 번째 부모를 두 단계 따라간다. 반면 HEAD^2는 merge commit의 두 번째 부모를 가리킨다. 일반 commit은 부모가 하나라 HEAD^와 HEAD~1이 같아 보이지만, merge commit에서는 ^1, ^2의 의미가 중요해진다.
git show HEAD^1
git show HEAD^2
git show HEAD~2range는 명령마다 기대하는 입력이 다를 수 있다
대부분의 history 명령은 commit 집합을 받지만, git diff, git range-diff, git show처럼 revision 표현을 해석하는 방식이 조금씩 다르다. 같은 A..B라도 "commit 목록"을 보는지 "두 끝점의 파일 차이"를 보는지에 따라 결과를 다르게 읽어야 한다.
체크포인트
| 목적 | 표현 |
|---|---|
| feature에만 있는 commit | main..feature |
| 양쪽 branch 차이 commit | main...feature |
| 한 단계 이전 commit | HEAD~1 또는 HEAD^ |
| merge commit의 두 번째 부모 | HEAD^2 |
| range가 맞는지 확인 | git log --oneline <range> |
공식 참고: gitrevisions, Pro Git: Revision Selection
주의할 점
..와 ...는 비슷해 보이지만 다른 commit 집합을 뜻합니다. 특히 git log와
git diff에서 같은 표기를 봐도 질문이 "commit 목록"인지 "파일 차이"인지 먼저
구분해야 합니다.
git log --oneline main..feature
git log --oneline main...feature두 결과가 어떻게 다른지 확인한 뒤 rebase, cherry-pick, release note 작업 범위를 정하는 편이 안전하다.
참고 링크
2 sources