2011-02-09 6 views
38

원격 지점과 로컬 지점 간의 실제 차이점을 확인하고 싶습니다. 어떻게해야합니까?원격 지점에서 병합하기 전에 실제 git diff를 확인하는 방법은 무엇입니까?

아래 명령을 실행하면 부분적으로 작동하지만 내 로컬 분기의 새로운 변경 사항도 표시됩니다. documentation 가입일

git diff remote/branch 
+0

나는 그 질문을 이해하지 못한다. diff는 브랜치의 차이점을 보여줍니다. 왜 병합하지 않을 것이라고 생각합니까? – Abizern

+0

@Abizern my bad! 나는 그 문제를 바로 잡았다. 감사! :) – abhiomkar

+0

[원격 지점과 로컬 지사 지점을 비교할 수 있습니까?] (http://stackoverflow.com/questions/1800783/compare-local-git-branch-with-remote-branch) –

답변

12

:

git diff [--options] <commit>...<commit> [--] [<path>…] 

이러한 형태의 분기가 함유 에 변화를 볼 수 있고 제 <commit>, 시작까지 모두 <commit> 공통 조상에서. "git diff A ... B"는 "git diff $ (git-merge-base A B) B"와 동일합니다. <commit> 중 하나를 생략 할 수 있으며, HEAD를 사용하는 것과 동일한 효과가 입니다.

시도해 보셨습니까? Evgen Bodunov에 의해 제안

+0

감사! 나는 이것을 위해 3 개의 도트가 작동한다는 것을 깨닫지 못했다. :) – abhiomkar

7

당신이하고 싶은이다 :

git diff ...remote/branch 

이/원격 지사의 변경 사항을 diff를하고 현재 HEAD 변경 사항을 무시합니다.

97

이 주제가 자주 발생하고 git이 작동하는 배경에 대해 약간의 지식없이 혼란 스러울 수 있으므로 가능한 가장 단순한 경우를 설명하려고 노력 하겠지만 충분히 익숙해지면 새 사용자가 충분한 핸들을 갖게 될 것이라고 생각했습니다. 추가 연구를 할 수 있습니다.

'복제본'을 통해 자식 저장소를 설정하고 기본 refspecs가있는 경우 원격 저장소의 이름이 'origin'이고 'master'분기에서 가져 오기/가져 오기를 수행해야하는 경우가 있습니다. 그것을 철거하기 전에 원격 저장소에 무엇이 있는지.

"git pull"은 자동 병합을 수행하므로 (충돌이 발생하지 않는 한) 다음에 "들어오는"것을 확인하는 것이 좋습니다. git이 어떻게 작동하는지, 그리고 특히 refspec을 관리하는 방법에 익숙하지 않다면, 이는 다소 비 직관적 일 수 있습니다.

가정하자 누군가가을 (변경을 커밋하고 밀어 원격 저장소에 줄을 추가, 그림의 이익을 위해) 원격 저장소 의 변화를 만들고, 당신은 입력 : 아마

$ git diff origin/master 

당신을 어떤 변화도 보이지 않을 것이다. 하지만 다음을 수행하는 경우 :

로컬 저장소에 커밋 된 내용과 원격 저장소에있는 내용의 차이점을 확인할 수 있습니다. 당신은 당신의 로컬 파일 시스템에 있거나 당신의 색인에 상연 된 어떤 변화도 보지 못할 것이다.

자, 왜 이렇게할까요? origin/master는 refspec입니다 (매뉴얼 페이지 참조). 간단히 말해서, 이것과 비교하기 위해 우리가 참조하는 것입니다.다음은 모두 기능상으로 동일합니다.

origin/master 
remotes/origin/master 
refs/remotes/origin/master 

리팩토링을 시작하려면 저장소의 .git 디렉토리 구조를 살펴보십시오. 일반적인 레이아웃은 다음과 같습니다.

.git/refs 
.git/refs/heads 
.git/refs/heads/master 
.git/refs/remotes 
.git/refs/remotes/origin 
.git/refs/remotes/origin/HEAD 
.git/refs/remotes/origin/master 
.git/refs/tags 

