부모와 커밋을 어떻게 다른가요?


460

별명이나 스크립트를 작성하는 것 외에도 특정 커밋에 대한 diff를 얻는 명령이 더 짧습니까?

git diff 15dc8^..15dc8

단일 커밋 id 만 제공하면 git diff 15dc8해당 커밋을 HEAD와 비교합니다.


이것에 대한 가장 멋진 점은 diff를 보여주는 도구를 사용하여 "git difftool"과 함께 작동한다는 것입니다.
orip

참고로이 다른 질문에 대한 대답은 위의 내용을 단순화하기 위해 bash 기반 별칭을 설정하는 방법을 보여줍니다. stackoverflow.com/questions/3321492/…
Nick

답변:


641

사용하십시오 git show $COMMIT. 커밋에 대한 로그 메시지와 해당 커밋의 차이점을 보여줍니다.


45
너무
나쁘면

1
@orip 항상 GIT_EXTERNAL_DIFF를 difftool과 동일한 작업을 수행하는 스크립트로 설정할 수 있습니다.
slacy

7
JakubNarebski의 답변을 선호합니다. 커밋 표현식은 여러 컨텍스트에서 작동
하므로

1
diff가 표시되지 않으면 병합 커밋과 같은 실제 변경 사항이 없을 수 있습니다.
Devin G Rhode

6
@PTWithy : 문제는 "특정 커밋에 대한 차이점을 얻는 데 더 짧은 명령이 있습니까?"라는 질문이었습니다.
mipadi 2016 년

439

사용하다:

git diff 15dc8^!

git-rev-parse (1) 맨 페이지 의 다음 조각 (또는 최신 git gitrevisions (7) 맨 페이지)에 설명 된대로 :

커밋과 그 부모 커밋에 의해 형성된 집합의 이름을 지정하기위한 두 가지 다른 속기는 존재합니다. r1 ^ @ 표기법은 r1의 모든 부모를 의미합니다. r1 ^! 커밋 r1을 포함하지만 모든 부모를 제외합니다.

즉 , 수정이 필요한 git의 어느 곳에서나 15dc8^!속기로 사용할 수 있습니다 15dc8^..15dc8. 용 DIFF 는 명령 git diff 15dc8^..15dc8으로서 이해된다 git diff 15dc8^ 15dc8커밋의 부모 (차이 수단 15dc8^) 및 커밋 ( 15dc8).

참고 : git-rev-parse(1)맨 페이지 의 설명 은 개정 범위 에 대해 설명합니다. 수정 범위 는 둘 이상의 부모와의 병합 커밋에도 작동해야합니다. 그런 다음 r1^!" r1 --not r1^@"즉 " r1 ^r1^1 ^r1^2 ..."


또한 git show COMMIT커밋에 대한 커밋 설명과 diff를 얻는 데 사용할 수 있습니다 . diff 만 원하면 사용할 수 있습니다git diff-tree -p COMMIT


7
이것은 받아 들일만한 대답이어야합니다. 훨씬 더 깔끔합니다. 그러나 git-rev-parse 추출물의 마지막 문장은 다소 혼란 스럽습니다. '이 커밋의 부모 에서이 커밋까지의 범위'를 의미하는 것처럼 보입니다.
RichVel

1
@RichVel : 커밋에 둘 이상의 부모가있는 상황 (병합 커밋)도 설명하기 때문에 약간 혼란 스럽습니다. r1 ^! 그때도 예상대로 작동합니다.
Jakub Narębski

@ JakubNarębski : 좋은 지적, 아마도 당신은 한부모와 다 부모 사례에 대한 이해를 요약하기 위해 답을 편집 할 수 있습니다. 각각에 대한 개별적인 진술은 이해하기 더 쉬울 수 있습니다.
RichVel

1
@ JakubNarębski : 예, 훨씬 낫습니다! 이제이 단축키를 항상 사용합니다. 감사합니다.
RichVel

1
^!부모 속기 표기법은 정상 커밋에 대한 difftool 제대로 작동하지만은 diff는 병합 커밋에 대한 반전됩니다. 왜 그래?
hiPy

56

얼마나 멀리 있는지 아는 경우 다음과 같이 시도 할 수 있습니다.

# Current branch vs. parent
git diff HEAD^ HEAD

