tag1
과 tag2
사이의 커밋을 보려면 git log tag1..tag2
을 사용하고 있습니다 (여기서 tag1
은 이전 태그이고 tag2
은 최신 태그 임). tag1
과 tag2
사이에 만들어진 커밋을 볼 것으로 예상했지만 tag1
의 날짜 이전에 커밋 된 커밋을보고 있습니다. 왜 이럴 수 있니?태그보다 오래된 커밋을 보여주는 두 태그 사이에 로그가 있습니까?
답변
commit1..commit2
은 사람들이 처음 의미하는 것이라고 생각하지는 않습니다. 사실,이 표기법은 commit2 ^commit1
의 줄임말입니다. 의미는 다음과 같습니다. 을 제외한 commit2
에서 도달 가능한 커밋을 찾고 commit1
에 도달 할 커밋을 찾습니다.
"도달 할 수있는"개념은 약간 까다 롭습니다. 나는 "페인트가 빨간색이나 초록색을 일시적으로 저 지르다"고 생각합니다. 빨간색은 중지를 의미하고 녹색은 보통 때와 같이 의미합니다. 우리는 최신 커밋부터 시작하여 거꾸로 작업합니다. 빨간색 페인트는 녹색 페인트를 무시합니다. 정지 된 커밋은 다른 것으로 바뀌어도 중단 된 상태로 있습니다. 우리는 해당 버전 1.0
, 1.1
및 2.0
(v
와 태그)를 발표했다 여기
tag:v2.0
|
v
J1--J2 <-- release/2
/
...--G--H--I--J--... <-- mainline
\
H1--H2--H3--H4--H5 <-- release/1
^ ^
| |
tag:v1.0 tag:v1.1
:
는 새로운 커밋은 항상 오른쪽에 추가됩니다 이와 같이 그래프를 커밋 고려 각각 H2
, H5
및 J2
입니다. 일부 이름 mainline
포인트는 J
후 커밋, 그래서 우리는 녹색으로 이름 mainline
을 사용하는 경우/그래서 우리는 J
에 이르기까지 모든 커밋을 얻을 가서 I
, H
, G
에 뒤로 계속합니다. 우리는 결코 "다시 오른쪽으로"가지 않습니다. 그래서 우리는 어떤 여분의 도형도 결코 페인트하지 않습니다. Jn
또는 Hn
은 녹색입니다. 마찬가지로 H2
을 빨간색으로 칠하면 H2
, 그 다음은 H1
, 그 다음은 H
및 G
이므로 계속 오른쪽으로 이동하지 않으므로 I
또는 그 이상을 터치하지 마십시오. 권리.
커밋 확인시 v1.0..v1.1
이 표시되고 커밋이 H5
인 경우 H4
일 때 H3
이 표시됩니다. 그들은 v1.1
aka H5
에서 시작하여 초록색으로 칠해졌으며 (v1.0
aka H2
부터 시작하여) 빨간색으로 칠한 적이 없습니다. v1.1..v2.0
을보고 J2
을보고 J1
을 입력 한 다음 J
을 입력 한 다음 I
을 입력하고 H
을 입력합니다. 그게 전부 괜찮아요, 아마 당신이 기대하는 것입니다.
그러나이 그래프는 매우 선형입니다. 우리는 그래프의 일부 포크와 병합 동작 있다고 가정하자 :
G--H
/ \
...--E--F K--L <-- branchname
\ /
I--J
을 우리가에서 시작 L
을 커밋 선택하고, J
에서 중지 할 수 있습니다. 우리는 J
빨강, 그리고 I
과 F
과 E
등등은 모두 빨간색입니다. 그런 다음 우리는 L
녹색, 그리고 K
녹색, 그리고 H
녹색, 그리고 G
녹색 페인트. F
은 이미 빨간색입니다 (녹색 뒤에 빨간색으로 표시되면 빨간색으로 덮어 쓰기됩니다).어떤 의미에서 G
이 아마도 J
보다 이전 임에도 불구하고, 최종 커밋 목록은 L
, K
, H
및 G
입니다. 트릭은 G
이 이 아니고J
에 도달 할 수 있다는 것입니다. 힘내는 날짜를 전혀 지키지 않는다. 커밋 그래프의 도달 가능성에 의한 것이다.
도 참조하십시오. my answer에서 List commits between 2 commit hashes in git, 더 일반적으로는 Think like (a) Git을 참조하십시오.
정교한 설명에 감사드립니다. – lebowski