Git 저장소에서 파일 존재 여부 확인 방법

GitBeginner
지금 연습하기

소개

이 랩에서는 Git 저장소의 히스토리 내에서 파일이 존재하는지 확인하는 방법을 배우게 됩니다. 두 가지 주요 방법을 살펴볼 것입니다: 특정 커밋의 내용을 검사하기 위해 git ls-tree 명령어를 사용하고, 특정 파일의 히스토리를 보기 위해 파일 경로와 함께 git log를 사용하는 것입니다.

실습을 통해, 커밋 스냅샷에 존재하는 파일을 검사하기 위해 git ls-tree를 사용하고, 파일의 존재 여부와 히스토리를 확인하기 위해 git log -- <file>을 사용하는 연습을 할 것입니다. 또한, 이러한 방법들을 존재하지 않는 파일로 테스트하여 그들의 동작 방식을 이해할 것입니다.

git ls-tree 실행하여 파일 확인

이 단계에서는 git ls-tree 명령어를 사용하여 Git 타임머신 내부를 살펴보는 방법을 알아볼 것입니다. 이 명령어를 사용하면 특정 커밋의 내용을 볼 수 있습니다. 마치 밀봉된 타임 캡슐을 완전히 열지 않고 내부를 들여다보는 것과 같습니다.

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

cd ~/project/my-time-machine

이제 git ls-tree를 사용하여 최신 커밋의 내용을 살펴보겠습니다. 커밋 ID 가 필요한데, 이는 git log의 출력에서 얻을 수 있습니다. 또는 최신 커밋을 나타내는 HEAD를 사용할 수도 있습니다.

git ls-tree HEAD

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

100644 blob a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7r8s9 message.txt

이 출력을 자세히 살펴보겠습니다.

  • 100644: 파일 모드 (file mode) 로, 일반 파일임을 나타냅니다.
  • blob: Git 에서 파일 내용을 저장하는 방식인 "blob" 객체임을 알려줍니다.
  • a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7r8s9: blob 객체의 고유 식별자 (해시) 로, 커밋 시점의 message.txt 파일의 정확한 내용을 나타냅니다.
  • message.txt: 파일 이름입니다.

git ls-tree 명령어는 해당 커밋을 체크아웃하지 않고도 커밋의 내용을 검사하는 데 유용합니다. 해당 특정 시점의 스냅샷에 포함된 파일과 디렉토리를 보여줍니다. 이는 최신 커밋과 비교하여 작업 디렉토리의 현재 상태를 보여주는 git status와는 다릅니다.

git ls-tree를 이해하면 Git 이 프로젝트의 히스토리를 각자 고유한 파일 및 디렉토리 집합을 가진 일련의 스냅샷으로 저장하는 방식을 알 수 있습니다.

git log -- 파일 명령어로 확인

이전 단계에서는 git ls-tree를 사용하여 커밋의 내용을 확인했습니다. 이제 파일 경로와 함께 git log를 사용하여 특정 파일과 관련된 히스토리를 보는 또 다른 방법을 살펴보겠습니다.

여전히 프로젝트 디렉토리에 있는지 확인하십시오.

cd ~/project/my-time-machine

이제 git log를 사용하여 message.txt 파일의 히스토리를 살펴보겠습니다.

git log -- message.txt

message.txt를 생성한 커밋에 대한 로그 항목을 볼 수 있습니다.

commit a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7r8s9 (HEAD -> master)
Author: Your Name <your.email@example.com>
Date:   Mon Aug 7 10:00:00 2023 +0000

    Send a message to the future

명령어의 -- message.txt 부분은 git log에게 message.txt 파일에 영향을 미친 커밋만 표시하도록 지시합니다. 이는 많은 파일이 있는 대규모 프로젝트에서 특정 파일의 히스토리만 보려는 경우 매우 유용합니다.

이 명령어를 사용하면 다음과 같은 질문에 답할 수 있습니다.

  • 이 파일은 언제 생성되었습니까?
  • 이 파일에 마지막으로 변경을 한 사람은 누구입니까?
  • 특정 커밋에서 이 파일에 어떤 변경 사항이 있었습니까?

프로젝트가 커지고 더 많은 커밋을 할수록 git log -- <file>을 사용하는 것은 프로젝트 내 개별 파일의 히스토리와 진화를 이해하는 데 필수적입니다.

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

존재하지 않는 파일 테스트

이전 단계에서 git ls-treegit log -- <file>을 사용하여 Git 저장소에 존재하는 파일을 성공적으로 검사했습니다. 이제 저장소의 히스토리에 없는 파일에 대해 이러한 명령어를 사용하려고 할 때 어떤 일이 발생하는지 살펴보겠습니다.

프로젝트 디렉토리에 있는지 확인하십시오.

cd ~/project/my-time-machine

먼저, 존재하지 않는 파일, 예를 들어 nonexistent.txt에 대해 git ls-tree를 사용해 보겠습니다.

git ls-tree HEAD nonexistent.txt

출력이 없어야 합니다. 이는 git ls-tree가 지정된 트리 (이 경우 HEAD의 트리) 에 있는 항목만 나열하기 때문입니다. nonexistent.txt가 최신 커밋의 트리에 없으므로 아무것도 표시되지 않습니다.

이제 동일한 존재하지 않는 파일에 대해 git log를 사용해 보겠습니다.

git log -- nonexistent.txt

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

fatal: no such path 'nonexistent.txt' in HEAD

이것은 다른 동작입니다! git log -- <file>은 히스토리 전체에서 주어진 파일 경로에 영향을 미친 커밋을 특별히 찾습니다. 파일 경로가 어떤 커밋에도 존재하지 않은 경우 Git 은 "no such path"가 있다고 알려줍니다.

이러한 동작의 차이점은 이러한 명령어가 작동하는 방식을 강조합니다.

  • git ls-tree특정 스냅샷(커밋) 을 검사하고 해당 내용을 나열합니다.
  • git log -- <file>전체 히스토리에서 특정 파일 경로와 관련된 변경 사항을 검색합니다.

이러한 차이점을 이해하면 작업에 적합한 명령어를 선택하는 데 도움이 됩니다. 커밋에 어떤 파일이 있었는지 보려면 git ls-tree를 사용하십시오. 파일의 히스토리를 보려면 git log -- <file>을 사용하십시오.

요약

이 랩에서는 특정 커밋을 체크아웃하지 않고 Git 저장소의 히스토리 내에 파일이 존재하는지 확인하는 방법을 배웠습니다. 먼저, 특정 커밋 (예: HEAD) 의 내용을 검사하고 파일과 해당 블롭 해시를 볼 수 있는 git ls-tree 명령어를 살펴보았습니다. 이 명령어는 특정 시점의 저장소 스냅샷을 제공하여 파일 모드, 객체 유형, 객체 ID 및 파일 이름을 보여줍니다.

그런 다음, 해당 파일과 관련된 커밋 히스토리를 보기 위해 파일 경로와 함께 git log를 사용하는 방법을 탐구하기 시작했습니다. 이 방법을 사용하면 파일이 언제 추가, 수정 또는 삭제되었는지 확인할 수 있으며, 저장소의 타임라인 내에서 파일의 존재에 대한 다른 관점을 제공합니다.