마지막 변경에 대한 git diff 파일


236

git이 특정 파일 사이에 diff를 생성하고 파일을 변경 한 마지막 커밋 이전에 존재하는 것처럼 diff를 생성 할 수 있습니까?

즉, 우리가 알고 있다면 :

$ git log --oneline myfile
123abc Fix some stuff
456def Frobble the foos
789dba Initial commit

그런 다음 git diff 456def myfilemyfile의 마지막 변경 사항을 표시합니다. 에 의해 생성 된 지식 없이도 동일한 작업을 수행 할 수 있습니다 git log. 123abc에서 무엇이 바뀌 었습니까?


8
나는git diff HEAD^ <file_path>
asgs

4
@asgs - (- 두 가지 이유합니까 내가 요구 한 것을하지 HEAD^되고 123abc, HEAD^^이다 456def, 그리고 다른 커밋이 있다면 이 파일에 영향을 미치지 않았다 다음 HEAD^그들에게 의미)
Chowlett

당신이 놓친 맞아요는 부분을 "마지막은 그것을 변경 커밋"
asgs

답변:


215

이것은 존재하지만 실제로는 다음과 같은 기능입니다 git log.

git log -p [--follow] [-1] <path>

참고 -p또한 하나의 인라인은 diff를 표시하는 데 사용할 수있는 커밋 :

git log -p -1 <commit>

사용 된 옵션 :

  • -p( -u또는 --patch)은 git-log매뉴얼 페이지 에 숨겨진 deeeeeeeep 이며 실제로 표시 옵션입니다 git-diff. 와 함께 사용하면 log, 그것은 생성 될 패치를 보여줍니다 각 커밋을 (가) 정보와 커밋 따라와, 가죽 지정된 만지지 마십시오 커밋 <path>. (이 동작은의 단락에 설명되어 있으며 --full-diff, 이로 인해 각 커밋의 전체 차이점이 표시됩니다.)
  • -1지정된 파일에 대한 가장 최근의 변경 사항 표시 합니다 ( -n 1대신 사용할 수 있음 -1). 그렇지 않으면 해당 파일의 0이 아닌 모든 diff가 표시됩니다.
  • --follow 이름을 변경하기 전에 발생한 변경 사항을 보려면 필수입니다.

내가 알 수있는 한, 이것은 git log수정본 수를 계산하거나 커밋의 해시를 결정하기 위해 (또는 유사한) 파일을 사용하지 않고 파일의 마지막 변경 사항을 즉시 볼 수있는 유일한 방법 입니다.

이전 버전의 변경 사항을 보려면 로그를 스크롤하거나 로그를 시작할 커밋 또는 태그를 지정하십시오. (물론 커밋 또는 태그를 지정하면 올바른 커밋 또는 태그가 무엇인지 알아내는 원래 문제로 돌아갑니다.)

크레딧이 필요한 신용 :

  • 이 답변log -p 덕분에 발견했습니다 .
  • FranciscoPuga 에게이--follow 옵션 을 보여준 답변 에 감사드립니다 .
  • 언급에 대한 ChrisBetti에 신용 -n 1언급에 대한 옵션 atatko -1변형.
  • 실제로 문서를 읽고 -p의미 적으로 "의미"가 무엇인지 알아낼 수있게 해준 sweaver2112에게 감사드립니다 .

6
이것은 나에게 훌륭한 솔루션이었습니다. 내가 달릴 때마다 커밋 현재 파일의 차이를 보였git log -p filename
이안 제이미 슨

4
완전한. 마지막 변경 사항 만 보려면 -n 1매개 변수 를 추가하는 것만 큼 간단합니다 . git log -p -n 1 filename
Chris Betti

@ChrisBetti 감사합니다; 나는 그것을 내 대답에 통합했습니다!
Kyle Strand

1
-n 1또한로 대체 될 수 있습니다 -1. 구문을 선호하는 결과를 변경하지 않습니다.git log -p -1 filename
atatko

1
유용한 옵션 "--skip = [n]"이 있습니다. 입력 git log -p -1 --skip=1 <path>하여 두 번째 커밋을 표시 할 수 있습니다 .
Maciek Łoziński 2016 년

220

git diff를 사용하는 방법 중 하나는 다음과 같습니다.

git diff <commit> <path>

마지막 커밋의 한 커밋을 참조하는 일반적인 방법은 실제 HEAD에 대한 상대 경로입니다. 이전 커밋을 HEAD ^ (예제에서는 123abc) 또는 HEAD ^^ (예제에서는 456def) 등으로 참조 할 수 있습니다 ...

따라서 귀하의 질문에 대한 답변은 다음과 같습니다.

git diff HEAD^^ myfile

6
오 당연하지. 나는 시도 HEAD^했지만 물론 아무것도 생산하지 못했습니다. 시도하지 않았다 HEAD^^.
Chowlett

17
오래 전에 커밋에 대한 아마 쉽게 구문 :HEAD~2
ibizaman

19
HEAD^^ myfile변경된 두 번째에서 마지막 커밋을 실제로 참조하는 것은 사실이 아닙니다 (적어도 Git 1.9.0의 경우) myfile. 전체에서 두 번째에서 마지막 커밋을 나타냅니다. 커밋 해시를 지정하거나 (일부) 해당 파일에 대한 마지막 변경 사항 과 현재 개정판 사이의 커밋 수를 세지 않고 "이 파일의 마지막 변경 사항을보고 싶습니다"를 지정하는 방법이 있습니까?
Kyle Strand

3
흠, git log -p꽤 가까운 것 같습니다 .
Kyle Strand

30
downvote reason : 질문은 "현재 파일과 마지막 커밋 이전 존재했던 특정 파일 사이에 "라는 메시지를 표시하지만 마지막 전체 커밋에서 파일이 변경되지 않은 경우에는이 답변이 작동하지 않습니다.
Chris Betti

8

그래픽 도구를 사용하는 것이 좋으면 잘 작동합니다.

gitk <file>

gitk는 이제 파일이 업데이트 된 모든 커밋을 보여줍니다. 커밋을 표시하면 목록의 이전 커밋에 대한 차이점을 보여줍니다. 이것은 디렉토리에서도 작동하지만 선택한 커밋에 대해 비교할 파일을 선택할 수도 있습니다. 매우 유용합니다!


1
또한 매우 유용합니다 : git difftool HEAD^ file또는git difftool -d HEAD^ path
ForeverLearning
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.