Computer >> 컴퓨터 >  >> 프로그래밍 >> 프로그래밍

Git diff 명령어 완벽 가이드: 커밋·브랜치·파일 차이 비교 방법

git diff 명령어는 두 커밋 사이의 파일 차이점 또는 현재 저장소와 이전 커밋 사이의 차이점을 보여 줍니다. 이 명령어는 변경된 파일에 대한 헤더와 메타데이터를 포함하여 변경 내역을 표시합니다.

Git 버전 관리 시스템으로 작업하다 보면 저장소의 데이터를 다른 데이터와 비교해야 할 때가 있습니다. 예를 들어 서로 다른 두 커밋을 비교하거나, 두 파일의 차이를 확인하고 싶을 수 있습니다.

바로 이럴 때 diff 기능이 유용합니다. diff는 두 입력값을 받아 그 사이에 존재하는 변경 사항을 보여 주는 기능으로, 브랜치, 파일, 커밋 단위로 실행할 수 있습니다.

이 튜토리얼에서는 예제와 함께 Git에서 diff를 사용하는 기본 원리와 git diff 명령어의 사용법을 살펴봅니다. 글을 끝까지 읽고 나면 git diff 명령어를 전문가처럼 활용할 수 있게 될 것입니다.

git diff 명령어란?

git diff 명령어는 두 커밋 사이의 파일 차이점 또는 특정 커밋과 현재 저장소 사이의 차이점을 표시합니다. 이를 통해 파일에 어떤 텍스트가 추가되고, 삭제되고, 수정되었는지 확인할 수 있습니다.

git diff 명령어의 기본 문법은 다음과 같습니다:

git diff

옵션 없이 실행하면 git diff는 저장소에 아직 커밋되지 않은 모든 변경 사항을 표시합니다. 원본 파일에서 삭제된 줄과 추가되거나 수정된 줄을 함께 볼 수 있으며, 실무에서는 주로 Git 저장소의 브랜치를 비교할 때 많이 사용됩니다.

커밋 간 차이 비교하기

두 Git 커밋 사이의 파일을 비교하려면 비교하려는 커밋을 가리키는 ref(레퍼런스) 이름을 지정하면 됩니다. ref는 커밋 ID일 수도 있고, 현재 브랜치를 가리키는 HEAD일 수도 있습니다.

git diff <commit1> <commit2>

그럼 실제로 Git 저장소의 두 커밋을 비교해 보겠습니다.

먼저 비교하려는 커밋의 ID를 확인해야 합니다. git log --pretty=oneline 명령어를 사용하면 저장소의 모든 커밋을 한 줄씩 요약해서 볼 수 있습니다:

git log --pretty=oneline

이 명령어는 다음과 같은 결과를 반환합니다:

5141ea9c41cdc7152408bfcab54a910f34441855 (HEAD -> master) feat: Update README.md
749055ee99df2aa6f5adc4cbe4bfc708395f1c2e docs: Create README.md

이제 이 두 커밋을 비교한다고 가정해 보겠습니다. 다음 명령어를 사용하면 됩니다:

git diff 5141ea9c41cdc7152408bfcab54a910f34441855 749055ee99df2aa6f5adc4cbe4bfc708395f1c2e

위 명령어를 실행하면 두 커밋 전체에 대해 diff 작업이 수행됩니다.

브랜치 간 차이 비교하기

diff 명령어로 두 Git 브랜치를 비교하려면 비교할 브랜치 두 개를 인자로 지정하면 됩니다. 이때 브랜치 이름 사이에 마침표 두 개(..)를 넣는데, 이는 각 브랜치의 최신 커밋을 읽어 서로 비교하겠다는 의미입니다:

git diff <branch1>..<branch2>

예를 들어 저장소의 "master" 브랜치와 "dev-v0.9"라는 브랜치를 비교하고 싶다면 다음 명령어를 사용합니다:

git diff master dev-v0.9

이 명령어가 실행되면 코드베이스의 "master" 브랜치와 "dev-v0.9" 브랜치 사이에서 diff가 수행됩니다.

마찬가지로, 서로 다른 두 브랜치에서 특정 파일만 비교할 수도 있습니다. 위와 동일한 문법을 사용하되 비교하려는 파일을 추가로 지정하면 됩니다.

"master" 브랜치와 "dev-v0.9" 브랜치에서 README.md 파일을 비교하고 싶다면 다음과 같이 작성합니다:

git diff master dev-v0.9 ./README.md

이렇게 하면 현재 디렉터리("./" 문법으로 표시)에 있는 README.md 파일을 기준으로 "master" 브랜치와 "dev-v0.9" 브랜치 간의 차이를 비교합니다.

git diff 명령어 실습 예제

빈 저장소를 초기화한 후 README.md 파일로 시작한다고 가정해 보겠습니다. 저장소에 다음 문장이 담긴 README.md 파일을 생성했습니다:

This is an example of the Git diff feature.

파일 및 커밋 준비하기

git commit 명령어로 이 파일을 커밋해 보겠습니다:

git commit

이 명령어는 저장소에 대한 변경 사항을 저장합니다. Git은 다음과 같은 결과를 반환합니다:

[master (root-commit) 749055e] docs: Create README.md
1 file changed, 1 insertion(+)
create mode 100644 README.md

