Close

git diff


diff는 두 개의 입력 데이터 집합을 가져와서 이들 사이의 변경 사항을 출력하는 함수입니다. git diff는 실행 시 Git 데이터 소스에서 diff 함수를 실행하는 여러 용도의 Git 명령입니다. 이 데이터 소스는 커밋, 브랜치, 파일 등이 될 수 있습니다. 이 문서에서는 일반적인 git diff 호출과 작업 흐름 패턴의 차이점에 대해 설명합니다. git diff 명령은 git statusgit log와 함께 Git 리포지토리의 현재 상태를 분석할 때 자주 사용됩니다.

diff 읽기: 출력


원시 출력 형식

다음 예시는 간단한 리포지토리에서 실행됩니다. 리포지토리는 아래 명령을 사용하여 만들어졌습니다.

$:> mkdir diff_test_repo
$:> cd diff_test_repo
$:> touch diff_test.txt
$:> echo "this is a git diff test example" > diff_test.txt
$:> git init .
Initialized empty Git repository in /Users/kev/code/test/.git/
$:> git add diff_test.txt
$:> git commit -am"add diff test file"
[main (root-commit) 6f77fc3] add diff test file
1 file changed, 1 insertion(+)
create mode 100644 diff_test.txt

이 시점에서 git diff를 실행하면 출력되는 결과가 없을 것입니다. 리포지토리에 diff를 수행할 변경 사항이 없기 때문에 이것은 예상된 동작입니다. 리포지토리를 만들고 diff_test.txt 파일을 추가한 후에는 파일의 콘텐츠를 변경하여 diff 출력을 실험해볼 수 있습니다.

Git 브랜치
관련 자료

Git 브랜치

Bitbucket 로고
솔루션 보기

Bitbucket Cloud에서 Git에 대해 알아보기

$:> echo "this is a diff example" > diff_test.txt

이 명령을 실행하면 diff_test.txt 파일의 콘텐츠가 변경됩니다. 수정한 후에는 diff를 보고 출력을 분석할 수 있습니다. 이제 git diff를 실행하면 다음과 같은 결과가 출력됩니다.

diff --git a/diff_test.txt b/diff_test.txt
index 6b0c6cf..b37e70a 100644
--- a/diff_test.txt
+++ b/diff_test.txt
@@ -1 +1 @@
-this is a git diff test example
+this is a diff example

이제 diff 출력을 더 자세히 분석해 보겠습니다.

1. 비교 입력

diff --git a/diff_test.txt b/diff_test.txt

이 줄은 diff의 입력 소스를 표시합니다. a/diff_test.txtb/diff_test.txt가 diff에 전달된 것을 볼 수 있습니다.

2. 메타데이터

index 6b0c6cf..b37e70a 100644

이 줄에는 일부 내부 Git 메타데이터가 표시됩니다. 필요 없는 정보일 가능성이 높습니다. 이 출력의 숫자는 Git 개체 버전 해시 식별자에 해당합니다.

3. 변경 사항에 대한 마커

--- a/diff_test.txt
+++ b/diff_test.txt

이러한 줄은 각 diff 입력 소스에 기호를 할당하는 범례입니다. 이 경우 a/diff_test.txt의 변경 사항에는 ---이 표시되고 b/diff_test.txt의 변경 사항에는 +++ 기호가 표시됩니다.

4. diff 청크

나머지 diff 출력은 diff '청크' 목록입니다. diff는 파일에서 변경된 부분만 표시합니다. 현재 예시에서는 간단한 시나리오로 작업하고 있으므로 하나의 청크만 있습니다. 청크에는 고유한 세분화된 출력 시맨틱이 있습니다.

@@ -1 +1 @@
-this is a git diff test example
+this is a diff example

첫 번째 줄은 청크 헤더입니다. 각 청크 앞에는 @@ 기호로 묶인 헤더가 있습니다. 헤더의 콘텐츠는 파일에 이루어진 변경 사항의 요약입니다. 간단한 예시에서 볼 수 있듯이 -1 +1은 첫 번째 줄에 변경 사항이 있음을 의미합니다. 조금 더 사실적인 diff에서는 다음과 같은 헤더가 표시됩니다.

@@ -34,6 +34,8 @@

이 헤더 예시에서는 34번 줄부터 6개의 줄이 추출되었습니다. 또한 34번 줄부터 8개의 줄이 추가되었습니다.

