Git 커밋 구조 및 관련 명령어 정리
1. 커밋(Commit)
- 정의: Git에서 변경사항을 저장하는 단위로, 메타데이터를 포함한다. 메타데이터에는 작성자, 날짜와 같은 정보 외에도 이 커밋을 생성하기 위한 소스(부모 커밋들의 정보)가 포함된다.
- 예시: 사용자가 파일 수정 후
git commit -m "수정 내용 요약" 명령어를 사용하여 커밋을 생성. 이때, 메타데이터에는 수정한 사람, 날짜 등의 정보가 저장된다.
2. 트리(Tree)
- 정의: 저장소 내 파일들의 이름과 위치를 추적한다. 디렉토리 구조를 나타내며, 각 파일은 Blob으로, 서브디렉토리는 다른 트리로 참조된다.
- 예시: 프로젝트에
src/ 디렉토리와 README.md 파일이 있을 때, 이 구조는 트리 객체로 관리되며, src/ 디렉토리는 또 다른 트리 객체로, README.md 파일은 Blob 객체로 참조된다.
3. Blob(Binary Large Object)
- 정의: 데이터의 종류에 상관없이 데이터를 저장하는 객체. 파일의 내용을 담고 있으며, 파일의 이름이나 디렉토리 구조는 포함하지 않는다.
- 예시:
README.md 파일의 실제 내용은 Blob 객체에 저장된다. 파일 내용이 변경되면 새로운 Blob 객체가 생성된다.

