파일을 수정 한 최신 git commit을 어떻게 찾을 수 있습니까?


180

소스 파일을 수정 한 가장 최근의 커밋을 찾고 싶습니다.

git blame각 줄의 커밋 날짜를 모두 볼 수는 있지만 파일을 마지막으로 터치 한 커밋이 무엇인지 정확히 알기가 어렵습니다.

내 자식 저장소에서 주어진 파일을 건드린 마지막 커밋을 어떻게 찾을 수 있습니까?

답변:


230

git log 특정 파일 및 디렉토리의 기록을 볼 수 있도록 지원하므로 다음과 같이 호출 할 수 있습니다.

git log my/file.c

스크립트에서 사용하기 위해 가장 최근의 커밋 하나만 나열 하려면 다음 -n 1옵션을 사용하십시오 .

git log -n 1 --pretty=format:%H -- my/file.c

--pretty=format:%hgit log커밋 해시 만 표시하도록 지시 합니다. --separater는 모호한 그냥 경우,이 이름을 커밋으로 해석하기에서 파일 이름을 중지합니다.


12
브랜치에 관계없이 파일이 마지막으로 수정 된 시간을 알고 싶다면 --all옵션 을 추가하여 모든 브랜치를 고려할 수 있습니다 .
KC

44

가장 최근의 커밋 을 찾으 려면 원하지 않는 git-log, you은 원하는 git-rev-list커밋 객체를 해당 커밋 경로에서 가장 최근의 것으로 시작하여 (시간순으로) 나열합니다. 간단히 말해서:

git rev-list -1 <commit> <filename>

를 들어 git-rev-list귀하의 경우, 당신은 공급 단지 :

  • 포함 할 커밋 수 또는 가장 최근의 경우 -1
  • 다시 볼 분기 (또는 커밋 ID), 이미있는 경우 HEAD 또는 알려진 모든 커밋을 원하면 --all
  • 파일의 상대 경로입니다.

이것은 현재 브랜치에서 가장 최근의 커밋 ID를 반환하여 해당 파일을 변경합니다. 215095e2e338525be0baeeebdf66bfbb304e7270

보다 복잡한 예를 들어, 태그 이름과 원격 참조를 사용하고 와일드 카드와 함께 상대 경로 이름을 포함 할 수 있습니다. 예를 들면 다음과 같습니다.

git rev-list origin/user/bob/testbranch -1 src/bfiles/*.txt

...이 분기의 역사에서 가장 최근에 와일드 카드가 변경된 것이 무엇인지 알려줄 것입니다. rev-list에 대한 옵션은 극단적이며 가장 중요한 배관 명령 중 하나이므로 상상할 수있는 기준에 따라 포함하거나 제외 할 수 있습니다.

물론 git-rev-list (1) 매뉴얼 페이지를 참조하십시오 .


왜 사용 git-log이 열등한 지 설명하지 않았습니다 .
Piotr Dobrogost 2016 년

7
기본적으로 불필요한 정보를 제공한다는 것만으로는 열등하지 않습니다. git-rev-list는 커밋 ID를 반환합니다. 커밋 ID는 스크립트 또는 다른 자동화 프로세스에 응답을 제공하려는 경우 원하는 것입니다. git-log는 먼저 git-rev-list를 사용하여 커밋 ID를 수집 한 다음 각 커밋에 대한 정보를 수집하여 선택한 커밋에 대한 정보를 반환합니다. 커밋 정보를 필터링하고 ID를 사용하려는 경우 먼저 git-rev-list를 사용할 수 있습니다. 로그는 rev-list를 기반으로하므로 대부분의 동일한 필터 매개 변수를 사용합니다.
Michael Erickson

3
git-log도자기, git-rev-list배관입니다.
blitzen9872

27

특정 파일 세트를 수정하기 위해 최신 커밋의 해시를 얻으려면 awk다음을 사용할 수 있습니다.

git log -n 1 --pretty=format:%h -- <path>

with를 사용하여 커밋 해시를 얻는 데 유용 할 수 있습니다 git describe.

예를 들어 (누군가에게 유용한 경우)…

소스 파일을 변경하려는 최신 커밋을 고려하여 현재 버전 ID를 만듭니다 (버전과 같은 태그로 버전을 표시한다고 가정 mycode-1.2.1).

COMMIT=$(git log -n 1 --pretty=format:%h -- *.c *.h)
if VN=$(git describe --always --abbrev=5 --match "mycode-*" $COMMIT 2>/dev/null) &&
case "$VN" in
mycode-*)
    git update-index -q --refresh
    test -z "$(git diff-index --name-only HEAD *.c *.h)" ||
    VN="$VN-mod" ;;
*) VN="mycode-unknown-g$VN" ;;
esac
then
    continue
else
VN="mycode-unknown"
fi

이것은 다음과 같은 ID를 생성합니다.

  • mycode-1.2.1 -소스 파일의 현재 상태가 태그 된 버전에 해당하는 경우
  • mycode-1.2.1-g3k7s2 -소스 파일의 현재 상태가 태그 된 버전을 따르는 커밋에 해당하는 경우
  • mycode-1.2.1-g3k7s2-mod -태그 된 버전에 따른 마지막 커밋 이후 소스 파일의 현재 상태가 수정 된 경우
  • mycode-unknown -아직 작성된 버전 태그가없는 경우

5
$VN일종의 악몽 언데드 SVN처럼 보인다
ThorSummoner

10

이것이 원하는 것인지 확실하지 않지만 git log <thefile>해당 파일을 변경 한 커밋을 얻으려면하십시오. 가장 높은 것을 선택할 수 있습니다. 당신이 찾고있는 것이어야합니다.


4
만약 당신이 자원을 낭비하고 싶을 git log -n1 -- <thefile>때 출력을 파이프로 연결 head -1한다면 수동으로 맨 위 줄을 선택할 필요가 없습니다 (Jo Liss의 답변 참조 )
Tobias Kienzler

4
좋은 지적. 나는 당신이 또한 건너 뛰고 직접 -n사용할 수 있다고 생각합니다 -1.
Noufal Ibrahim

3

한 줄에 심판을 얻으려면 다음을 시도하십시오.

git log -n1 --oneline <path> | awk '{print $1;}'

2

사용하려는 커밋의 SHA ID가 있으면 해당 커밋에 대해 git log FILENAME수행 한 작업 git show SHA_ID_HERE을 확인할 수 있습니다. 전체 ID를 입력 할 필요조차 없습니다. 처음 6 자이면 충분합니다.


4
그것은 OP가 요청한 것보다 조금 더 많지만 참고로 이것을 하나의 라이너로 결합 할 수 있습니다.git show $(git log -1 --pretty="%H" -- FILENAME)
Tobias Kienzler
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.