git : pull 후 변경된 파일과 이전 버전을 비교하는 방법은 무엇입니까?


117

"git pull"을 실행할 때 파일의 마지막 버전과 새 버전간에 무엇이 변경되었는지 자주 알고 싶습니다. 다른 사람이 특정 파일에 어떤 작업을 수행했는지 알고 싶습니다.

어떻게 된 거죠?

커밋 x 대 커밋 y에 대한 일부 매개 변수가있는 "git diff"라고 가정하고 있지만 구문을 얻을 수없는 것 같습니다. 또한 "git log"가 약간 혼란스럽고 최신 버전의 파일과 새 버전의 커밋 ID를 어디서 구해야할지 모르겠습니다.


1
gitk 그래픽 도구를 더 많이 찾을 수 있습니다.
crazyscot 2010 년

stackoverflow.com/questions/61002/...는 이것과 같은 수 있습니다
VonC

답변:


158

커밋을 지정하는 모든 종류의 멋진 방법이 있습니다. 자세한 내용 은의 개정 지정 섹션 man git-rev-parse을 참조하세요. 이 경우 다음을 원할 것입니다.

git diff HEAD@{1}

이것은 @{1}"내가 지정한 심판의 이전 위치"를 의미하므로 풀 직전 이전에 체크 아웃 한 내용으로 평가됩니다. HEAD작업 트리에 약간의 변경 사항이 있고 그 차이를보고 싶지 않은 경우 끝에 끝낼 수 있습니다 .

"내 최신 버전 파일의 커밋 ID"로 무엇을 요청하는지 잘 모르겠습니다. 커밋 "ID"(SHA1 해시)는 출력의 모든 항목의 맨 위에있는 40 자 16 진수입니다. 자식 로그의. 주어진 파일이 아니라 전체 커밋에 대한 해시입니다. 더 이상 필요하지 않습니다. 풀에서 하나의 파일 만 비교하려면 다음을 수행하십시오.

git diff HEAD@{1} filename

이것은 일반적인 것입니다. 주어진 커밋에서 파일의 상태를 알고 싶다면 파일에 특정한 ID / 해시가 아니라 커밋과 파일을 지정합니다.


VonC의 링크 된 이전 게시물은 본질적으로 이것과 동일한 내용을 말하지만 설명이 조금 다르기 때문에 지금은 남겨 두겠습니다. (또한 @{1}의 약자로 사용 HEAD@{1})
Cascabel

사실이지만 설명도 좋아합니다. +1
VonC

이것이 바로 제가 찾던 것입니다. 설명 해주셔서 감사합니다.
lucapette 2011 년

내가 인터넷 검색을 한 것에 +1. 이이 답으로 선택하고 정상에 충돌 한 경우 좋지 않을까 ... :)
롱다

@longda 투표를 기준으로 정렬하는 경우 (내가 기본값이라고 생각한) 이미 맨 위에 있어야합니다.
Cascabel 2013 년

57

나는 사용하고 싶다 :

git diff HEAD^

또는 특정 파일 만 비교하려는 경우 :

git diff HEAD^ -- /foo/bar/baz.txt

5
-1 : HEAD^부모는 이전에 커밋하지, 커밋한다pull
CharlesB

1
경우 HEAD병합 커밋이고, HEAD^최초의 부모가 그래서 그래, 그것은이되기 전에 커밋 될 수 커밋이다 pull. 다른 부모를 가져 오려면 (양방향 병합의 경우)을 사용 HEAD^2합니다. 그러나, 위의 대답은 정말 그렇게 -1 ;-) 떠나, 처음에 질문에 대답하지 않습니다
마이클 와일드

설명해 주셔서 감사합니다. 내가 다른 것을 인터넷 검색 중이 었고이 링크가 결과 페이지에 올라 왔기 때문에 질문을 매우 신중하게 읽지 않았습니다. 나는 새로운 사용자이고 어떤 카르마도 가지고 있지 않기 때문에 차임 할 것이라고 생각했습니다. 내 잘못 =)
cadizm

3
@MichaelWild 그것은 질문자가 요청한 것이 아닐 수도 있지만 이것을 발견했을 때 내가 찾고 있던 것입니다. 나에게 유용했습니다. 찬성.
존 드보락

이것은 TortoiseGit "이전 버전과 비교"가 수행하는 작업입니다. 그리고 제가 찾고 있던 것입니다.
Fabien Haddadi 2018

15

똑바로 git pull하면 '빨리 감기'되거나 원격 저장소에서 알 수없는 수의 커밋을 병합 할 수 있습니다. 이것은 하나의 작업으로 발생하므로 풀 직전에 있었던 마지막 커밋이 reflog의 마지막 항목이되고 HEAD@{1}. 이는 다음을 수행 할 수 있음을 의미합니다.

git diff HEAD@{1}

그러나 이것이 자신이 많이하는 일이라면 git fetch수동으로 병합하거나 리베이스하기 전에 a를 수행 하고 가져온 브랜치를 검사 하는 것을 고려하는 것이 좋습니다. 예를 들어 마스터에 있고 오리진 / 마스터를 가져 오려는 경우 :

git fetch

git log HEAD..origin/master

 # looks good, lets merge

git merge origin/master

여기 git log대신 사용하는 것이 좋습니다 git diff(구문이 '..'에 대한 '..' git log과 '...' 사이에 약간 불일치하더라도 git diff) +1 참조 stackoverflow.com/questions/53569/…stackoverflow.com/questions / 850607 /…
VonC

다행히 git diff 명령에서 '..'구문을 사용하면 git "올바른 일을합니다".
CB Bailey
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.