meld와 분기의 차이점을 보시겠습니까?


159

로 HEAD와 현재 상태의 차이를 볼 수 있음을 알고 있습니다 meld .. 하지만 내가 어떻게 예를 들어 지점 사이의 차이 볼 수 있습니다 masterdevel융합에와 있습니까?

현재 다음 단계를 수행합니다.

  1. 복사 작업의 폴더 이름 바꾸기
    예를 들어를 mv /projectA /projectA_master)
  2. 프로젝트를 다시 복제
    git clone url
  3. devel지점으로 전환
    cd projectA && git -b devel origin/devel
  4. meld로 차이점보기
    meld /projectA_Master projectA

동일한 결과를 얻을 수있는 쉬운 방법이 없습니까? 변경 사항을 검토하기 위해서만 필요하며 주로 병합하지는 않습니다.


이것이 귀하의 질문에 대답합니까? git difftool 및 mergetool로 Meld 설정 및 사용
evan.bovie

답변:


55

또한이 문제가 성가신 것을 발견하여 작업 트리 또는 준비 영역에 대한 임의의 커밋을보다 편안하게 비교할 수있는 git meld를 만들었습니다. https://github.com/wmanley/git-meld 에서 찾을 수 있습니다 . Mark의 스크립트와 비슷하지만 임의의 커밋 또는 준비 영역 또는 작업 디렉토리를 다른 커밋과 비교하는 데 사용됩니다. 비교하는 것 중 하나가 작업 트리 인 경우 읽기-쓰기이므로 변경 사항을 잃지 않습니다.


1
훌륭한 도구입니다. 감사! 완전히 권장 ... 이제 병합에서만 작동하는 경우.
Dipstick

훌륭한 툴을위한 TYVM-(별명에!를 추가하기위한 알림)
kfmfe04

26
github 저장소에서 인용 한 Will은 "참고 : git difftool이 git 1.7.11에서 --dir-diff 옵션을 배웠기 때문에 git-meld는 더 이상 사용되지 않습니다."
oluc

318

짧고 달콤한 :

git config --global diff.tool meld

이것은 Git이 melddiff 도구 로 사용하도록 구성합니다 . (명령 줄 인수를 지정할 필요가 없습니다. 지원 meld은 Git에 내장되어 있습니다.)

그런 다음 텍스트가 아닌 그래픽 차이를 원한다면 대신 대신 호출하면 git difftool됩니다 git diff(둘 다 동일한 인수를 사용합니다). 귀하의 경우 :

git difftool master..devel

업데이트 : 한 번에 한 파일 씩 차이를 원하지 않지만 두 분기 사이의 모든 변경 사항과 함께 meld의 "하위 디렉토리"보기를 사용하려면 -d또는에 --dir-diff대한 옵션을 확인하십시오 git difftool. 예를 들어, XYZ 지점에 있고 ABC 지점과 다른 지점 ABC의 차이점을보고 싶을 때 다음을 실행합니다.

git difftool -d ABC

3
그것은 내가 찾고있는 것이 아닙니다. 파일별로 차이점을 보여줍니다. 전에 diff.py 및 'git diff master..devel'스크립트를 사용하여 보관했습니다. 'meld folderA / folderB /'와 같이 모든 차이점과 디렉토리 트리를보고 싶습니다.
Marten Bauer

Marten, 그것이 git의 작동 방식입니다. 파일 만 추적하므로 파일별로 차이 파일 만 볼 수 있습니다. git에서는 빈 디렉토리를 단독으로 커밋 할 수 없습니다. dir 사이에 diff를 표시하려는 특별한 이유는 무엇입니까?
Donny Kurnia

@ DonnyKurnia : OP가 무엇을하려고하는지 알아내는 데 약간의 시간이 걸렸습니다. Meld에는 디렉토리의 모든 변경 사항을 볼 수있는 별도의 UI가 있습니다. 파일이 동일한 지, 변경 된지, 새로운 지에 따라 파일보기를 필터링 할 수 있습니다. OP는 해당 UI를 사용하여 변경 사항을 표시하려고합니다. (이렇게하면 모든 변경 사항 목록을보고 비교할 변경 사항을 선택할 수 있습니다.) 따라서 디렉토리 간 비교가 아니라 커밋 간 비교이지만 전체적으로 볼 수 있습니다.
idbrii

17
@MartenBauer 나는 이것이 당신이 원하는 것이라고 생각합니다 : git difftool --dir-diff master devel
Stéphane

3
현재 브랜치가 tmp 폴더에 있지 않아 편집을 허용하도록이 작업을 수행 할 수 있습니까?
zkent

100

git v1.7.11부터 git difftool --dir-diff디렉토리 diff를 수행하는 데 사용할 수 있습니다 . https://github.com/wmanley/git-meld 스크립트 와 함께 잘 작동합니다 .

자식 구성

git config --global diff.tool meld

그걸 써

git difftool -d topic             // -d is --dir-diff
git difftool -d master..topic

macOS의 경우

brew cask install meld
git config --global difftool.meld.cmd 'open -W -a Meld --args \"$LOCAL\" \"$PWD/$REMOTE\"'
git config --global difftool.meld.trustExitCode true

