IT story

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

hot-time 2020. 6. 24. 07:28
반응형

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


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


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

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

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

또한보십시오:

git diffGit을 수행하면 Git은 위의 환경 변수 설정과 .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


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

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


ydiff

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

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

ydiff -s

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

다음을 사용하여 설치 :

python3 -m pip install --user ydiff

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

ydiff -ls

자세한 내용과 데모 ydiff GitHub 리포지토리 페이지참조하십시오 .

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


다음과 같이 나란히 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^

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

그런 다음 간단히 :

git diff

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

$ pip install webdiff
$ git webdiff

이것은 tkdiff구문 강조를 제공하고 이미지 차이를 표시 할 수 있다는 점에서 기존 GUI difftools에 비해 여러 가지 장점을 제공합니다.

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


나는 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으로 더 나은 결과를 얻을)


유닉스의 경우, 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자식 참조입니다 - 태그, 지점 또는 해시.


나는 개인적으로 정말 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


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

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

몇몇 다른 사람들은 이미 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 python 소스 코드가 필요합니다.


이 질문은 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옵션은 작은 라인 변경으로 큰 파일을 탐색 할 때 표준 라인 차이와 비교하여 컬러화 된 소스 코드 환경을 얻기 위해 색상 설정과 함께 유용한 가시성을 제공합니다.


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

이 '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

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

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

버전 관리 뷰 다른보기

참고 URL : https://stackoverflow.com/questions/7669963/how-can-i-get-a-side-by-side-diff-when-i-do-git-diff

반응형