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


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.