'git log'로 첫 번째 커밋을 표시하는 방법은 무엇입니까?


290

오랜 역사를 가진 프로젝트가 있습니다. git의 첫 번째 커밋을 보여주고 싶습니다.

어떻게해야합니까?


2
나는 마지막을 보여줄 방법을 찾았다 git log -1.
alex

답변:


299

짧은 답변

git rev-list --max-parents=0 HEAD

(에서 tiho의 코멘트 . 마찬가지로 크리스 욘센 고지 , --max-parents이 답변이 게시 된 이후 도입되었다.)

설명

기술적으로 루트 커밋이 둘 이상있을 수 있습니다. 이것은 이전에 독립적 인 여러 기록이 병합 될 때 발생합니다. 하위 트리 병합을 통해 프로젝트를 통합 할 때 일반적 입니다.

git.git저장소의 역사 그래프에서 여섯 루트 커밋이 (각각 하나씩을 리누스의 초기 투입, gitk이 일부 초기에 별도의 도구, 자식 - GUI를 , gitweb , 그리고 자식-P4 ). 이 경우, 우리는 이것이 e83c516우리가 관심을 가질만한 것임을 알고 있습니다. 가장 이른 커밋과 루트 커밋입니다.

일반적인 경우에는 그렇게 간단하지 않습니다.

libfoo 가 한동안 개발되어 Git 저장소 ( libfoo.git)에 기록을 유지 한다고 상상해보십시오 . 독립적으로, "bar"프로젝트도 개발 bar.git중이지만 (in ), 긴 libfoo가 아닙니다 (가장 빠른 날짜 libfoo.git의 커밋이 커밋보다 앞에있는 날짜가 있음 bar.git). 어떤 시점에서“bar”개발자 는 하위 트리 병합을 사용하여 libfoo 를 프로젝트에 통합하기로 결정합니다 . 이 병합 이전에는 "첫 번째"커밋을 결정하는 것이 쉽지 않았을 것입니다 bar.git(아마도 하나의 루트 커밋이 있었음). 그러나 병합 후 여러 루트 커밋이 있으며 가장 초기 루트 커밋은 실제로 libfoo 의 역사에서 비롯됩니다."바"가 아닙니다.

다음과 같이 히스토리 DAG의 모든 루트 커밋을 찾을 수 있습니다.

git rev-list --max-parents=0 HEAD

레코드의 경우 --max-parents사용할 수없는 경우 다음과 같이 작동합니다.

git rev-list --parents HEAD | egrep "^[a-f0-9]{40}$"

유용한 태그가 있으면 git name-rev히스토리에 대한 간단한 개요를 제공 할 수 있습니다.

git rev-list --parents HEAD | egrep "^[a-f0-9]{40}$" | git name-rev --stdin

보너스

이것을 자주 사용합니까? 기억하기 어려운가요? 빠른 액세스를 위해 자식 별칭 추가

git config --global alias.first "rev-list --max-parents=0 HEAD"

이제 간단하게 할 수 있습니다

git first

49
나는 git rev-list --max-parents=0 HEAD똑같이 할 것이라고 믿으며 조금 더 간단합니다.
tiho

3
@tiho : 예, 똑같고 더 간단합니다. 그러나이 옵션은 이 질문 / 응답 당시에 “발명” 되지 않았습니다 .
Chris Johnsen

첫 커밋은 루트 커밋 보다 리프 커밋에
가깝습니다.

@tiho 귀하의 답변은 의견이 아닌 자체 답변이어야한다고 생각합니다. 그렇게하면 더 눈에 띄게되며 많은 가치가 있습니다.
Russell Silva

@RussellSilva 포인트는 신경 쓰지 않지만 다른 사람들의 답변을 편집하는 것이 가능하다고 생각합니다. 새로운 답변을 추가하는 것보다 낫습니다. 나는 정말로 그것을 스스로하는 것이 편안하지 않다, 그것을 자유롭게해라 :)
tiho

416

나는 그것을 발견했다 :

git log --reverse

시작부터 커밋을 보여줍니다.


19
흥미롭게도 어떤 이유로 든 git log --reverse -5무시합니다--reverse
Dan2552

6
@ Dan2552 버그 인 것 같습니다.보고해야합니까?
saeedgnu

23
이 같은 모습은 처음 5 개 항목을 결과를 제한하고 역
nonopolarity

3
@ 太極 者 無極 而 生이 옳습니다. 문서화 된 행동입니다.
seriousdev

44

당신은 당신의 로그를 반전하고 첫 번째 결과를 위해 향할 수 있습니다.

git log --pretty=oneline --reverse | head -1

7
git log --reverse히스토리를 되돌 리므로 첫 번째 커밋을 얻는 head -1대신 사용해야 합니다 tail -1.
rubiii

4
주어진 git이 -n플래그를 무시하지 않으면 가장 좋습니다 --reverse.
Frederick Nord


6

가장 아름다운 방법은 아닙니다.

git log --pretty=oneline | wc -l

이것은 당신에게 숫자를 제공합니다

git log HEAD~<The number minus one>

1

git log --format="%h" | tail -1커밋 해시 (ie 0dd89fb)를 제공합니다.

git diff `git log --format="%h" --after="1 day"| tail -1`..HEAD 마지막 날의 모든 커밋을 볼 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.