git difftool, 직렬이 아닌 모든 diff 파일을 즉시여십시오.


240

기본 git diff 동작은 각 diff 파일을 직렬로 여는 것입니다 (다음 파일을 열기 전에 이전 파일이 닫힐 때까지 기다리십시오).

예를 들어 BeyondCompare에서 모든 파일을 한 번에 열 수있는 방법을 찾고 있습니다. 예를 들어 동일한 BC 창 내에서 탭의 모든 파일을 열 수 있습니다.

이를 통해 복잡한 변경 사항을 쉽게 검토 할 수 있습니다. diff 파일 사이를 앞뒤로 넘기고 중요하지 않은 파일은 무시하십시오.


"git diff"또는 "git difftool"? git mailing list : git@vger.kernel.org
Jakub Narębski

"git difftool"을 사용하여 외부 diff 응용 프로그램을 트리거하고 있습니다. 메일 링리스트 아이디어에 감사드립니다.
Seba Illingworth

플랫폼을 아는 것이 도움이 될 것입니다. 유닉스 기반 플랫폼에서 diff를 수행하고 git에게 해당 스크립트를 사용하도록 지시하는 스크립트를 작성합니다. 스크립트에서 나는 단순히 diff를 백그라운드에서 실행하고 스크립트를 죽이게 할 것입니다.
Chris Cleeland

Windows 플랫폼이지만 Chris라는 아이디어에 감사드립니다.
Seba Illingworth

답변:


214

gitv1.7.11 부터 git difftool --dir-diff디렉토리 diff를 수행하는 데 사용할 수 있습니다 .

이 기능은 예를 들어 Meld 3.14.2에서 잘 작동하며 수정 된 모든 파일을 찾아 볼 수 있습니다.

git difftool --dir-diff --tool=meld HEAD~ HEAD

이것은 편리한 Bash 기능입니다.

git-diff-meld() (
  git difftool --dir-diff --tool=meld "${1:-HEAD~}" "${2:-HEAD}"
)

다음 답변은 gitv1.7.11 이전의 설치에 적용됩니다 .


git mail list 에서 이와 같은 질문을 받았습니다 .

임의의 커밋 사이에서 디렉토리 차이를 수행하는 해당 이메일 스레드를 기반으로 쉘 스크립트를 작성했습니다.

git v1.7.10부터 git-diffall스크립트는 contrib표준 git 설치에 포함됩니다.

v1.7.10 이전 버전의 경우 GitHubgit-diffall프로젝트에서 설치할 수 있습니다 .

프로젝트 설명은 다음과 같습니다.

git-diffall 스크립트는 git에 대한 디렉토리 기반 diff 메커니즘을 제공합니다. 이 스크립트는 diff.tool 구성 옵션을 사용하여 사용되는 diff 뷰어를 결정합니다.

이 스크립트는 diff 할 수정 범위를 지정하는 데 사용되는 모든 양식과 호환됩니다.

1) git diffall: 작업 트리와 단계적 변경 사이의 차이를 표시합니다.
2) git diffall --cached [<commit>]: 단계별 변경과 HEAD (또는 다른 명명 된 커밋 사이의 차이를 보여줍니다. )
3) git diffall <commit>: 작업 트리와 명명 된 커밋 사이의 차이를 보여줍니다.
4) git diffall <commit> <commit>: 명명 된 두 커밋 사이에 차이를 보여줍니다 .
5) git diffall <commit>..<commit>: 동일 위의
6) git diffall <commit>...<commit>: 두 가지의 공통 조상에서 시작하여 두 번째까지 포함하는 지점의 변경 사항을 표시하십시오.<commit>

참고 : 모든 양식에는 선택적 경로 제한 기가 있습니다. [--] [<path>]

이 스크립트는 Git 목록에서 Thomas Rast가 제공 한 예제를 기반으로 합니다 .


git-diffall과 github.com/wmanley/git-meld 의 차이점은 무엇입니까 ? 나는 두 가지를 모두 시도해 보았고 언뜻보기에 동일한 기능을 제공하는 것 같습니다.
kynan

5
나는 당신의 스크립트에 크게 감사드립니다. 솔직히, Git이 이와 관련하여 올바른 방식으로 행동하지 않는 이유 (Mercurial은 몇 년 동안 그렇게 했음)도 Git 커뮤니티의 관심 부족을 추측 할 수 없습니다.
Douglas

6
업데이트 ( git difftool --dir-diff비교 및 그 이상) : Scooter Software (Beyond Compare의 저자)에게 연락 bcompare.exe하여 지원되는 솔루션이 아니며 한 번에 둘 이상의 diff가 열려 있으면 문제가 발생할 수 있다고 말합니다 . bcomp.exe향후 버전 에서는 폴더 차이에 대한 지원을 추가 할 계획입니다 (그 동안 bcompare.exe지원되지 않는 해결 방법으로 계속 사용함 ).
Peter Rust

