"git diff"를 수행 할 때 어떻게 diff를 얻을 수 있습니까?


163

"git diff"를 입력하면 "diff -y"와 같이 나란히 diff를 보거나 "kdiff3"과 같은 대화식 diff 도구에 diff를 표시하고 싶습니다. 어떻게 할 수 있습니까?




답변:


89

Git에는 diff의 내부 구현이 있지만 대신 외부 도구를 설정할 수 있습니다.

외부 diff 도구를 지정하는 방법에는 두 가지가 있습니다.

  1. GIT_EXTERNAL_DIFFGIT_DIFF_OPTS환경 변수 설정 .
  2. 통해 외부 diff 도구 구성 git config

또한보십시오:

를 수행 할 때 git diffGit은 위의 환경 변수 설정과 .gitconfig파일을 모두 확인 합니다.

기본적으로 Git은 다음 7 가지 인수를 diff 프로그램에 전달합니다.

path  old-file  old-hex old-mode  new-file  new-hex new-mode

일반적으로 이전 파일 및 새 파일 매개 변수 만 필요합니다. 물론 대부분의 diff 도구는 두 개의 파일 이름 만 인수로 사용합니다. 즉, Git이 스크립트에 제공하는 인수를 가져 와서 선택한 외부 git 프로그램에 전달하는 작은 래퍼 스크립트를 작성해야합니다.

래퍼 스크립트를 아래에 넣었다고 가정 해 봅시다 ~/scripts/my_diff.sh.

#!/bin/bash
# un-comment one diff tool you'd like to use

# side-by-side diff with custom options:
# /usr/bin/sdiff -w200 -l "$2" "$5" 

# using kdiff3 as the side-by-side diff:
# /usr/bin/kdiff3 "$2" "$5"

# using Meld 
/usr/bin/meld "$2" "$5"

# using VIM
# /usr/bin/vim -d "$2" "$5"

그런 다음 해당 스크립트를 실행 가능하게 만들어야합니다.

chmod a+x ~/scripts/my_diff.sh

그런 다음 Git에 사용자 정의 diff 래퍼 스크립트를 찾는 방법과 위치를 알려줘야합니다. 이를 수행하는 방법에는 세 가지가 있습니다. (.gitconfig 파일 편집을 선호합니다)

  1. 사용하여 GIT_EXTERNAL_DIFF,GIT_DIFF_OPTS

    예를 들어 .bashrc 또는 .bash_profile 파일에서 다음을 설정할 수 있습니다.

    GIT_EXTERNAL_DIFF=$HOME/scripts/my_diff.sh
    export GIT_EXTERNAL_DIFF
    
  2. 사용 git config

    래퍼 스크립트를 찾을 수있는 위치를 정의하려면 "git config"를 사용하십시오.

    git config --global diff.external ~/scripts/my_diff.sh
    
  3. ~/.gitconfig파일 편집

    ~/.gitconfig파일을 편집하여 다음 줄을 추가 할 수 있습니다 .

    [diff]
      external = ~/scripts/my_diff.sh
    

노트 :

사용자 지정 diff 도구를 설치하는 것과 마찬가지로 사용자 지정 병합 도구를 설치할 수도 있습니다.이 병합 도구는 병합을보다 잘 시각화하기위한 시각적 병합 도구 일 수 있습니다. (progit.org 페이지 참조)

참조 : http://fredpalma.com/518/visual-diff-and-merge-tool/https://git-scm.com/book/en/v2/Customizing-Git-Git-Configuration


1
이것이 git 터미널 색상을 유지합니까?
Sridhar Sarnobat

3
이것은 훌륭하지만 모든 파일에 대해 새로운 뷰어를 시작합니다. 예를 들어, 통합 된 차이를 만드는 방법은 meld무엇입니까?
HRJ

2
@Tilo im으로 vim에 대한 오류가 발생합니다. 경고 : 출력이 터미널로 전송되지 않습니다
죽은 프로그래머

