Git 커밋이 비어 있는지 확인하는 방법

GitBeginner
지금 연습하기

소개

이 랩에서는 Git 커밋이 비어 있는지, 즉 프로젝트 파일에 변경 사항을 도입하지 않는지 확인하는 방법을 살펴봅니다. git show 명령을 사용하여 특정 커밋 내의 세부 정보와 변경 사항을 검사하고 내용의 시각적 표현을 제공하는 방법을 배웁니다.

또한, 커밋에 연결된 변경 사항이 있는지 프로그래밍 방식으로 확인하는 보다 직접적인 방법인 git diff-tree 명령 사용법을 자세히 살펴보겠습니다. 마지막으로, 변경 사항을 포함하는 일반 커밋과 의도적으로 생성된 빈 커밋을 모두 사용하여 이러한 기술을 테스트하여 이해도를 높일 것입니다.

git show 실행하여 변경 사항 확인

이 단계에서는 git show 명령을 사용하여 특정 커밋의 세부 정보를 검사하는 방법을 배웁니다. 이 명령은 마치 타임 캡슐을 열어 그 순간 안에 정확히 무엇이 있었는지 확인하는 것과 같습니다.

먼저, 프로젝트 디렉토리에 있는지 확인해 보겠습니다.

cd ~/project/my-time-machine

이제 git show를 사용하여 첫 번째 커밋을 살펴보겠습니다. git log 출력에서 커밋 해시 (긴 문자열) 를 사용하거나, 현재 브랜치의 최신 커밋을 나타내는 HEAD를 사용할 수 있습니다.

git show HEAD

다음과 유사한 출력을 볼 수 있습니다.

commit a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7r8s9 (HEAD -> master)
Author: Jane Doe <jane.doe@example.com>
Date:   Mon Aug 7 10:00:00 2023 +0000

    Send a message to the future

diff --git a/message.txt b/message.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/message.txt
@@ -0,0 +1 @@
+Hello, Future Me

이 출력을 분석해 보겠습니다.

  • 첫 번째 부분은 git log와 유사하며, 커밋 정보 (해시, 작성자, 날짜, 메시지) 를 보여줍니다.
  • diff 섹션은 이 커밋에 의해 도입된 변경 사항을 보여줍니다.
    • diff --git a/message.txt b/message.txt: 파일 message.txt에 대한 커밋 전후의 상태 차이를 나타냅니다.
    • new file mode 100644: message.txt가 새 파일임을 보여줍니다.
    • index 0000000..e69de29: 파일 내용에 대한 내부 Git 정보입니다.
    • --- /dev/null: 커밋 전의 상태를 나타냅니다 (파일이 존재하지 않았습니다).
    • +++ b/message.txt: 커밋 후의 상태를 나타냅니다.
    • @@ -0,0 +1 @@: 이는 변경 사항을 나타내는 "hunk header"입니다. -0,0은 원본 파일의 0 번째 줄부터 0 줄이 제거되었음을 의미하고, +1은 새 파일의 1 번째 줄부터 1 줄이 추가되었음을 의미합니다.
    • +Hello, Future Me: 이 커밋에 추가된 줄입니다. + 기호는 추가를 나타냅니다.

git show 명령은 프로젝트의 히스토리를 이해하는 데 매우 유용합니다. 특정 커밋에서 정확히 어떤 변경 사항이 있었는지 확인할 수 있으며, 이는 디버깅이나 기능 구현 방식을 이해하는 데 필수적입니다.

q를 눌러 git show 보기를 종료합니다.

git diff-tree 를 사용하여 빈 커밋 확인

이 단계에서는 git diff-tree라는 또 다른 명령을 살펴봅니다. 이 명령은 커밋 내의 변경 사항을 검사하는 데 유용하며, 특히 커밋이 "비어 있는지"(파일 내용 변경 사항을 도입하지 않고 커밋 메시지와 같은 메타데이터만 변경하는 경우) 확인하는 데 유용합니다.

먼저, 프로젝트 디렉토리에 있는지 확인합니다.

cd ~/project/my-time-machine

이제 첫 번째 커밋 (HEAD) 에 대해 --no-commit-id--name-only 옵션과 함께 git diff-tree를 사용해 보겠습니다.

git diff-tree --no-commit-id --name-only HEAD

다음과 같은 출력을 볼 수 있습니다.

message.txt

명령과 해당 출력을 이해해 보겠습니다.

  • git diff-tree: 이 명령은 Git 트리 내의 객체의 내용과 모드를 비교합니다.
  • --no-commit-id: 이 옵션은 출력에서 커밋 ID 를 억제하여 더 깔끔하게 만듭니다.
  • --name-only: 이 옵션은 커밋에서 변경된 파일의 이름만 표시합니다.
  • HEAD: 검사하려는 커밋 (최신 커밋) 을 지정합니다.

