두 저장소 간의 차이점 얻기


184

두 git 저장소의 차이점을 어떻게 알 수 있습니까?

시나리오 : repo_a 및 repo_b가 있습니다. 후자는 repo_a의 사본으로 작성되었습니다. 나중에 두 저장소 모두에서 병렬 개발이있었습니다. 이 두 저장소의 현재 버전의 차이점을 나열 할 수있는 방법이 있습니까?


답변:


250

repo_a에서 :

git remote add -f b path/to/repo_b.git
git remote update
git diff master remotes/b/master
git remote rm b

3
repo_a / master를 특정 태그 repo_b와 비교해야하는 경우 어떻게해야합니까?
David Torres

2
나를 위해 일하지 않고, 던지고 있습니다 : 치명적 : 모호한 인수 'remotes / b / master': 알 수없는 개정 또는 작업 트리에없는 경로. '-'를 사용하여 경로를 수정본에서 다음과 같이 분리하십시오. 'git <command> [<revision> ...]-[<file> ...]'여기에 어떤 아이디어가 있습니까?
앤드류 Heekin

2
@AndrewHeekin과 동일합니다. 누구든지 해결책이 있습니까?
의회

4
나는 origin/master맨손보다는 지정해야 할 것 같습니다 master. 또한 이것은 마스터 브랜치의 차이점을 발견하므로 다른 모든 브랜치를 찾으려면 어떻게해야합니까? 예를 들어 리포지토리 백업 상태를 확인 하시겠습니까?
davidA

1
모든 라인에서 무엇을하고 있는지 설명 할 수 있습니까? 감사 !
Enrique

34

Meld 는 디렉토리를 비교할 수 있습니다.

meld directory1 directory2

두 git repos의 디렉토리를 사용하면 멋진 그래픽 비교를 얻을 수 있습니다.

여기에 이미지 설명을 입력하십시오

파란색 항목 중 하나를 클릭하면 변경된 내용을 볼 수 있습니다.


1
VS 솔루션에서 프로젝트를 비교하는 동안 Meld가 멈추지 만 BeyondCompare는 그렇지 않습니다.
사샤 본드

4
OSX에서 : diff -rq folder1 folder2
Mark

1
멋진 링크! 매우 간단한 프로그램입니다. 이제 OSX의 diff 프로그램으로 사용하고 있습니다.
dmanexe

1
이것은 절대적으로 사랑 스럽다! 공유해 주셔서 감사합니다.
Shihab Khan

meld가 git에 의해 무시되는 파일을 처리 할 수 ​​있는지 잘 모르겠습니다. 사용하는 동안 이것을 고려해야합니다
noamgot

11

먼저 현재 리포지토리에 원격으로 다른 리포지를 추가 할 수 있습니다.

git remote add other_name PATH_TO_OTHER_REPO

그런 다음 해당 리모컨에서 brach를 가져옵니다.

git fetch other_name branch_name:branch_name

이렇게하면 현재 리포지토리에서 해당 브랜치를 새 브랜치로 생성 한 다음 해당 브랜치를 다른 브랜치와 비교하여 현재 브랜치를 새 브랜치 (branch_name)와 비교할 수 있습니다.

git diff branch_name

8

하나의 저장소에 두 가지가 모두 있으면을 수행 할 수 있습니다 git diff. 그리고 하나의 저장소에 넣는 것만 큼 쉽습니다.