melddiff를보고 싶은 파일을 선택할 수있는 디렉토리 diff를 수행하도록 버전을 구성 할 수 있습니까 ? 현재 meld각 파일마다 별도의 명령을 실행하며 meld다음 파일을 보려면 종료해야 합니다. 오히려 Mercurial에서 사용될 meld때와 같이 변경된 파일의 디렉토리 목록을 보여주고 싶습니다 meld.
kasperd

163

git difftool을 사용해보십시오

git difftool대신에 사용하십시오 git diff. 당신은 다시 가지 않을 것입니다.

사용 예를 추가하려면 업데이트하십시오.

여기에 대해 이야기가 또 다른 유래에 대한 링크입니다 git difftool: 어떻게 내 기본 설정은 diff 도구 / 뷰어 '자식은 diff'출력을 보려면 어떻게해야합니까는?

의 새 버전 gitdifftool명령은 아웃 - 오브 - 박스 많은 외부은 diff 도구를 지원합니다. 예를 들어 vimdiff자동 지원되며 다음을 통해 명령 줄에서 열 수 있습니다.

cd /path/to/git/repo
git difftool --tool=vimdiff

지원되는 다른 외부 diff 도구는 다음 git difftool --tool-help예제 출력을 통해 나열됩니다 .

'git difftool --tool=<tool>' may be set to one of the following:
        araxis
        kompare
        vimdiff
        vimdiff2

The following tools are valid, but not currently available:
        bc3
        codecompare
        deltawalker
        diffuse
        ecmerge
        emerge
        gvimdiff
        gvimdiff2
        kdiff3
        meld
        opendiff
        tkdiff
        xxdiff

34
또는 당신이 얻을 경우 다시 갈 것입니다 This message is displayed because 'diff.tool' is not configured.. 아마도이 작업을 구성하는 최소한의 방법으로 답변을 업데이트하여 터미널에 나란히 차이점을 표시하도록 OP가 요청한 것은 무엇입니까? GUI 도구는 ssh를 사용하여 연결하는 원격 서버에서 매우 쓸모가 없습니다.
Petr

1
흥미로운 점은 SSH를 사용하는 동안 git을 개인적으로 사용해야한다고 생각하지는 않습니다. DVCS의 좋은 점 중 하나는 분산 부분입니다. 적어도 내 환경에서는 내가 찌르고 싶은 레포를 로컬로 복제하는 것이 번거롭지 않습니다.
매트 볼

1
적어도 내 구성에서 git difftool와 함께 vimdiff항상 두 파일 / 버퍼를 올바르게 정렬하지는 않습니다.
Rohmer

1
답변 목록에서 아래의 내용은 훌륭합니다. OI git difftool -ytkdiff 프롬프트를 방지 하는 데 사용
harshvchawla

관련 : git difftoolWindows 및 Linux에서 통합 : stackoverflow.com/a/48979939/4561887
Gabriel Staples

55

시도해 볼 수도 있습니다 git diff --word-diff. 정확히 나란히는 아니지만 어쨌든 더 좋으므로 실제 나란히 필요한 것보다 선호 할 수 있습니다.


12
이것이 가장 쉬운 방법입니다. 더 나은 것은git diff --word-diff=color
Rolf

@Rolf은 --word-diff=color나에게 잘못된 옵션 오류를 제공합니다. 어떤 버전으로 소개 되었습니까?
Holloway

@Trengot 2012
Rolf

4
@Rolf 기본 설치 버전은 1.7.1입니다. 차이점을 설명 할 수 있습니다. git diff --color-words작동합니다.
Holloway

4
예, git diff --color-words최신 자식 버전을 사용하는 방법입니다.
VasiliNovikov

41

ydiff

이전에 호출 된 cdiff이 도구는 나란히 , 증분색상이 다른 diff를 표시 할 수 있습니다 .

을 수행하는 대신 다음을 수행하십시오 git diff.

ydiff -s -w0

ydiff차이가있는 각 파일에 대해 나란히 표시 모드로 시작 됩니다.

다음을 사용하여 설치 :

python3 -m pip install --user ydiff

-또는-

brew install ydiff

의 경우 git log다음을 사용할 수 있습니다.

ydiff -ls -w0

-w0터미널 너비를 자동 감지합니다. 자세한 내용과 데모 는 ydiff GitHub 리포지토리 페이지 를 참조하십시오 .