Git Hash
- 정의: 해시 함수를 통해 생성된 고유한 값으로, 파일의 내용이 동일하면 해시 값도 동일하다. 이를 통해 파일의 내용 변경 유무를 효율적으로 확인할 수 있다.
- 예시: 두 개발자가 동일한 파일을 수정하지 않았다면, 해당 파일의 해시 값은 같다. 이는 파일이 동일함을 의미한다.
echo "Hello, Git!" > example.txt
git hash-object example.txt
ce013625030ba8dba906f756967f9e9ca394464a
Git Log
- 정의: 커밋의 기록을 확인할 수 있는 명령어. 작업 내역을 시간 순으로 조회할 수 있다.
- 예시:
git log 명령어를 사용하면, 저장소의 커밋 히스토리를 확인할 수 있다. 각 커밋의 메타데이터(작성자, 날짜 등)와 함께 조회된다.
git log --oneline
1a2b3c4d5e README 파일 수정
2b3c4d5e6f 초기 프로젝트 설정
3c4d5e6f7g 첫 번째 커밋
Git Show
- 정의: 특정 커밋이나 객체의 정보를 보여주는 명령어. 커밋의 변경사항, 트리의 구조, Blob의 내용 등을 확인할 수 있다.
- 예시:
git show [커밋 해시] 명령어를 사용하면, 해당 커밋의 상세 변경 내용을 확인할 수 있다.
git show 1a2b3c4d5e
commit 1a2b3c4d5ef67890d1234567890abcdef1234567 (HEAD -> main, origin/main)
Author: 홍길동 <honggildong@example.com>
Date: Mon Feb 1 12:34:56 2021 +0900
README 파일 수정
diff --git a/README.md b/README.md
index 4b825dc..8e73b0e 100644
--- a/README.md
+++ b/README.md
@@ -1 +1 @@
-Hello, World!
+Hello, Git!
Git Diff 및 Git Annotate 요약
Git Diff 명령어
git diff -r HEAD: 가장 최근 커밋과 작업 디렉토리 사이의 차이를 비교한다.
git diff -r HEAD~1: 두 번째로 최근의 커밋과 가장 최근 커밋 사이의 차이를 비교한다.
Git Diff 비교 예시
git diff 34235g3 sfd430f: 34235g3 커밋과 sfd430f 커밋 사이의 차이를 비교한다.
git diff HEAD~3 HEAD~2: 네 번째로 최근 커밋과 세 번째로 최근 커밋 사이의 차이를 비교한다.
Git Annotate 명령어
git annotate report.md: report.md 파일의 각 라인별로 변경 사항을 문서화하며, 해당 라인을 마지막으로 수정한 커밋과 작성자 정보를 보여준다.
변경 취소 및 Git 명령어 요약
단일 파일 변경 취소
- 단일 파일 언스테이징: 작업 디렉토리에서 변경된 파일을 스테이징 영역(커밋 준비 영역)에서 제거하고 싶을 때 사용한다.
git reset HEAD file.csv: file.csv 파일의 변경사항을 언스테이징한다.
nano file.csv: file.csv 파일을 수정한다.
git add file.csv: 수정된 file.csv 파일을 다시 스테이징한다.
git commit -m "message": 변경사항을 커밋한다.
모든 파일 변경 취소
- 모든 파일 언스테이징: 작업 디렉토리의 모든 변경사항을 스테이징 영역에서 제거하고 싶을 때 사용한다.
git reset HEAD: 모든 변경사항을 언스테이징한다.
- 파일 변경사항 취소:
git checkout -- file.csv: file.csv 파일의 변경사항을 취소하고 마지막 커밋 상태로 되돌린다. 이 명령어는 파일의 모든 변경사항을 영구적으로 삭제한다.
git checkout .: 작업 디렉토리의 모든 파일을 마지막 커밋 상태로 되돌린다. 이는 저장소에 있는 모든 파일의 버전을 마지막 커밋으로 변경한다는 의미이다.
주의사항
git checkout -- file.csv 사용 시, 스테이징되지 않은 변경사항은 영구적으로 손실된다. 따라서 변경사항을 완전히 포기하고자 할 때만 사용해야 한다.
git checkout . 명령어는 작업 디렉토리 내의 모든 변경사항을 취소한다. 이는 복구할 수 없으므로 주의해서 사용해야 한다.
file.csv에 실수로 잘못된 데이터를 추가한 후, 이를 스테이징 했다면 git reset HEAD file.csv로 스테이징된 변경사항을 취소할 수 있다. 이후 git checkout -- file.csv를 통해 파일을 마지막 커밋 상태로 되돌려, 잘못된 변경사항을 완전히 제거할 수 있다.
Git Log 출력 커스터마이징 및 이전 버전 파일 복원
Git Log 출력 커스터마이징
- 최근 커밋 확인:
git log -3: 가장 최근 3개의 커밋 로그를 보여준다.
git log -3 report.md: report.md 파일에 대한 가장 최근 3개의 커밋 로그를 보여준다.
- 시간 범위로 커밋 확인:
git log --since='Month Day Year': 지정된 날짜 이후의 커밋 로그를 보여준다. 예: git log --since='Apr 2 2022'.
git log --since='Apr 2 2022' --until='Apr 11 2022': 지정된 날짜 범위 내의 커밋 로그를 보여준다.
이전 버전 파일 복원
- 특정 파일의 이전 버전 복원:
git checkout -- filename: 작업 디렉토리의 filename 파일을 마지막 커밋 상태로 되돌린다.
git checkout dc9d8fac filename.csv: filename.csv 파일을 특정 커밋(dc9d8fac)의 버전으로 되돌린다.
git checkout HEAD~1 filename.csv: filename.csv 파일을 바로 이전 커밋의 버전으로 되돌린다.
- 커밋으로 되돌리기:
git checkout dc9d8fac: 전체 저장소를 특정 커밋(dc9d8fac) 상태로 되돌린다.
git checkout HEAD~1: 전체 저장소를 바로 이전 커밋의 상태로 되돌린다.
추적되지 않는 파일 확인 및 삭제
git clean -n: 추적되지 않는 파일을 보여주지만, 실제로 삭제하지는 않는다.
git clean -f: 추적되지 않는 파일을 영구적으로 삭제한다.