4
@coin 방금 Beyond Compare 4로 테스트했으며 --dir-diff가 지원되는 bcomp.exe와 함께 작동하는 것으로 보입니다.
피터 러스트

5
--dir-diffMeld와 완벽하게 작동 한다고 말하면 됩니다. 여기에서 개별 파일에 대한 차이점을 선택하고 볼 수 있습니다.
mkasberg

61

여기에 내가 정착 한 것이 있습니다 ...

다음 코드를 git-diffall(확장자 없음) 이라는 파일에 복사하십시오 .

#!/bin/sh
git diff --name-only "$@" | while read filename; do
    git difftool "$@" --no-prompt "$filename" &
done

파일을 cmd (예 : 디렉토리 설치하려면 자식의 폴더 C:\Program Files (x86)\Git\cmd)

다음과 같이 사용하십시오 git diff.

git diffall
git diffall HEAD
git diffall --cached 
git diffall rev1..rev2
etc...

참고 :이 파일의 키는 & param으로, 외부 diff 명령이 백그라운드 작업에서 실행되도록 지시하므로 파일이 즉시 처리됩니다. BeyondCompare의 경우 각 파일이 자체 탭에있는 하나의 화면이 열립니다.


게시 해 주셔서 감사합니다. 불행히도 WinMerge의 -s 옵션에서는 작동하지 않습니다. WinMerge가보기 전에 첫 번째 파일을 제외한 모든 임시 파일이 삭제됩니다.
Carlos Rendon

Carlos : Git과 함께 WinMerge를 사용합니다. 내 접근 방식은 WinMerge를 시작한 후 '잠자기 1'을 추가하는 것입니다 (제 경우에는 이미 "백그라운드에서"-& 필요 없음). 이런 식으로 임시 파일은 WinMerge가 한 번만 선택할 수있을 정도로 오래 유지됩니다 (이상한 경우 제외). 또한 파일을 모두 여는 데 파일 당 1 초가 걸립니다. 불쾌한 해킹이지만 ( '답변'으로 표시하지는 않습니다!) 쉽고 쉽고 효과적인 해킹입니다.
Woody Zenfell III

2
Linux에서 Git 2.x와 함께 사용하려면 약간 수정 "$filename"해야했습니다 "../$filename". 그런 다음 Beyond Compare와 완벽하게 작동했습니다
Dave C

1
원래 스레드의 @DaveC는 "git install의 cmd 폴더에 파일을 저장합니다"라고 말하고 Windows에서 예제를 진행합니다. 리눅스에서 "git-diffall"파일을 어디에 저장 했습니까?
m4l490n

2
폴더에 git-diffall파일을 추가 한 후 창을 다시 시작해야 C:\Program Files\Git\cmd합니까? 나는 지시대로 그러나 행동에 따라 $ git diffall git: 'diffall' is not a git command. See 'git --help'. Did you mean this? difftool
nesdis

19

meld 소스 제어 (Git, Mercurial, Subversion, Bazaar 등)에서 디렉토리를 제공하면 변경된 모든 파일이 자동으로 나열되고 두 번 클릭하여 개별 차이점을 볼 수있는 깔끔한 기능이 있습니다.

IMO meld .VCS를 시작하도록 구성하는 것보다 입력하기 쉽고 VCS를 파악하는 것이 훨씬 쉽습니다 meld. 또한 프로젝트에서 어떤 VCS를 사용하든 동일한 명령을 사용할 수 있습니다. VCS를 많이 전환하면 좋습니다.

유일한 단점은 git / hg / svn에서 변경 사항을 전달하는 것보다 meld가 변경 사항을 검색하는 것이 느리다는 것입니다.


4
나에게 주요 단점은 meld (어떤 이유로 든) diff가 새 탭 대신 새 창에서 diff를 열고 diff를 닫은 후 작업 디렉토리의 파일이 이전에 성가신 팝업 메시지와 함께 새 탭에서 열립니다.
kynan

좋은 도구이지만 끔찍한 Windows 설치 (2012 년 초 현재).
Wernight

@kynan 이것은 성가신 이중 창 팝업에 대한 것이 아니라면 VCS 불가지론 적 diffing 방법에 대한 완벽한 솔루션 인 것 같습니다. 부끄러운 일입니다. :(
PKKid

meld의 가장 큰 특징은 diff 필터입니다. 예를 들어 git diff제공되지 않는 주석 또는 빈 줄 추가 / 제거 등의 변경 사항을 무시하십시오 .
kynan

1
나는이 접근법을 1 년 정도 사용했습니다. 작은 프로젝트에서는 잘 작동하지만 큰 프로젝트 (예 : 많은 파일)가 있으면 수동으로 git diff를 "스캔"하기 때문에 엄청나게 느립니다 (git가 명확하게 목록을 제공 할 때이 방법이 필요한 이유는 확실하지 않습니다) 파일 직접 ...)
namuol