Git 2.18.0, ydiff 1.1에서 테스트되었습니다.


@RyneEverett : icdiff git diff | cdiff -s와 동등한 방법을 설명 할 수 있습니까 ?
einpoklum

그냥 실행 ydiff -s에서 자식 / SVN / HG 작업 공간, 당신은 파이프 할 필요가 없습니다.
ymattw

Git의 히스토리를 통해 diff를 특정 파일로 제한 cd <git repo>하고 다음을 실행하려면ydiff -ls <path/to/file>
slm

22

다음과 같이 나란히 diff사용할 sdiff수 있습니다.

$ git difftool -y -x sdiff  HEAD^ | less

어디에서 다른 HEAD^것으로 바꾸어야하는 예가 있습니까?

나는이 솔루션을 발견 여기에 다른 몇 가지 제안도있는 곳. 그러나이 답변은 OP의 질문을 간결하고 명확하게 대답합니다.

인수에 대한 설명은 man git-difftool 을 참조하십시오 .


게시판에 주석을 달면 git sdiff다음 실행 스크립트를 작성하여 편리한 명령을 만들 수 있습니다 .

#!/bin/sh
git difftool -y -x "sdiff -w $(tput cols)" "${@}" | less

로 저장 /usr/bin/git-sdiff하고 chmod -x그것. 그런 다음이 작업을 수행 할 수 있습니다 :

$ git sdiff HEAD^