diff 청크의 나머지 콘텐츠에는 최근 변경 사항이 표시됩니다. 변경된 각 줄 앞에는 변경 사항이 이루어진 diff 입력의 버전을 나타내는 + 또는 - 기호가 추가됩니다. 앞서 설명한 것과 같이 -a/diff_test.txt의 변경 사항을 나타내고 +는 b/diff_test.txt의 변경 사항을 나타냅니다.

변경 사항 강조 표시


1. git diff --color-words

git diff에는 훨씬 더 세밀하게 변경 사항을 강조할 수 있는 ‐color words라는 특별 모드도 있습니다. 이 모드는 추가된 줄과 제거된 줄을 공백으로 토큰화한 다음 diff 처리합니다.

$:> git diff --color-words
diff --git a/diff_test.txt b/diff_test.txt
index 6b0c6cf..b37e70a 100644
--- a/diff_test.txt
+++ b/diff_test.txt
@@ -1 +1 @@
this is agit difftest example

이제 출력에는 색상 코드가 지정된 변경된 단어만 표시됩니다.

2. git diff-highlight

git 소스를 복제하면 contrib이라는 하위 디렉터리를 찾을 수 있습니다. 아직 Git core로 승격되지 않은 Git 관련 도구와 기타 흥미로운 리소스가 많이 포함되어 있습니다. 그 중 하나는 diff-highlight라는 Perl 스크립트입니다. diff-highlight는 일치하는 diff 출력 줄의 짝을 이루고 변경된 하위 단어 부분을 강조 표시합니다.

$:> git diff | /your/local/path/to/git-core/contrib/diff-highlight/diff-highlight
diff --git a/diff_test.txt b/diff_test.txt
index 6b0c6cf..b37e70a 100644
--- a/diff_test.txt
+++ b/diff_test.txt
@@ -1 +1 @@
-this is a git diff test example
+this is a diff example

이제 diff를 가능한 가장 작은 변경 사항으로 줄였습니다.

바이너리 파일 diff 처리


지금까지 설명한 텍스트 파일 유틸리티 외에도 바이너리 파일에서 git diff를 실행할 수 있습니다. 하지만 기본 출력은 그다지 유용하지 않습니다.

$:> git diff
Binary files a/script.pdf and b/script.pdf differ

Git에는 diff를 수행하기 전에 셸 명령을 지정하여 바이너리 파일의 콘텐츠를 텍스트로 변환하는 기능이 있습니다. 그래도 약간의 설정 작업이 필요합니다. 먼저 특정 유형의 바이너리 파일을 텍스트로 변환하는 방법을 설명하는 textconv 필터를 지정해야 합니다. PDF를 사용자가 읽을 수 있는 HTML로 변환하기 위해 pdftohtml(Homebrew를 통해 사용 가능)이라는 간단한 유틸리티를 사용합니다. .git/config 파일을 편집하여 단일 리포지토리에 대해 설정하거나 ~ /.gitconfig를 편집하여 전역적으로 설정할 수 있습니다

[diff "pdfconv"]
textconv=pdftohtml -stdout

그런 다음 하나 이상의 파일 패턴을 pdfconv 필터에 연결하기만 하면 됩니다. 리포지토리의 루트에 .gitattributes 파일을 만들어서 이 작업을 수행할 수 있습니다.

*.pdf diff=pdfconv

구성된 후 git diff는 먼저 구성된 변환기 스크립트를 통해 바이너리 파일을 실행하고 변환기 출력을 diff합니다. 동일한 기술을 적용하여 모든 유형의 바이너리 파일에서 유용한 diff를 얻을 수 있습니다(예: .zip, jars 및 기타 아카이브). pdf2html 대신 unzip -l(또는 비슷한 것)을 사용하면 커밋 사이에 추가 또는 제거된 경로가 표시됩니다. 이미지는 exiv2를 사용하여 이미지 크기와 같은 메타데이터 변경 사항을 표시할 수 있습니다. 문서의 경우 .odf, .doc 및 기타 문서 형식을 일반 텍스트로 변환하는 변환 도구가 있습니다. 경우에 따라 공식 변환기가 없는 바이너리 파일에서도 문자열이 작동합니다.

파일 비교: git diff 파일


git diff 명령에 명시적인 파일 경로 옵션을 전달할 수 있습니다. 파일 경로가 git diff에 전달되면 diff 작업은 지정된 파일로 범위가 지정됩니다. 아래 예시에 사용 방법이 나와 있습니다.

git diff HEAD ./path/to/file

