전체 컨텍스트로 git diff를 얻는 방법은 무엇입니까?


114

도가니에서 검토하기에 적합한 패치를 만드는 방법은 무엇입니까?

git diff branch master --no-prefix > patch

이는 3 줄의 컨텍스트 만 생성합니다. 그래서 다음을 수행합니다.

git diff --unified=2000 branch master --no-prefix > patch

바라건대 모든 파일은 2000 줄 미만입니다. 최대 줄을 지정하지 않고 패치 파일의 모든 줄을 포함하도록 git에 지시하는 방법이 있습니까?


3
전체 파일을 표시하는 -U <infinity> 옵션을 별도의 질문으로 게시했습니다. stackoverflow.com/questions/28727424/…
Aleksandr Levchuk

답변:


54

나는 이것이 오래되었다는 것을 알고 있지만 하드 코딩 된 솔루션을 싫어하기 때문에 이것을 테스트했습니다.

git diff -U$(wc -l MYFILE)

-U를 사용하는 것이 문제에 접근하는 유일한 방법 인 것처럼 보이지만 줄 수를 사용하면 매우 큰 파일의 작은 변경에도 작동합니다.


1
<필요가 없습니다. git diff -U$(wc -l MYFILE) MYFILE
balki

2
감사합니다 @balki, 귀하의 제안을 시도하고 <pre> $ (wc -l MYFILE) </ pre>이 줄 수와 파일 이름으로 확장되므로 파일 이름의 두 번째 사용도 생략 할 수 있습니다. 나는 이것을 반영하기 위해 내 대답을 업데이트하고 있습니다.
Ezra

4
차이는 있지만 두 가지 버전의 파일이 있습니다. 디스크에없는 버전이 두 배 길면 어떻게됩니까? 정말 큰 숫자를 가진 -U가 실제로 더 안전하지 않나요?
Eloff

@Eloff, 사실입니다. 정말 큰 숫자에는 여전히 반대 문제가 있기 때문에 길이를 최대로 늘리는 것이 가장 좋습니다. 이 솔루션은 디스크의 현재 파일 크기보다 큰 연속 삭제가 수행되지 않았다고 가정합니다.
Ezra

3
git diff -U$(wc -l MYFILE | awk '{print $1}') MYFILEwc두 개의 인수를 생성하기 위해 하위 셸의 인용되지 않은 출력에 의존하지 않고 공백없이 줄 수만 가져옴으로써 출력을 올바르게 구문 분석하고 macOS / BSD에서 작동 하는 더 나은 대답입니다 .
anishpatel

94

이것은 꽤 잘 작동하는 것 같습니다.

git diff --no-prefix -U1000

주의 사항 :

-U플래그 컨텍스트 라인을 지정한다. 변경 사항 사이에 1000 줄 이상이있는 경우이 값을 늘려야 할 수 있습니다.


16
-U당신이 제안 옵션과 동일 --unified=아스 커에 의해 사용 옵션을 선택합니다. 유일한 차이점은 asker가 사용하는 2000보다 더 적은 수의 컨텍스트 라인 (1000)을 지정한다는 것입니다. @balki는 수를 무한대로 늘리는 방법을 알고 싶었지만 수를 절반으로 줄이는 것이 좋습니다. 왜?
LS

4
@LS : 네, 이제 깨달았지만 몇 년 전에 그것을 간과했습니다. 그래도 질문보다 무슨 일이 일어나고 있는지 좀 더 분명하고 여기에 착륙하는 이상한 사람을 돕는 것 같습니다.
c24w

이것에 감사드립니다, 그것은 또한 잘 작동합니다 git show!
Shakeel

@ c24w 동의합니다. 여전히 화면에서보고 싶은 것을 얻습니다.
Chef Pharaoh

1
--no-prefix옵션은 기본적으로 표시되는 "/ a /"및 "/ b /"대상 접두사를 제거합니다. (링크 된 페이지)
luckydonald

10

참고 : git1.8.1rc1 발표 (2012 년 12 월 8 일) 에는 다음이 포함됩니다.

새 구성 변수 " diff.context"를 사용하여 패치 출력에 기본 컨텍스트 줄 수를 제공하여 하드 코딩 된 기본값 인 3 줄을 재정의 할 수 있습니다.

여기에서보다 완전한 컨텍스트를 생성하는 데 도움이 될 수 있습니다.


7
그러나 그것은 '파일의 모든 줄'이라고 말할 수있는 옵션이 없습니다
balki

3
나는 많은 수의 퍼팅, 즉 "모든 라인"시뮬레이션 것이라고 생각
VonC

7
"나는 많은 수를 넣는 것이"모든 라인 "을 시뮬레이션 할 것이라고 생각한다. 모든 것은 무한과 동의어이며, 매우 큰 숫자는 무한이 아닌 숫자입니다.
Trenton

4

영감을 얻어 git 별칭을 추가했습니다.

$ cat ~/.gitconfig | fgrep diff
        df = "!git diff -U$(wc -l \"$1\" | cut -d ' ' -f 1) \"$1\""
$ git df <file>

최신 정보:

방금 찾은 "git df"는 git alias를 실행할 때 디렉토리 변경으로 인해 가끔 작동하지 않습니다. ( git aliases works in the wrong directory 참조 ). 따라서 이것은 업데이트 된 버전입니다.

$ cat ~/.gitconfig | fgrep df
        df = "! [ \"$GIT_PREFIX\" != \"\" ] && cd \"$GIT_PREFIX\"; ~/bin/git_df.sh"
$ 
$ cat ~/bin/git_df.sh
#!/bin/bash
for FILE in $@; do
    git diff -U$(wc -l "${FILE}" | cut -d ' ' -f 1) "${FILE}"
done
exit 0


0

이전에 허용 된 솔루션은 특정 파일 / 커밋을 볼 때 작동하지 않지만 (이 -U옵션은 rev / path 구문 분석을 엉망으로 보임) 다음에서 --inter-hunk-context=작동합니다 git version 2.24.0.

git diff \
    --no-prefix \
    --inter-hunk-context=2000 \
    master -- \
        path/to/file.py

파일 크기를 모르면 wc -l하드 코딩하는 대신 다음을 사용하여 찾을 수 있습니다 .

git diff \
    --no-prefix \
    --inter-hunk-context=$(wc -l path/to/file.py) \
    master -- \
        path/to/file.py
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.