.git/refs/remotes/origin/HEAD; 기본 경우에는 당겨서 푸시하는 데 사용하는 분기를 가리 킵니다. 나는 마스터에있어 때문에 내 경우에는,이 텍스트 파일의 내용은 다음과 같이 :

ref: refs/remotes/origin/master 

를이 내 원격의 HEAD가 refspec '심판/리모트/원산지/마스터에 의해 식별 하더군요 '(위에서 언급 한 별칭이 발생합니다).

이것은 많은 내용을 말해주지는 않습니다. 원격 저장소의 상태는 무엇입니까? 원격 마스터의 상태를 살펴보십시오.

$ cat .git/refs/heads/master  
6d0fb0adfdfa5af861931bb06d34100b349f1d63 

좋습니다. 이것은 SHA1 해시입니다. 아마 커밋. 이 파일에 어떻게 넣을 수 있습니까? 음, pull 또는 fetch 할 때마다,이 파일은 pull 또는 fetch 된 리모트로부터의 가장 최근 커밋으로 갱신됩니다. 이는 diff를 수행하기 전에 git fetch해야하는 이유를 설명합니다. git fetch은 원격 브랜치의 로컬 복사본을 업데이트 만하고 작업 복사본과 병합하지 않음을 기억하십시오. 그것은 완전히 안전합니다. git fetch; git mergegit pull과 같습니다.

가져 오기를 수행하면 git는 가져 오기 시점에 원격 저장소에서 가장 최근의 커밋을 볼 수 있습니다.

당신은 당신이 원하는대로 당신의 차이점을 볼 수 이눔하는 지정자의 다양한 조합을 사용할 수 있습니다 (다음 예는 커밋 암시 처음으로 로컬 작업 복사본을 사용) :

$ git diff remote/origin 
This shows the incoming remote additions as deletions; any additions in your local 
repository are shown as additions. 

$ git diff ...remote/origin 
Shows incoming remote additions as additions; the triple-dot excludes changes 
committed to your local repository. 

$ git diff ..remote/origin 
Shows incoming remote additions as additions; the double-dot includes changes 
committed to your local repository as deletions (since they are not yet pushed). 

에 대한 정보를 들어 ".." vs "..."참조 git help diffgit-scm revision selection: commit ranges의 훌륭한 설명서 간략하게, 위의 예제에서 이중 점 구문은 원본/마스터에서 도달 할 수 있지만 작업 복사본에서는 도달 할 수없는 모든 커밋을 보여줍니다. 마찬가지로, 삼중 점 구문은 커밋 (암시 적 작업 복사본, 원격/원본) 중 하나에서 도달 할 수있는 모든 커밋을 표시하지만 둘 다에서 가져올 수 없습니다. 나는 힘내 상당히 새로 온 사람이 정확히 나에게 혼란 한 물건의 종류이기 때문에이 단계에서이 단계를 통해 갈거야

... 난 자식 전문가가 가진 결함을 찾을 수 있다는 확신 세부 사항 ... 나는이 대답이 모든 다양한 게시물을 좀 간략하게 찾는 사람들을 위해 틈을 메우고 있기를 바랍니다.

+4

이중 점과 삼중 점, 응? 그것은 끔찍한 종류입니다. 하지만 당신의 대답을 주셔서 감사합니다 - 그것은 왜 자식 diff 절대 나를 위해 많이 보여 주었다 설명합니다. –

+4

그것은 받아 들여진 대답이어야합니다; 훨씬 더 초보자에게 친숙하고 diff에 관한 중요한 개념을 설명합니다 (맨 페이지는 모든 용어에 익숙하지 않은 경우 제대로 이해하기위한 고통입니다). – mark

+0

나는 마지막 부분을 이해하지 못한다. "들어오는 원격 변경 사항을 추가로 표시합니다"? 들어오는 변경 사항이 추가 또는 삭제 여부에 관계없이 추가로 표시됩니까? 나는 그것을 믿지 않는다.대답은 [여기] (http://stackoverflow.com/questions/7251477/git-diff-whats-the-difference-between-having-and-no-dots)도 상당히 다른 것처럼 보입니다. – Cerran

관련 문제