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


159

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

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

  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.