이 시점에서 git diff 명령어를 실행하면 아무것도 표시되지 않습니다. 저장소가 초기화된 직후이고 파일 간에 변경된 내용이 없기 때문입니다. 이제 기본적인 저장소가 준비되었으니, 파일 내용을 변경해서 git diff 명령어가 실제로 어떻게 작동하는지 확인해 보겠습니다.

README.md 파일에 "We just added this line to our file."이라는 문장을 추가한다고 가정해 보겠습니다. 다음 명령어로 추가할 수 있습니다:

echo "We just added this line to our file." >> README.md

위 명령어는 해당 문장을 README.md 파일에 추가합니다.

이제 초기 README.md 파일과 현재 저장소의 README.md 파일 사이에 차이가 생겼습니다.

git diff 명령어를 실행하면 두 파일 간의 차이를 확인할 수 있습니다. 기본적으로 git diff는 마지막 커밋과 현재 저장소 상태 사이의 모든 파일에 대한 diff를 생성합니다.

커밋 간 diff 실행하기

명령어를 실행하면 다음과 같은 결과가 출력됩니다:

diff --git a/README.md b/README.md
index f808522..f08e544 100644
--- a/README.md
+++ b/README.md
@@ -1 +1,2 @@
+We have just added this line to our file.
 This is an example of the Git diff feature.

이것이 바로 git diff 명령어의 일반적인 출력 결과입니다. 결과에는 통합 diff(combined diff) 형식으로 파일에 무엇이 추가되고 삭제되었는지 표시됩니다.

git diff 명령어는 마지막 커밋과 현재 저장소 사이의 모든 파일에 대한 변경 목록을 반환합니다.

특정 파일에 대한 변경 사항만 확인하고 싶다면 해당 파일을 세 번째 매개변수로 지정하면 됩니다. 예를 들어 README.md 파일의 변경 사항만 보고 싶은 경우입니다.

이 예제에서는 README.md 파일 하나만 수정했기 때문에 어차피 해당 파일의 변경 사항만 표시됩니다. 하지만 규모가 큰 저장소에서 작업할 때는 한 파일의 변경 사항만 비교하고 싶을 수 있습니다. 이 경우 다음 명령어를 사용합니다:

git diff README.md

이 명령어를 사용하면 현재 README.md 파일과 저장소에 마지막으로 커밋된 버전을 비교할 수 있습니다.

git diff 출력 결과 분석하기

git diff 출력 결과는 여러 구성 요소로 이루어져 있으며, 이를 통해 저장소 내 파일의 변경 사항을 분석할 수 있습니다. 앞선 예제를 참고하면서 하나씩 살펴보겠습니다.

입력 파일(Input Files)

diff의 첫 번째 구성 요소는 입력 파일입니다. 이 부분은 diff에서 어떤 파일들을 비교하고 있는지 알려 줍니다.

여기서는 현재 버전의 코드에 있는 README.md 파일과 이전 버전의 README.md 파일을 비교하고 있습니다. 이 정보는 출력 결과의 첫 번째 줄에 표시됩니다:

diff --git a/README.md b/README.md

메타데이터(Metadata)

다음은 Git 저장소의 메타데이터입니다. 이 메타데이터는 파일에 대한 변경 사항을 추적할 때 Git이 사용하는 객체 버전 라벨을 표시합니다.

대부분의 경우 이 정보는 자주 사용되지 않습니다. 앞선 예제에서 메타데이터는 다음과 같습니다:

index f808522..f08e544 100644

변경 마커(Change Markers)

git diff 출력의 다음 부분은 변경 마커입니다. 이 파일 패턴 마커는 파일에 어떤 유형의 변경이 이루어졌는지 알려 줍니다. 앞선 예제의 변경 마커는 다음과 같습니다:

--- a/README.md
+++ b/README.md

이 마커는 a/README.md에서 변경이 발생했으며(마이너스 기호로 표시), 그 변경 사항이 b/README.md에 반영되었음(플러스 기호로 표시)을 의미합니다.

코드 변경 사항(Code Changes)

마지막으로 diff는 코드에 적용된 변경 사항 목록을 반환합니다. 전체 파일을 비교하는 것과 달리, diff는 파일 중 실제로 변경된 부분만 보여 줍니다. 이 예제에서는 파일에 한 줄을 추가했으며, 다음과 같은 결과가 출력되었습니다:

@@ -1 +1,2 @@
 This is an example of the Git diff feature.
+We have just added this line to our file.

첫 번째 줄은 파일에 적용된 변경 사항의 요약입니다. 이를 통해 두 번째 줄(2)부터 시작하여 한 줄의 코드(+1)를 파일에 추가했다는 것을 알 수 있습니다.

그다음에는 변경된 내용 목록이 표시됩니다. "We have just added this line to our file."이라는 줄을 추가했기 때문에 해당 줄이 diff에 나타나며, 플러스 기호는 그 줄이 파일에 추가되었음을 의미합니다.

마무리

diff는 Git 저장소에서 두 파일, 브랜치, 커밋을 비교할 수 있는 유용한 기능입니다. 이를 통해 저장소의 특정 시점 이후로 어떤 변경이 이루어졌는지 파악할 수 있습니다.

이 튜토리얼에서는 Git에서 diff를 사용하는 기본 원리와 git diff 명령어로 diff 작업을 수행하는 방법을 살펴보았습니다. 이제 여러분도 전문가처럼 git diff 명령어를 활용할 준비가 되었습니다!

Git에 대해 더 배우고 싶다면 Git 학습 가이드 같은 추가 학습 자료를 참고해 보세요.