3

이 방법을 찾았습니다 로 복사 이전 / 새 임시 DIRS 밖으로 파일과 그들에 비교 폴더를한다는 것을 (GitDiff.bat 및 GitDiff.rb을).

그러나 BeyondCompare는 diff 창 내에서 파일을 편집 할 수있는 편리한 기능을 가지고 있기 때문에 작업 파일에서 직접 작업 파일을 직접보고 싶습니다. 이는 빠른 정리에 좋습니다.

편집 : 여기에 비슷한 방법 git mailing list에 대한 내 질문에 대한 응답으로 .



2

여기 드러내 Araxis 병합이 '-nowait'명령 옵션을 가지고 :

-nowait 비교가 닫히기를 기다리는 것을 방지합니다.

어쩌면 이것은 즉시 종료 코드를 반환하고 작동 할 것입니다. BeyondCompare와 유사한 옵션을 찾을 수 없습니다 ...


2

확산 에는 VCS 통합도 있습니다. SVN, Mercurial, Bazaar 등 다양한 VCS와 상호 운용이 가능합니다. 충돌이 발생하면 네 개의 창이 있습니다.

단계적 편집 및 비 단계적 편집을 통한 확산 스크린 샷

로 불러

diffuse -m

Git 작업 카피에.

당신이 저에게 묻는다면, 10 년 동안 내가 본 최고의 시각적 차이가 있습니다. (그리고 나도 시도했다.)


당신이 좋아하는 확산 부분, 특히 meld보다 어떤 부분을 알 수 있습니까?
musiphil

@musiphil : 단순함이 마음에 듭니다. 과제를 해결하는 데 필요한 정확한 기능 세트가 아닌 것 같습니다. (차이와 탭 크기 너비를 다시 정렬하는 것처럼) 멜드에서 전환 한 이유를 기억하지 못하며 그 이후로 멜드를 사용하지 않았으므로 이제는 실제로 비교할 수 없습니다.
krlmlr

1
확산은 구성없이 git과 함께 작동했습니다. Diffuse -m은 다른 탭에 git diff가있는 단일 창을 엽니 다. 다른 도구들도 시작하기에는 너무 많은 구성이 필요합니다.
mosh

1

현재 수정 된 모든 파일을 열기 만하면됩니다.

vi $ (git status | sed -n '/.* 수정 : * / s /// p')

"복잡한 변경 세트"를 커밋하는 경우 워크 플로를 다시 고려할 수 있습니다. git의 멋진 기능 중 하나는 개발자가 복잡한 변경 세트를 일련의 간단한 패치로 쉽게 줄일 수 있다는 것입니다. 현재 수정 된 모든 파일을 편집하려고하기보다는

git add --patch
선택적으로 덩어리를 스테이징 할 수 있습니다.


1

두 개의 작동 트리를 복제하고 DiffMerge와 비교하는 powershell 스크립트를 작성했습니다. 그래서 당신은 할 수 있습니다 :

GitNdiff master~3 .

예를 들어 3 체크인 전의 마스터 브랜치를 현재 작업 트리와 비교합니다.

반짝이고 새롭고 아마도 버그가 가득합니다. 한 가지 단점은 아직 추가되지 않은 작업 트리의 파일이 두 작업 트리에 모두 복사된다는 것입니다. 느려질 수도 있습니다.

http://github.com/fschwiet/GitNdiff


1

Araxis와 함께 Mac OS X에서 git-diffall을 사용하는 데 관심이있는 사람들을 위해 github에서 git-diffall 프로젝트를 분기하고 Araxis Merge 명령을 래핑하는 AppleScript를 추가했습니다. 참고 : araxisgitdiffMac OS X 용 Araxis Merge와 함께 제공 되는 약간 수정 된 파일 복제본입니다.

https://github.com/sorens/git-diffall


1

다음은 meld 및 kdiff3에서 작동합니다.

git difftool --dir-diff origin/branch1..origin/branch2

쉽게 찾을 수있는 모든 파일을 창에서 엽니 다. 원산지 / 분기 이름 대신 변경 세트와 함께 사용할 수 있습니다.

예 : git difftool --dir-diff origin/master..24604fb72f7e16ed44115fbd88b447779cc74bb1


-2

gitk 를 사용 하여 동시에 모든 차이점을 볼 수 있습니다


3
그렇습니다. gitk가 유용하다고 생각하지만 BC를 확산시킬 때보고 싶은 것은 :)
Seba Illingworth
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.