2
나는 이것이 실제로 OP가 원하는 것이라고 생각합니다. guidiff 도구를 사용하려면 -g 옵션을, --dir-diff를 사용하려면 -d 옵션을 참고하십시오. 코드 검토에 유용합니다. Nit : 최소한 Git 1.8의 경우 -d를 지정할 때 difftool.prompt 옵션이 필요하지 않습니다.
마이클 퍼시

1
이것은 놀랍다. 정확히 내가 필요한 것. 감사합니다!
Nicholas

5
현재 브랜치가 tmp 폴더에 있지 않아 편집을 허용하도록이 작업을 수행 할 수 있습니까?
zkent

2
@zkent 질문에 대한 답변도 감사합니다 ... :(
tavlima

3
@zkent @tavlima :이 명령은 이미 현재 버전에서 편집을 허용합니다. tmp floder를 meld로 보더라도 저장 Ctrl+s하면 오른쪽 부분에 파일이 수정됩니다.
Benjamin

13

사용 git difftool -d하면 여전히 Meld에서 작업 파일을 편집 하고 저장할 있다고 말하는 것이 중요 합니다 . 이를 위해 일부 분기를 현재 작업 트리와 비교해야합니다.

git difftool -d branchname

Meld는 왼쪽과 오른쪽 디렉토리가 모두 / tmp에 있음을 보여줍니다. 그러나 올바른 디렉토리의 파일은 실제로 현재 작업 디렉토리의 파일에 대한 심볼릭 링크입니다 (Windows에는 적용되지 않음). 따라서 Meld에서 바로 편집 할 수 있으며 저장하면 변경 사항이 작업 디렉토리에 저장됩니다.

더 흥미로운 옵션은 현재 작업 디렉토리와 숨김을 비교하는 것입니다. 간단히 다음과 같이 입력하면됩니다 :

git difftool -d stash

그런 다음 git stash pop/apply이 명령으로 유발 될 수있는 번거로운 충돌 해결을 사용하지 않고 스 태쉬 (왼쪽 창)에서 현재 작업 사본 (오른쪽 창)으로 일부 변경 사항을 전송할 수 있습니다.

나는 그것이 숨김으로 워크 플로우를 크게 향상시킬 수 있다고 생각합니다. 숨김에서 작업 사본으로 변경 사항을 점차적으로 전송하고 하나씩 변경하여 원하는 경우 다른 변경 사항을 도입 할 수 있습니다.


Piotr, 이것은 내가 시도한 것과 정확히 같지만 제 경우 (CentOS에서는) 심볼릭 링크가 생성되지 않습니다. 필요한 구성 설정 또는이를 지원하는 최소 버전의 meld가 있습니까?
wrjohns

Git은 Meld가 아닌 심볼릭 링크 생성을 담당한다고 생각합니다. difftool 명령에 대해서는 Git 매뉴얼을 확인하십시오. 최신 버전으로 업데이트해야합니까?
Piotr Jurkiewicz

2
분기에서 작업 디렉토리로 새 파일 복사가 작동하지 않습니다 :(
pykiss

5

다른 답변에서 git 저장소에 직접이 작업을 수행 할 수있는 방법이없는 것처럼 보이지만 두 커밋의 트리를 추출하는 스크립트를 작성하는 것은 쉽습니다 ( 다른 질문에 대한 답변 덕분입니다 ). meld가 종료 될 때 두 디렉토리를 모두 제거하여 임시 디렉토리에 meld를 실행하십시오.

http://gist.github.com/498628

물론, meld를 통해 변경 한 내용은 잃어 버릴 수 있지만 차이점에 대한 간단한 개요는 매우 좋습니다.


3

이 작업을 수행하는 쉬운 방법은 다음을 사용하는 것 git reset --soft같습니다.

목표 : branch_a와 branch_b의 차이점을 meld와 비교

git checkout branch_a
git checkout -b do_diff
git reset --soft branch_b
meld .

0

git V1.7.9에서는 커맨드 라인없이 두 커밋을 비교할 수 있습니다.

'git gui'편집 옵션, 전역 : "병합 도구 사용 : meld"에서 구성해야합니다.

gitk를 시작 하고 커밋을 선택한 다음 다른 커밋을 마우스 오른쪽 버튼으로 클릭하고 " diff this-> selected "를 클릭하십시오 . 'patch'아래에서 파일> " external diff "를 마우스 오른쪽 버튼으로 클릭하십시오 .

meld 가 시작되어 여전히 선택된 것을 표시합니다. 먼저 오른쪽에 커밋합니다.


0

macOS의 Meld 의 경우, macOS 응용 프로그램 관리자 yousseb가~/.gitconfig 권장하는대로 이를 추가하십시오 .

[diff]
  tool = meld
[difftool]
  prompt = false
[difftool "meld"]
  trustExitCode = true
  cmd = open -W -a Meld --args \"$LOCAL\" \"$REMOTE\"
[merge]
  tool = meld
[mergetool]
  prompt = false
[mergetool "meld"]
  trustExitCode = true
  cmd = open -W -a Meld --args --auto-merge \"$LOCAL\" \"$BASE\" \"$REMOTE\" --output=\"$MERGED\"

원하는 merge경우 구성을 생략 할 수 있습니다 .

@GutenYe의 답변 이 자동 이스케이프 및 / 또는와 함께 인해 작동하지 않았습니다 zsh.

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