"git diff"를 입력하면 "diff -y"와 같이 나란히 diff를 보거나 "kdiff3"과 같은 대화식 diff 도구에 diff를 표시하고 싶습니다. 어떻게 할 수 있습니까?
"git diff"를 입력하면 "diff -y"와 같이 나란히 diff를 보거나 "kdiff3"과 같은 대화식 diff 도구에 diff를 표시하고 싶습니다. 어떻게 할 수 있습니까?
답변:
Git에는 diff의 내부 구현이 있지만 대신 외부 도구를 설정할 수 있습니다.
외부 diff 도구를 지정하는 방법에는 두 가지가 있습니다.
GIT_EXTERNAL_DIFF
및 GIT_DIFF_OPTS
환경 변수 설정 .git config
또한보십시오:
git diff --help
를 수행 할 때 git diff
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 파일 편집을 선호합니다)
사용하여 GIT_EXTERNAL_DIFF
,GIT_DIFF_OPTS
예를 들어 .bashrc 또는 .bash_profile 파일에서 다음을 설정할 수 있습니다.
GIT_EXTERNAL_DIFF=$HOME/scripts/my_diff.sh
export GIT_EXTERNAL_DIFF
사용 git config
래퍼 스크립트를 찾을 수있는 위치를 정의하려면 "git config"를 사용하십시오.
git config --global diff.external ~/scripts/my_diff.sh
~/.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
meld
무엇입니까?
meld
diff를보고 싶은 파일을 선택할 수있는 디렉토리 diff를 수행하도록 버전을 구성 할 수 있습니까 ? 현재 meld
각 파일마다 별도의 명령을 실행하며 meld
다음 파일을 보려면 종료해야 합니다. 오히려 Mercurial에서 사용될 meld
때와 같이 변경된 파일의 디렉토리 목록을 보여주고 싶습니다 meld
.
git difftool
대신에 사용하십시오 git diff
. 당신은 다시 가지 않을 것입니다.
여기에 대해 이야기가 또 다른 유래에 대한 링크입니다 git difftool
: 어떻게 내 기본 설정은 diff 도구 / 뷰어 '자식은 diff'출력을 보려면 어떻게해야합니까는?
의 새 버전 git
의 difftool
명령은 아웃 - 오브 - 박스 많은 외부은 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
This message is displayed because 'diff.tool' is not configured.
. 아마도이 작업을 구성하는 최소한의 방법으로 답변을 업데이트하여 터미널에 나란히 차이점을 표시하도록 OP가 요청한 것은 무엇입니까? GUI 도구는 ssh를 사용하여 연결하는 원격 서버에서 매우 쓸모가 없습니다.
git difftool
와 함께 vimdiff
항상 두 파일 / 버퍼를 올바르게 정렬하지는 않습니다.
git difftool -y
tkdiff 프롬프트를 방지 하는 데 사용
git difftool
Windows 및 Linux에서 통합 : stackoverflow.com/a/48979939/4561887
시도해 볼 수도 있습니다 git diff --word-diff
. 정확히 나란히는 아니지만 어쨌든 더 좋으므로 실제 나란히 필요한 것보다 선호 할 수 있습니다.
git diff --word-diff=color
--word-diff=color
나에게 잘못된 옵션 오류를 제공합니다. 어떤 버전으로 소개 되었습니까?
git diff --color-words
작동합니다.
git diff --color-words
최신 자식 버전을 사용하는 방법입니다.
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에서 테스트되었습니다.
git diff | cdiff -s
와 동등한 방법을 설명 할 수 있습니까 ?
ydiff -s
에서 자식 / SVN / HG 작업 공간, 당신은 파이프 할 필요가 없습니다.
cd <git repo>
하고 다음을 실행하려면ydiff -ls <path/to/file>
다음과 같이 나란히 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^
tput cols
대신 다음과 같이 사용 합니다 git difftool -x "sdiff -s -w $(tput cols)"
.
export GIT_EXTERNAL_DIFF='meld $2 $5; echo >/dev/null'
그런 다음 간단히 :
git diff
당신은 GitHub의를 포함하지 않고 브라우저에서 나란히 차이점을보고 싶은 경우에, 당신은 즐길 수있는 자식 webdiff을 , 드롭 인 교체 git diff
:
$ pip install webdiff
$ git webdiff
이것은 다음과 같은 전통적인 GUI difftools에 비해 많은 장점을 제공합니다 tkdiff
구문 강조를 제공하고 이미지 차이를 표시 할 수 있다는 점에서 제공합니다.
나는 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]:
.
git alias diffy "difftool --extcmd=\"colordiff -ydw\""
합니까? 그렇지 git config --global alias.diffy "difftool --extcmd=\"colordiff -ydw\""
않습니까?
유닉스의 경우, 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)
어디 REF1
와 REF2
자식 참조입니다 - 태그, 지점 또는 해시.
당신이 경우 Mac OS X
에 HomeBrew
, 다만 할 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
이 질문은 git 내장 방법을 사용하여 차이점을 찾는 빠른 방법을 검색 할 때 나타났습니다. 내 솔루션 기준 :
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 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 파이썬 소스 코드가 필요합니다.
접근 방식이 있습니다. 덜 관통하면 xterm 너비가 80으로 설정되어 너무 뜨겁지 않습니다. 그러나 예를 들어 COLS = 210으로 명령을 진행하면 확장 된 xterm을 활용할 수 있습니다.
gitdiff()
{
local width=${COLS:-$(tput cols)}
GIT_EXTERNAL_DIFF="diff -yW$width \$2 \$5; echo >/dev/null" git diff "$@"
}
Intellij IDEA를 열고 "버전 제어"도구 창에서 단일 또는 여러 커밋을 선택하고 변경된 파일을 찾은 다음 두 번 클릭하여 각 파일의 변경 사항을 단계별로 검사하십시오.
번들로 제공되는 명령 줄 실행기를 사용하면 간단한 방법으로 어디서나 IDEA를 가져올 수 있습니다 idea some/path
이 글타래에는 많은 정답이 있습니다. 이 문제에 대한 나의 해결책은 스크립트를 작성하는 것이 었습니다.
이 '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
이것은 다소 제한적인 해결책 일 수 있지만 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