같은 줄을 표시하지 않고 파일이 하나만있는 경우 "$ git difftool -x 'sdiff -s -w 240'"(또는 화면 너비에 관계없이)을 수행합니다 (파일이
하나도없는 경우

1
@HidekiAI 매번 터미널 너비를 입력하는 것이 고통 스럽기 때문에 tput cols대신 다음과 같이 사용 합니다 git difftool -x "sdiff -s -w $(tput cols)".
jaume

색상의 변화를 강조 할 수 있습니까? 지금 우리는 실제로 변화가 무엇인지 알아 내기 위해 눈을 사용해야하는 것 같습니다
비극성

sdiff를 icdiff로 대체하여 멋진 색상 표시를 얻으십시오.
그렉

10
export GIT_EXTERNAL_DIFF='meld $2 $5; echo >/dev/null'

그런 다음 간단히 :

git diff

1
`용해. ' 작동합니다! 또한 모든 변경 사항이 통합 된 창에 표시됩니다.
HRJ

완벽하게 작동하는 @HRJ! 너무 간단하고 실용적 :)
waldyrious

9

당신은 GitHub의를 포함하지 않고 브라우저에서 나란히 차이점을보고 싶은 경우에, 당신은 즐길 수있는 자식 webdiff을 , 드롭 인 교체 git diff:

$ pip install webdiff
$ git webdiff

이것은 다음과 같은 전통적인 GUI difftools에 비해 많은 장점을 제공합니다 tkdiff 구문 강조를 제공하고 이미지 차이를 표시 할 수 있다는 점에서 제공합니다.

자세한 내용은 여기를 참조 하십시오 .


7

나는 colordiff를 사용한다 .

Mac OS X의 경우

$ sudo port install colordiff

Linux에서는 apt get install colordiff배포판에 따라 가능할 수도 있습니다.

그때:

$ git difftool --extcmd="colordiff -ydw" HEAD^ HEAD

또는 별칭을 만듭니다

$ git alias diffy "difftool --extcmd=\"colordiff -ydw\""

그럼 당신은 그것을 사용할 수 있습니다

$ git diffy HEAD^ HEAD

diff -y유닉스에서 나란히 차이가 있기 때문에 나는 "diffy"라고 불렀다 . Colordiff는 또한 더 좋은 색상을 추가합니다. 옵션에서 -ydw, (가) y사이드 바이 사이드입니다는이 w공백을 무시하는 것입니다, 그리고이 d최소 DIFF을 생산하는 것입니다 (일반적으로는 DIFF으로 더 나은 결과를 얻을)


프롬프트 -y를 건너 뛰려면 추가하십시오 Launch 'colordiff' [Y/n]:.
Beni Cherniavsky-Paskin

확실 git alias diffy "difftool --extcmd=\"colordiff -ydw\""합니까? 그렇지 git config --global alias.diffy "difftool --extcmd=\"colordiff -ydw\""않습니까?
비극성

6

유닉스의 경우, git내장과 내장 diff:

git show HEAD:path/to/file | diff -y - path/to/file

물론 HEAD를 다른 git 참조로 바꿀 수 -W 170있으며 diff 명령 과 비슷한 것을 추가하고 싶을 것입니다 .

이것은 디렉토리 내용을 과거의 커밋과 비교한다고 가정합니다. 두 커밋을 비교하는 것이 더 복잡합니다. 쉘이 bash"프로세스 대체"를 사용할 수있는 경우 :

diff -y -W 170 <(git show REF1:path/to/file) <(git show REF2:path/to/file)

어디 REF1REF2자식 참조입니다 - 태그, 지점 또는 해시.


감사합니다- 'git show HEAD : path / to / file'명령은 'vimdfiff <(git show HEAD : path / to / file) path / to / file'이라는 자체 솔루션을 제시하는 데 필요했습니다. 비트는 여전히 올바르게 정렬되어 있지 않지만 지금 당장 최고의 솔루션입니다.
talexb

5

나는 개인적으로 icdiff를 정말로 좋아 한다 !

당신이 경우 Mac OS XHomeBrew, 다만 할 brew install icdiff.

파일 레이블과 다른 멋진 기능을 올바르게 얻으려면 다음과 같이하십시오 ~/.gitconfig.

[pager]
    difftool = true
[diff]
    tool = icdiff
[difftool "icdiff"]
    cmd = icdiff --head=5000 --highlight --line-numbers -L \"$BASE\" -L \"$REMOTE\" \"$LOCAL\" \"$REMOTE\"

그리고 나는 그것을 다음과 같이 사용합니다 : git difftool


3

이 질문은 git 내장 방법을 사용하여 차이점을 찾는 빠른 방법을 검색 할 때 나타났습니다. 내 솔루션 기준 :

  • 빠른 시작, 필요한 내장 옵션
  • 다양한 형식, XML, 다양한 프로그래밍 언어를 쉽게 처리 할 수 ​​있음
  • 큰 텍스트 파일에서 작은 코드 변경을 신속하게 식별

git에서 색상을 얻으려면 이 대답 을 찾았습니다 .

라인 diff 대신 나란히 diff를 얻으려면 다음 매개 변수를 사용 하여이 질문에 대한 mb14 의 훌륭한 답변 을 조정 했습니다 .

$ git diff --word-diff-regex="[A-Za-z0-9. ]|[^[:space:]]"

추가 [-또는 {+가 마음에 들지 않으면 옵션을 --word-diff=color사용할 수 있습니다.

$ git diff --word-diff-regex="[A-Za-z0-9. ]|[^[:space:]]" --word-diff=color

이것은 json과 xml 텍스트 및 Java 코드와 적절히 비교하는 데 도움이되었습니다.

요약하면, --word-diff-regex옵션은 작은 라인 변경으로 큰 파일을 탐색 할 때 표준 라인 차이와 비교하여 컬러화 된 소스 코드 환경을 얻기 위해 색상 설정과 함께 유용한 가시성을 제공합니다.


3

몇몇 다른 사람들은 이미 git side-by-side diffing에 대한 cdiff 를 언급 했지만 아무도 그것을 완전히 구현하지 못했습니다.

cdiff 설정 :

git clone https://github.com/ymattw/cdiff.git
cd cdiff
ln -s `pwd`/cdiff ~/bin/cdiff
hash -r # refresh your PATH executable in bash (or 'rehash' if you use tcsh)
        # or just create a new terminal

다음 행을 삽입하여 ~ / .gitconfig를 편집하십시오.

[pager]
        diff = false
        show = false

[diff]
        tool = cdiff
        external = "cdiff -s $2 $5 #"

[difftool "cdiff"]
        cmd = cdiff -s \"$LOCAL\" \"$REMOTE\"

[alias]
        showw = show --ext-dif

cdiff가 Diff와 작동하려면 페이저 오프가 필요합니다. 어쨌든 본질적으로 페이저이므로 괜찮습니다. Difftool은 이러한 설정에 관계없이 작동합니다.

git show는 인수를 통해 외부 diff 도구 만 지원하므로 show alias가 필요합니다.

diff external 명령 끝에있는 '#'이 중요합니다. Git의 diff 명령은 $ @ (사용 가능한 모든 diff 변수)를 diff 명령에 추가하지만 두 파일 이름 만 원합니다. 따라서 우리는이 두 가지를 $ 2와 $ 5로 명시 적으로 호출 한 다음 sdiff와 혼동 될 수있는 주석 뒤에 $ @를 숨 깁니다. 다음과 같은 오류가 발생합니다.

fatal: <FILENAME>: no such path in the working tree
Use 'git <command> -- <path>...' to specify paths that do not exist locally.

나란히 확산되는 Git 명령 :

git diff <SHA1> <SHA2> 
git difftool <SHA1> <SHA2>
git showw <SHA>

Cdiff 사용법 :

'SPACEBAR' - Advances the page of the current file.
'Q'        - Quits current file, thus advancing you to the next file.

이제 git diff 및 difftool을 통해 단계별 diff가 있습니다. 그리고 파워 유저 커스터마이제이션을위한 cdiff 파이썬 소스 코드가 필요합니다.


2

접근 방식이 있습니다. 덜 관통하면 xterm 너비가 80으로 설정되어 너무 뜨겁지 않습니다. 그러나 예를 들어 COLS = 210으로 명령을 진행하면 확장 된 xterm을 활용할 수 있습니다.

gitdiff()
{
    local width=${COLS:-$(tput cols)}
    GIT_EXTERNAL_DIFF="diff -yW$width \$2 \$5; echo >/dev/null" git diff "$@"
}

1
이상한. 나는 가명으로 이름으로 서명했지만 무시되었습니다 ... 나에게 감사합니다. :(
Thomas Mellman

2

Intellij IDEA를 열고 "버전 제어"도구 창에서 단일 또는 여러 커밋을 선택하고 변경된 파일을 찾은 다음 두 번 클릭하여 각 파일의 변경 사항을 단계별로 검사하십시오.

번들로 제공되는 명령 줄 실행기를 사용하면 간단한 방법으로 어디서나 IDEA를 가져올 수 있습니다 idea some/path

버전 관리 뷰 다른보기


1

이 글타래에는 많은 정답이 있습니다. 이 문제에 대한 나의 해결책은 스크립트를 작성하는 것이 었습니다.

이 'git-scriptname'의 이름을 지정하고 실행 파일로 만들고 스크립트와 같이 PATH에 넣으십시오. 다음을 실행하여 일반 git 명령처럼 호출 할 수 있습니다

$ git scriptname

실제 기능은 마지막 줄입니다. 소스는 다음과 같습니다.

#!/usr/bin/env zsh
#
#   Show a side-by-side diff of a particular file how it currently exists between:
#       * the file system
#       * in HEAD (latest committed changes)

function usage() {
    cat <<-HERE
    USAGE

    $(basename $1) <file>

    Show a side-by-side diff of a particular file between the current versions:

        * on the file system (latest edited changes)
        * in HEAD (latest committed changes)

HERE
}

if [[ $# = 0 ]]; then
    usage $0
    exit
fi

file=$1
diff -y =(git show HEAD:$file) $file | pygmentize -g | less -R

1

이것은 다소 제한적인 해결책 일 수 있지만 diff외부 도구없이 시스템 명령을 사용하여 작업을 수행합니다 .

diff -y  <(git show from-rev:the/file/path) <(git show to-rev:the/file/path)
  • 변경 라인 사용 만 필터링 하십시오 (옵션을 지원하는 --suppress-common-lines경우 diff).
  • 이 경우에는 색상이없고 일반적인 diff마커 만
  • 열 너비를 조정할 수 있습니다 --width=term-width. Bash에서 너비를 $COLUMNS또는 로 가져올 수 있습니다 tput cols.

이것은 다음과 같은 사용법과 같이 더 편리하게 도우미 git 스크립트로 래핑 될 수 있습니다.

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