# Current branch, diff between commits 2 and 3 times back
git diff HEAD~3 HEAD~2

사전 커밋은 다음과 같이 작동합니다.

# Parent of HEAD
git show HEAD^1

# Grandparent
git show HEAD^2

커밋을 지정할 수있는 많은 방법이 있습니다 :

# Great grandparent
git show HEAD~3

자세한 내용은 이 페이지를 참조하십시오 .


2
HEAD ^ 2는 조부모가 아니며 HEAD ^ 1이 아빠이면 HEAD ^ 2는 엄마입니다. 아빠의 아빠는 HEAD ~ 2를 사용하십시오.
Binarian

11

@mipadi가 지적했듯이을 사용할 수 git show $COMMIT있지만 헤더와 커밋 메시지도 표시됩니다. 직선 차이를 원하면을 사용하십시오 git show --pretty=format:%b $COMMIT.

이것은 분명히 짧은 손이 아니므 로이 별칭을 .gitconfig에 유지합니다.

    [alias]
      sd = show --pretty=format:%b

이 사용하는 저를 가능하게 git sd $COMMIT하는 DIFF 보여줍니다 .


1
이 별칭은 --color를 포함하여보다 쉽게 ​​읽을 수 있습니다. sd = show --color --pretty = format : % b
RichVel

@RichVel 참으로! 아주 좋은 지적입니다. git에서 기본적으로 색상이 활성화되어 있으면이 스위치가 필요하지 않습니다. 그것이 제가 보통하는 일입니다.
Øystein Steimler

5

zsh를 사용하고 옵션 세트 가있는 경우 언급 된 많은 예 (예 : git diff 15dc8^!또는 git diff 15dc8^..15dc8)가 작동하지 않습니다 extendedglob. 다음 세 가지 방법 중 하나로이를 수정할 수 있습니다.

  1. unsetopt extendedglob (및 / 또는 .zshrc에서 제거)

  2. setopt NO_NOMATCH (및 / 또는 .zshrc로 설정)

  3. 캐럿을 피하고 매번 백 슬래시로 쾅하십시오. git diff 15dc8\^\!



2

위의 Paul의 솔루션은 내가 기대했던대로했습니다.

$ git diff HEAD^1

또한 ~ / .gitconfig 파일의 [alias] 섹션에 다음을 입력하면 단축기를 사용하여 헤드와 이전의 차이를 볼 수 있습니다.

[alias]
    diff-last = diff HEAD^1

그런 다음 $ git diff-last를 실행 하면 결과가 나타납니다. 참고이는 것 아직 커밋되지 않은 한 모든 변경뿐만 아니라 커밋 사이의 DIFF합니다. 아직 커밋하지 않은 변경 사항 을 무시 하려면 diff를 사용하여 HEAD를 HEAD의 부모와 직접 비교할 수 있습니다.

$ git diff HEAD^1 HEAD

0

별칭을 사용하므로 귀하의 질문에 정확하게 대답하지는 않지만 귀하가 의도 한 바를 수행하는 데 유용합니다 ...

alias gitdiff-1="git log --reverse|grep commit|cut -d ' ' -f2|tail -n 2|head -n 2|xargs echo|sed -e 's/\s/../'|xargs -n 1 git diff"
alias gitdiff-2="git log --reverse|grep commit|cut -d ' ' -f2|tail -n 3|head -n 2|xargs echo|sed -e 's/\s/../'|xargs -n 1 git diff"
alias gitdiff-3="git log --reverse|grep commit|cut -d ' ' -f2|tail -n 4|head -n 2|xargs echo|sed -e 's/\s/../'|xargs -n 1 git diff"

alias gitlog-1="git log --reverse|grep commit|cut -d ' ' -f2|tail -n 2|head -n 2|xargs echo|sed -e 's/\s/../'|xargs -n 1 git log --summary"
alias gitlog-2="git log --reverse|grep commit|cut -d ' ' -f2|tail -n 3|head -n 2|xargs echo|sed -e 's/\s/../'|xargs -n 1 git log --summary"
alias gitlog-3="git log --reverse|grep commit|cut -d ' ' -f2|tail -n 4|head -n 2|xargs echo|sed -e 's/\s/../'|xargs -n 1 git log --summary"
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.