이 예시의 범위는 ./path/to/file로 정해져 있어서 호출하면 작업 디렉터리의 특정 변경 사항을 색인과 비교하여 아직 스테이징되지 않은 변경 사항을 표시합니다. 기본적으로 git diffHEAD에 대한 비교를 실행합니다. 위의 예시 git diff ./path/to/file에서 HEAD를 생략해도 같은 효과가 있습니다.

git diff --cached ./path/to/file

--cached 옵션으로 git diff를 호출하면 diff는 스테이징된 변경 사항을 로컬 리포지토리와 비교합니다. --cached 옵션은 --staged와 같습니다.

모든 변경 사항 비교하기


파일 경로 없이 git diff를 호출하면 리포지토리 전체의 변경 사항이 비교됩니다. 위의 특정 파일 예시에서는 ./path/to/file 인수 없이 호출할 수 있으며 로컬 리포지토리에 있는 모든 파일에서 동일한 출력 결과를 가집니다.

마지막 커밋 이후의 변경 사항


기본적으로 git diff는 마지막 커밋 이후 커밋되지 않은 모든 변경 사항을 보여줍니다.

git diff

서로 다른 두 커밋 사이의 파일 비교


git diff는 diff 커밋에 Git ref를 전달할 수 있습니다. 몇 가지 예시 ref에는 HEAD, 태그, 브랜치 이름이 있습니다. Git의 모든 커밋에는 git log를 실행할 때 얻을 수 있는 커밋 ID가 있습니다. 커밋 ID를 git diff에 전달할 수도 있습니다.

git log --pretty=oneline
957fbc92b123030c389bf8b4b874522bdf2db72c add feature
ce489262a1ee34340440e55a0b99ea6918e19e7a rename some classes
6b539f280d8b0ec4874671bae9c6bed80b788006 refactor some code for feature
646e7863348a427e1ed9163a9a96fa759112f102 add some copy to body

$:> git diff 957fbc92b123030c389bf8b4b874522bdf2db72c ce489262a1ee34340440e55a0b99ea6918e19e7a

브랜치 비교


두 브랜치 비교

브랜치는 git diff에 대한 다른 모든 ref 입력처럼 비교됩니다.

git diff branch1..other-feature-branch

이 예시에서는 점 연산자를 소개합니다. 예시에 있는 두 개의 점은 diff 입력이 양쪽 브랜치의 끝이라는 것을 나타냅니다. 점을 생략하고 브랜치 사이에 공백을 경우에도 동일한 효과가 발생합니다. 또한 세 개의 점 연산자가 있습니다.

git diff branch1...other-feature-branch

세 개의 점 연산자는 첫 번째 입력 매개 변수인 branch1을 변경하여 diff를 시작합니다. branch1branch1과 other-feature-branch의 공통 상위 항목인 두 diff 입력 간에 공유된 공통 상위 커밋의 ref로 변경합니다. 마지막 매개 변수 입력 매개 변수는 other-feature-branch의 끝으로 변경되지 않은 상태로 유지됩니다.

두 브랜치의 파일 비교


여러 브랜치에 있는 특정 파일을 비교하려면 파일의 경로를 세 번째 인수로 git diff에 전달합니다

git diff main new_branch ./diff_test.txt

요약


이 페이지에서는 Git diff 프로세스와 git diff 명령에 대해 살펴봤습니다. git diff 출력을 비롯해 출력에 포함된 다양한 데이터를 읽는 방법을 알아보았습니다. 강조 표시와 색상으로 git diff 출력을 변경하는 방법에 대한 예시를 제공했으며, 브랜치 및 특정 커밋에서 파일을 비교하는 방법과 같은 여러 diff 전략에 대해 설명했습니다. git diff 명령 외에도 git loggit checkout도 사용했습니다.


이 문서 공유
다음 토픽

여러분께 도움을 드릴 자료를 추천합니다.

이러한 리소스에 책갈피를 지정하여 DevOps 팀의 유형에 대해 알아보거나 Atlassian에서 DevOps에 대한 지속적인 업데이트를 확인하세요.

도구로 가득한 벽을 사용하여 협업하는 사람들

Bitbucket 블로그

DevOps 일러스트레이션

DevOps 학습 경로

Atlassian 전문가와 함께 하는 Demo Den 기능 데모

Bitbucket Cloud가 Atlassian Open DevOps와 작동하는 방법

DevOps 뉴스레터 신청

Thank you for signing up