출력 message.txtHEAD가 가리키는 커밋이 message.txt 파일에 대한 변경 사항을 도입했음을 알려줍니다.

이제 파일을 변경하지 않는 커밋에 대해 동일한 명령을 실행하면 어떻게 되는지 살펴보겠습니다. 첫 번째 커밋이 유일한 커밋이므로 가상 시나리오를 시도해 보겠습니다. 파일 변경 없이 커밋 메시지만 업데이트하는 커밋이 있는 경우, git diff-tree --no-commit-id --name-only <commit-hash>는 출력을 생성하지 않습니다. 이것이 git diff-tree를 사용하여 파일 변경 측면에서 커밋이 "비어 있는지" 확인하는 방법입니다.

git show는 변경 사항에 대한 자세한 보기를 제공하는 반면, --name-only와 같은 옵션을 사용한 git diff-tree는 스크립팅이나 전체 diff 를 보지 않고 커밋의 영향을 받은 파일을 빠르게 확인하는 데 유용합니다.

일반 커밋으로 테스트

이 단계에서는 리포지토리에서 기록을 구축하고 git loggit status가 이러한 변경 사항을 어떻게 반영하는지 확인하기 위해 더 많은 커밋을 생성하는 연습을 합니다. 이는 여러 변경 사항을 만들고 점진적으로 저장하는 보다 일반적인 워크플로우를 시뮬레이션합니다.

먼저, 프로젝트 디렉토리에 있는지 확인합니다.

cd ~/project/my-time-machine

이제 message.txt 파일에 다른 줄을 추가해 보겠습니다. >>와 함께 echo 명령을 사용하여 기존 파일에 텍스트를 추가합니다.

echo "Adding another line for testing." >> message.txt

변경 사항을 확인하기 위해 파일의 내용을 확인해 보겠습니다.

cat message.txt

다음과 같은 출력을 볼 수 있습니다.

Hello, Future Me
Adding another line for testing.

이제 리포지토리의 상태를 확인해 보겠습니다.

git status

message.txt가 수정되었음을 나타내는 출력을 볼 수 있습니다.

On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        modified:   message.txt

no changes added to commit (use "git add" and/or "git commit -a")

Git 은 마지막 커밋 이후 파일이 변경되었음을 올바르게 식별합니다. 이제 이 변경 사항을 스테이징하고 커밋해 보겠습니다.

git add message.txt
git commit -m "Add a second line to message.txt"

커밋을 확인하는 출력을 볼 수 있습니다.

[master a1b2c3d] Add a second line to message.txt
 1 file changed, 1 insertion(+)

이제 두 번째 커밋을 만들었습니다. git log를 사용하여 커밋 기록을 살펴보겠습니다.

git log

이제 최신 커밋이 맨 위에 있는 두 개의 커밋 항목을 볼 수 있습니다.

commit a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7r8s9 (HEAD -> master)
Author: Jane Doe <jane.doe@example.com>
Date:   Mon Aug 7 10:00:00 2023 +0000

    Add a second line to message.txt

commit f0e1d2c3b4a5968776543210fedcba9876543210
Author: Jane Doe <jane.doe@example.com>
Date:   Mon Aug 7 09:55:00 2023 +0000

    Send a message to the future

(참고: 커밋 해시 및 날짜는 출력에서 다를 것입니다).

이는 변경 사항을 만들고, git add로 스테이징하고, git commit으로 새 커밋으로 저장하는 기본 주기를 보여줍니다. 각 커밋은 프로젝트의 기록에서 뚜렷한 지점을 나타내므로 진행 상황을 추적하고 필요한 경우 이전 상태로 되돌릴 수 있습니다.

로그를 종료하려면 q를 누르십시오.

요약

이 랩에서는 git show 명령을 사용하여 Git 커밋의 세부 정보를 검사하는 방법을 배웠습니다. 이 명령은 특정 커밋에 대한 포괄적인 보기, 즉 메타데이터 (작성자, 날짜, 메시지) 와 해당 커밋에서 diff 형식으로 도입된 정확한 변경 사항을 제공합니다. diff 출력이 추가, 제거 또는 수정된 줄을 명확하게 나타내어 커밋 내의 내용 변경 사항을 이해할 수 있음을 확인했습니다.

커밋이 비어 있는지 확인하는 방법과 다양한 유형의 커밋으로 이러한 기술을 테스트하는 방법을 계속 탐구할 것입니다.