원격 지점에서 병합하기 전에 실제 git diff를 확인하는 방법은 무엇입니까?
원격 지점과 로컬 지점의 실제 차이를 확인하고 싶습니다. 어떻게 할 수 있습니까?
아래 명령을 실행하면 부분적으로 작동하지만 로컬 브랜치의 새로운 변경 사항의 차이점도 보여줍니다.
git diff remote/branch
로부터 문서 :
git diff [--options] <commit>...<commit> [--] [<path>…]
이 양식은
<commit>
두 가지 공통 조상에서 시작 하여 두 번째까지 포함하는 분기의 변경 사항을 확인하는 것<commit>
입니다. "git diff A ... B"는 "git diff $ (git-merge-base AB) B"와 같습니다.<commit>
HEAD를 대신 사용하는 것과 동일한 효과가 있는를 생략 할 수 있습니다 .
이거 해봤 어?
이 주제가 자주 나오고 git이 어떻게 작동하는지에 대한 배경 지식 없이는 혼란 스러울 수 있기 때문에 가능한 가장 간단한 경우를 설명하려고 노력했지만, 초보자가 충분히 처리 할 수있을만큼 깊이있게 설명했습니다. 추가 연구.
일반 '클론'을 통해 git 저장소를 설정하고 기본 refspec이있는 경우 (즉, 원격 이름이 'origin'이고 브랜치 'master'에서 가져 오기 / 가져 오기를 의미하는 경우) 때때로 원격에 무엇이 있는지 확인해야 할 수 있습니다. 그것을 아래로 당기기 전에 저장소.
"git pull"은 자동 병합을 수행하므로 (충돌이없는 경우) 다음에 "수신"되는 항목을 확인하는 것이 좋습니다. git이 작동하는 방식과 특히 refspec이 관리되는 방식에 익숙하지 않은 경우 약간 직관적이지 않을 수 있습니다.
누군가가 원격 저장소에서 변경을하고 (예시를 위해 변경 사항을 커밋하고 푸시하여 원격 저장소에 줄을 추가) 다음을 입력한다고 가정합니다.
$ git diff origin/master
변경 사항이 없을 것입니다. 그러나 다음을 수행하는 경우 :
$ git fetch; git diff ..origin/master
로컬 git 저장소에 커밋 된 것과 원격 저장소에있는 것의 차이를 볼 수 있습니다. 로컬 파일 시스템에 있거나 인덱스에 준비된 변경 사항을 볼 수 없습니다.
좋아, 우리는 왜 이것을 하는가? 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 'refs / remotes / origin / master'(위에서 언급 한 별칭을 가지고 있음)로 식별된다는 것을 알려줍니다.
이것은 우리에게 많은 것을 말해주지 않습니다. 원격 저장소의 상태는 어떻습니까? 원격 마스터의 상태를 확인하십시오.
$ cat .git/refs/heads/master
6d0fb0adfdfa5af861931bb06d34100b349f1d63
좋습니다. SHA1 해시입니다. 아마도 커밋 일 것입니다. 이 파일에 어떻게 저장됩니까? 글쎄요, 당신이 풀이나 페치를 할 때마다,이 파일은 풀되거나 페치 된 리모트에서 가장 최근 커밋으로 업데이트됩니다. 이것은 git fetch
diff를 수행 하기 전에 왜 우리가해야 하는지를 설명합니다 . 기억 git fetch
단지 원격 지사의 로컬 복사본을 업데이트하지만 당신의 작업 복사본으로 병합하지 않습니다. 완전히 안전합니다. A git fetch; git merge
는 git pull
.
가져 오기를 수행하면 git은 가져 오는 시점에 원격 저장소에서 가장 최근 커밋을 볼 수 있습니다.
다양한 지정자 조합을 사용하여 원하는대로 diff를 볼 수 있습니다 (다음 예제에서는 로컬 작업 복사본을 암시 적 첫 번째 커밋으로 사용).
$ 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).
For info on ".." vs "..." see git help diff
as well as the excellent documentation at git-scm revision selection: commit ranges Briefly, for the examples above, double-dot syntax shows all commits reachable from origin/master but not your working copy. Likewise, the triple-dot syntax shows all the commits reachable from either commit (implicit working copy, remote/origin) but not from both.
I'm going through this step by step because I'm fairly new to git and this is exactly the type of thing that had me confused... I'm sure that git experts can find flaws with the details... I just hope this answer bridges the gap for some people who find all the various posts a bit terse.
What you want to do is, as suggested by Evgen Bodunov:
git diff ...remote/branch
This will diff changes from remote/branch and ignore changes from your current HEAD.
ReferenceURL : https://stackoverflow.com/questions/4944376/how-to-check-real-git-diff-before-merging-from-remote-branch
'programing' 카테고리의 다른 글
활동이 시작될 때 소프트 키보드 표시 (0) | 2021.01.17 |
---|---|
선택 및 선택의 어떤 값이 거짓입니까? (0) | 2021.01.17 |
Android-WebView의 로컬 이미지 (0) | 2021.01.17 |
Ajax 호출이 Selenium 2 WebDriver로 완료 될 때까지 기다립니다. (0) | 2021.01.17 |
파일 이름에서 이미지 크기를 얻는 방법 (0) | 2021.01.17 |