"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 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 파일 편집을 선호합니다)
사용하여 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무엇입니까?
melddiff를보고 싶은 파일을 선택할 수있는 디렉토리 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 -ytkdiff 프롬프트를 방지 하는 데 사용
git difftoolWindows 및 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