git fetch /the/other/repo/.git refs/heads/*:refs/remotes/other/*

약간의 변경으로 히스토리를 선택하는 방법이 있습니까?
Eugen Konkov

작은 변경에 대해 이야기하는 경우 가장 쉬운 방법은 diff를 만든 다음 patch를 사용하여 다른 파일에 다시 적용하는 것입니다.
Michael Krelin-해커

동일한 파일 임에도 불구하고 다른 파일 이름으로 인해 패치가 적용되지 않습니다
Eugen Konkov

아, 파일 이름이 아닌 다른 디렉토리 만 생각하고있었습니다 (디렉토리는 패치 옵션을 통해 쉽게 처리 할 수 ​​있습니다). 글쎄, 파일 이름은 수동으로 또는 스크립트를 통해 변경합니다. 즉, 더 나은 해결책이 없다고 말하는 것이 아니라 어디에서나 파지 않고 얻을 수있는 것입니다.
Michael Krelin-해커

그래도 모든 분기를 비교하려면 어떻게해야합니까?
endolith

7
git diff master remotes/b

맞습니다. remotes/b원격이지만 지점이 아닙니다.

그것이 작동하게하려면 :

git diff master remotes/b/master

2
이것은 실제로 관련 답변에 대한 의견이어야합니다.
EntangledLoops

6

"일반"의 " http://git.or.cz/gitwiki/GitTips "섹션, "두 로컬 리포지토리를 비교하는 방법"섹션을 참조하십시오 .

간단히 말해서 GIT_ALTERNATE_OBJECT_DIRECTORIES 환경 변수를 사용하여 다른 저장소의 객체 데이터베이스에 액세스 하고 / GIT_DIR 과 함께 git rev-parse 를 사용하여 --git-dir다른 저장소의 기호 이름을 SHA-1 식별자로 변환하십시오.

최신 버전은 다음과 같습니다 ( 'repo_a'에 있다고 가정).

GIT_ALTERNATE_OBJECT_DIRECTORIES = .. / repo_b / .git / objects \
   git diff $ (git --git-dir = .. / repo_b / .git rev-parse --verify HEAD) HEAD

여기서 ../repo_b/.gitrepo_b의 오브젝트 데이터베이스에 대한 경로입니다 (저장소 인 경우 repo_b.git입니다). 물론 HEAD뿐만 아니라 임의의 버전을 비교할 수 있습니다.


repo_a 및 repo_b가 동일한 저장소 인 경우, git remote add -f ...반복 업데이트를 위해 저장소에 대한 별명을 작성하기 위해 " "를 사용하거나, "obe off" 를 사용하여 둘 다 동일한 저장소에 두는 것이 더 합리적 일 수 있습니다.git fetch ... . 다른 답변에 설명 된대로.


5

폴더와 파일을 비교할 수있는 훌륭한 기능을 갖춘 PyCharm을 사용합니다.

두 저장소 모두에 대한 상위 폴더를 열고 색인이 생성 될 때까지 기다리십시오. 그런 다음 폴더 또는 파일을 마우스 오른쪽 버튼으로 클릭하고Compare to... 하고 반대쪽에서 해당 폴더 / 파일을 선택할 수 있습니다.

다른 파일뿐만 아니라 그 내용도 보여줍니다. 명령 줄보다 훨씬 쉽습니다.


2

가장 좋은 방법은 로컬 컴퓨터에서 두 위치를 모두 가지고 두 디렉토리를 매개 변수로 linux diff 명령을 사용하는 것입니다.

diff -r repo-A repo-B


2
이것을 사용 가능하게 만드는 유일한 방법은 .git 디렉토리 중 하나의 이름을 바꾸는 것입니다. 이것은 중요하지 않은 두 줄의 차이를 줄입니다. 거기에 있었고, 더 나은 대답을 찾기 위해 여기에 왔습니다.
ocldred

2

리모컨 설정을 터치하지 않고 쉽게 할 수 있습니다. 리포지토리 A에서 마스터 (마스터 브랜치를 비교한다고 가정) :

git fetch path/to/repo_b.git master
git diff FETCH_HEAD

0

다음 명령을 사용할 수 있습니다 :

diff -x .git -r repo-A repo-B

또는 나란히 사용할 수 있습니다 :

diff -x .git -W200 -y -r repo-A repo-B

모든 diff 파일을 채색하는 경우 다음을 사용할 수 있습니다.

diff -x .git -W200 -y -r repo-A repo-B | sed -e "s/\(^diff .*\)/\x1b[31m\1\x1b[0m/"

@ andrew-heekin 솔루션 기반
Gerard

0

self에게 알림 ... 먼저 가져 오십시오. 그렇지 않으면 저장소에 로컬 해시가 없습니다.

1 단계. 업스트림 리모컨 이상 ^

단일 파일을 비교하는 것은 다음 패턴을 따릅니다.

git diff localBranch uptreamBranch-공간 경로 / 단일 파일

git diff master upstream/nameofrepo -- src/index.js

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.