본문 바로가기
  • AI 시대에 적응하는 현대인을 위한 지식 공간
  • AI를 위한 데이터를 과학으로 역어본다
AI 코딩

Git 명령어 참조 사전

by 피크나인 2025. 10. 25.

Git 명령어 완벽 가이드 - 개발자를 위한 빠른 참조 사전

Git은 전 세계에서 가장 많이 사용되는 분산 버전 관리 시스템입니다. 이 가이드는 개발자가 실무에서 자주 사용하는 Git 명령어들을 빠르게 찾아볼 수 있도록 사전 형식으로 구성하였습니다. 각 명령어는 설명, 옵션, 실제 사용 예시와 함께 제공되므로 초보 개발자부터 숙련된 개발자까지 언제든지 참고할 수 있습니다. 명령어는 사용 빈도와 중요도에 따라 분류되어 있으며, 필요한 명령어를 빠르게 찾을 수 있도록 목차가 구성되어 있습니다. 이 문서 하나면 Git의 거의 모든 작업을 처리할 수 있습니다.

AI코딩을 활용하는 경우 Git사용을 자주 할 수록 AI의 환각에서 안전해질 수 있습니다. 
 

Git을 활용하면 개발소스에 대한 버전관리가 가능합니다.
Git을 활용하면 개발소스에 대한 버전관리가 가능합니다.

 


1. Git 설치 및 구성  |  Configuration

Git을 처음 설치한 후 반드시 설정해야 하는 구성 항목들입니다. 전역 설정은 컴퓨터 전체에 적용되며, 사용자 이름과 이메일은 모든 커밋에 기록되므로 정확하게 설정해야 합니다. 개행 문자 설정은 Windows와 Unix 계열 운영체제(macOS, Linux) 간의 줄바꿈 호환성 문제를 방지합니다. 구성 설정은 ~/.gitconfig 파일에 저장되며, 언제든지 수정하거나 삭제할 수 있습니다.

명령어 설명
git --version Git 버전 확인
git config --global core.autocrlf input 개행 문자 설정 (macOS/Linux)
git config --global core.autocrlf true 개행 문자 설정 (Windows)
git config --global user.name "홍길동" 사용자 이름 설정
git config --global user.email "hong@example.com" 사용자 이메일 설정
git config --global init.defaultBranch main 기본 브랜치 이름을 main으로 설정
git config --global pull.rebase true pull 시 리베이스를 기본 동작으로 설정
git config --global --list 전역 구성 목록 확인
git config --list 현재 저장소 구성 포함 전체 목록 확인
git config --global --unset user.name 특정 구성 항목 삭제
git config --global --edit 구성 파일을 에디터로 직접 편집

유용한 별칭(Alias) 설정

# 자주 사용하는 명령어에 짧은 별칭 만들기
git config --global alias.st status
git config --global alias.co checkout
git config --global alias.br branch
git config --global alias.ci commit
git config --global alias.cm 'commit -m'
git config --global alias.lg 'log --oneline --graph --all --decorate'
git config --global alias.unstage 'reset HEAD --'
git config --global alias.last 'log -1 HEAD'
git config --global alias.visual 'log --all --graph --pretty=format:"%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset" --abbrev-commit'

2. 저장소 초기화  |  Initialize

새로운 프로젝트에서 Git 버전 관리를 시작하거나, 기존 원격 저장소를 로컬로 가져오는 명령어들입니다. git init은 현재 디렉토리를 Git 저장소로 만들고, git clone은 원격 저장소를 복사합니다. 원격 저장소는 GitHub, GitLab, Bitbucket 등의 호스팅 서비스나 자체 서버에 위치할 수 있습니다. 원격 별칭은 원격 저장소를 참조할 때 사용하는 이름이며, 단일 원격 저장소인 경우 origin을 사용하는 것이 관례입니다.

명령어 설명 예시
git init 현재 디렉토리를 Git 저장소로 초기화 git init
git init <디렉토리> 특정 디렉토리를 생성하고 Git 저장소로 초기화 git init my-project
git clone <URL> 원격 저장소를 현재 위치에 복제 git clone https://github.com/user/repo.git
git clone <URL> <디렉토리명> 원격 저장소를 특정 디렉토리명으로 복제 git clone https://github.com/user/repo.git my-repo
git clone -b <브랜치> <URL> 특정 브랜치만 복제 git clone -b develop https://github.com/user/repo.git
git remote 원격 저장소 목록 확인 git remote
git remote -v 원격 저장소 URL 상세 확인 git remote -v
git remote add <별칭> <URL> 원격 저장소 추가 git remote add origin https://github.com/user/repo.git
git remote remove <별칭> 원격 저장소 제거 git remote remove origin
git remote rename <기존> <새이름> 원격 저장소 별칭 변경 git remote rename origin upstream
git remote set-url <별칭> <새URL> 원격 저장소 URL 변경 git remote set-url origin https://new-url.git
git remote show <별칭> 원격 저장소 상세 정보 확인 git remote show origin

저장소 초기화 예시

# 새 프로젝트 시작
mkdir my-project
cd my-project
git init
git remote add origin https://github.com/username/my-project.git

# 기존 저장소 복제
git clone https://github.com/username/existing-repo.git
cd existing-repo

# Git 버전 관리 완전히 제거 (신중하게 사용)
rm -rf .git              # macOS/Linux
rmdir /s .git            # Windows CMD
Remove-Item -Recurse -Force .git  # Windows PowerShell

 


3. 파일 추적 및 스테이징  |  Tracking & Staging

Git은 3단계 영역으로 파일을 관리합니다: 작업 디렉토리(Working Directory), 스테이징 영역(Staging Area), 저장소(Repository)입니다. 스테이징은 다음 커밋에 포함할 변경사항을 선택하는 과정이며, 선택적으로 파일을 커밋할 수 있게 해줍니다. 추적되지 않은 파일은 Git이 아직 관리하지 않는 새 파일을 의미하며, 변경된 파일은 이전 커밋 이후 수정된 파일입니다. 스테이징 영역을 통해 논리적 단위로 커밋을 나누어 깔끔한 히스토리를 유지할 수 있습니다.

명령어 설명 예시
git status 현재 작업 디렉토리 상태 확인 git status
git status -s 간략한 상태 확인 (short) git status -s
git status -b 브랜치 정보 포함 상태 확인 git status -b
git add <파일> 특정 파일 스테이징 git add index.html
git add <파일1> <파일2> 여러 파일 스테이징 git add file1.js file2.css
git add . 현재 디렉토리의 모든 변경사항 스테이징 git add .
git add -A 저장소 전체의 모든 변경사항 스테이징 git add -A
git add *.js 특정 확장자 파일 모두 스테이징 git add *.js
git add src/ 특정 디렉토리 전체 스테이징 git add src/
git add -p 변경사항을 대화형으로 선택하여 스테이징 git add -p
git rm <파일> 파일 삭제 및 삭제 사항 스테이징 git rm old-file.txt
git rm --cached <파일> Git 추적에서만 제거 (파일은 유지) git rm --cached config.ini
git rm -r --cached <디렉토리> 디렉토리를 추적에서 제거 git rm -r --cached node_modules
git mv <기존> <새이름> 파일 이름 변경 및 스테이징 git mv old.txt new.txt
git restore --staged <파일> 특정 파일 언스테이징 (v2.23+) git restore --staged main.js
git restore --staged . 모든 파일 언스테이징 (v2.23+) git restore --staged .
git reset HEAD <파일> 파일 언스테이징 (구버전) git reset HEAD main.js
git clean -n 삭제될 미추적 파일 목록 미리보기 git clean -n
git clean -f 미추적 파일 삭제 git clean -f
git clean -fd 미추적 파일과 디렉토리 삭제 git clean -fd
git clean -fdx 미추적 파일과 무시된 파일까지 모두 삭제 git clean -fdx

상태 확인 및 스테이징 예시

# 현재 상태 확인
git status

# 특정 파일만 스테이징
git add src/main.js
git add src/utils.js

# 특정 타입 파일만 스테이징
git add *.html
git add css/*.css

# 대화형 스테이징 (변경사항 일부만 선택)
git add -p index.js
# y: 이 변경사항을 스테이징
# n: 이 변경사항을 스킵
# s: 더 작은 단위로 분할
# q: 종료

# 실수로 스테이징한 경우 취소
git restore --staged src/config.js

.gitignore 파일 작성

# .gitignore 파일 예시

# 의존성 디렉토리
node_modules/
vendor/

# 빌드 결과물
dist/
build/
*.min.js
*.min.css

# 환경 설정 파일
.env
.env.local
config.ini

# 로그 파일
*.log
logs/

# 운영체제 생성 파일
.DS_Store
Thumbs.db

# IDE 설정 파일
.vscode/
.idea/
*.swp
*.swo

# 임시 파일
*.tmp
*.bak
~$*

4. 커밋  |  Commit

커밋은 스테이징된 변경사항을 저장소에 영구적으로 기록하는 작업입니다. 각 커밋은 고유한 해시값(SHA-1)을 가지며, 작성자, 날짜, 메시지가 함께 저장됩니다. 좋은 커밋은 논리적으로 관련된 변경사항만 포함하고, 명확한 메시지를 작성하며, 나중에 되돌리거나 참조하기 쉽도록 작은 단위로 나누어 작성합니다. 커밋 메시지는 프로젝트 히스토리를 이해하는 핵심 요소이므로 신중하게 작성해야 합니다.

명령어 설명 예시
git commit -m "<메시지>" 메시지와 함께 커밋 생성 git commit -m "로그인 기능 추가"
git commit -m "<제목>" -m "<본문>" 제목과 본문을 구분하여 커밋 git commit -m "Fix bug" -m "상세 설명..."
git commit -am "<메시지>" 추적 중인 파일 자동 스테이징 후 커밋 git commit -am "Update readme"
git commit 에디터로 메시지 작성하여 커밋 git commit
git commit --amend 직전 커밋 수정 (메시지 및 파일) git commit --amend
git commit --amend -m "<메시지>" 직전 커밋 메시지만 수정 git commit --amend -m "새 메시지"
git commit --amend --no-edit 메시지 수정 없이 파일만 추가 git commit --amend --no-edit
git commit --allow-empty -m "<메시지>" 변경사항 없이 빈 커밋 생성 git commit --allow-empty -m "Trigger CI"
git commit --fixup <커밋> 특정 커밋의 수정사항으로 표시 git commit --fixup abc123
git commit --squash <커밋> 특정 커밋에 합칠 커밋으로 표시 git commit --squash abc123

커밋 메시지 컨벤션

# Conventional Commits 형식
<type>(<scope>): <subject>

<body>

<footer>

# Type 종류
feat:     새로운 기능 추가
fix:      버그 수정
docs:     문서 수정
style:    코드 포맷팅, 세미콜론 누락 등 (기능 변경 없음)
refactor: 코드 리팩토링
test:     테스트 코드 추가/수정
chore:    빌드 작업, 패키지 매니저 설정 등
perf:     성능 개선
ci:       CI 설정 파일 수정
build:    빌드 시스템 수정
revert:   이전 커밋 되돌리기

# 예시
git commit -m "feat: 사용자 로그인 기능 추가"
git commit -m "fix: 회원가입 시 이메일 검증 버그 수정"
git commit -m "docs: API 문서 업데이트"
git commit -m "refactor: 중복 코드 제거 및 함수 분리"
git commit -m "style: 코드 포맷팅 적용 (Prettier)"
git commit -m "test: 로그인 테스트 케이스 추가"
git commit -m "chore: 의존성 버전 업데이트"

커밋 실전 예시

# 기본 커밋 흐름
git add src/login.js
git commit -m "feat: 로그인 폼 유효성 검사 추가"

# 모든 추적 파일 자동 스테이징 후 커밋
git commit -am "fix: 오타 수정"

# 에디터로 상세한 메시지 작성
git commit
# 에디터가 열리면 메시지 작성 후 저장

# 직전 커밋에 파일 추가
git add forgotten-file.js
git commit --amend --no-edit

# 직전 커밋 메시지 수정
git commit --amend -m "feat: 로그인 및 로그아웃 기능 추가"

5. 로그 및 히스토리 확인  |  Log & History

커밋 히스토리를 확인하면 프로젝트의 변경 이력을 추적하고, 특정 버전을 찾고, 누가 언제 무엇을 변경했는지 파악할 수 있습니다. git log는 다양한 옵션으로 원하는 형태의 정보를 출력할 수 있으며, git show는 특정 커밋의 상세 내용을 확인합니다. git reflog는 HEAD의 모든 이동 기록을 보여주어 실수로 삭제한 커밋도 복구할 수 있게 해줍니다. git blame은 코드 리뷰나 버그 추적 시 각 줄의 작성자를 확인할 때 유용합니다.

명령어 설명 예시
git log 커밋 히스토리 확인 git log
git log -n <숫자> 최근 n개의 커밋만 표시 git log -5
git log --oneline 각 커밋을 한 줄로 간략하게 표시 git log --oneline
git log --graph 브랜치와 병합을 그래프로 표시 git log --graph
git log --all 모든 브랜치의 커밋 표시 git log --all
git log --graph --all --oneline 모든 브랜치를 그래프로 간략하게 표시 git log --graph --all --oneline
git log --since="2 weeks ago" 특정 기간 이후의 커밋 표시 git log --since="2024-01-01"
git log --until="yesterday" 특정 기간 이전의 커밋 표시 git log --until="2024-12-31"
git log --author="<이름>" 특정 작성자의 커밋만 표시 git log --author="홍길동"
git log --grep="<키워드>" 커밋 메시지에서 키워드 검색 git log --grep="fix"
git log -p 각 커밋의 변경 내용(diff) 포함 git log -p
git log --stat 각 커밋의 통계 정보 표시 git log --stat
git log --pretty=format:"%h - %an, %ar : %s" 커스텀 포맷으로 표시 git log --pretty=format:"%h %s"
git log <파일> 특정 파일의 히스토리 확인 git log src/main.js
git log --follow <파일> 파일 이름 변경 포함하여 히스토리 확인 git log --follow README.md
git log <브랜치1>..<브랜치2> 두 브랜치 간의 차이 커밋 확인 git log main..develop
git log --merges 병합 커밋만 표시 git log --merges
git log --no-merges 병합 커밋 제외하고 표시 git log --no-merges
git show 최신 커밋의 상세 정보 표시 git show
git show <커밋> 특정 커밋의 상세 정보 표시 git show abc123
git show <커밋>:<파일> 특정 커밋의 특정 파일 내용 표시 git show abc123:src/main.js
git show <브랜치> 특정 브랜치의 최신 커밋 표시 git show develop
git reflog HEAD의 모든 이동 기록 확인 git reflog
git reflog show <브랜치> 특정 브랜치의 reflog 확인 git reflog show main
git blame <파일> 파일의 각 줄을 작성한 사람 확인 git blame index.html
git blame -L <시작>,<끝> <파일> 특정 줄 범위의 작성자 확인 git blame -L 10,20 main.js
git blame -L <시작>, <파일> 특정 줄부터 끝까지 작성자 확인 git blame -L 10, main.js
git shortlog 작성자별 커밋 요약 git shortlog
git shortlog -sn 작성자별 커밋 수 통계 git shortlog -sn

로그 포맷 커스터마이징

# 예쁜 로그 출력 (별칭으로 등록 추천)
git log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit --date=relative

# 간단한 로그
git log --oneline --graph --decorate --all

# 상세한 통계와 함께
git log --stat --graph --pretty=format:'%Cred%h%Creset - %s %Cgreen(%cr)%Creset'

# 최근 10개 커밋, 한 줄씩
git log -10 --oneline

# 특정 작성자의 최근 커밋
git log --author="홍길동" -5 --oneline

# 특정 날짜 범위의 커밋
git log --since="2024-01-01" --until="2024-12-31" --oneline

# 특정 파일의 변경 이력
git log --follow -p -- src/main.js

유용한 로그 조회 예시

# 오늘 작업한 내역
git log --since="midnight" --author="$(git config user.name)" --oneline

# 지난 주 작업 내역
git log --since="1 week ago" --oneline

# 특정 키워드가 포함된 커밋 찾기
git log --all --grep="login"

# 두 브랜치의 차이점 확인
git log main..develop --oneline

# 특정 파일을 수정한 커밋 찾기
git log -- path/to/file.js

# 삭제된 커밋 복구하기 (reflog 활용)
git reflog
git checkout <해시>

6. 브랜치  |  Branch

브랜치는 독립적인 작업 공간을 제공하여 메인 코드에 영향 없이 새 기능을 개발하거나 실험할 수 있게 합니다. 일반적으로 main 또는 master 브랜치는 프로덕션 코드를, develop 브랜치는 개발 중인 코드를, feature 브랜치는 개별 기능을 담당합니다. Git의 브랜치는 매우 가벼워서 생성과 전환이 빠르며, 여러 브랜치를 동시에 관리하는 것이 권장됩니다. 작업이 완료되면 브랜치를 병합하거나 삭제하여 정리할 수 있습니다.

명령어 설명 예시
git branch 로컬 브랜치 목록 확인 git branch
git branch -r 원격 브랜치 목록 확인 git branch -r
git branch -a 로컬 및 원격 브랜치 모두 확인 git branch -a
git branch -v 브랜치와 최신 커밋 함께 표시 git branch -v
git branch -vv 브랜치와 추적 중인 원격 브랜치 표시 git branch -vv
git branch <브랜치명> 새 브랜치 생성 (전환하지 않음) git branch feature
git branch <브랜치명> <커밋> 특정 커밋에서 브랜치 생성 git branch hotfix abc123
git branch -d <브랜치명> 병합된 브랜치 삭제 git branch -d feature
git branch -D <브랜치명> 브랜치 강제 삭제 (병합 여부 무시) git branch -D feature
git branch -m <새이름> 현재 브랜치 이름 변경 git branch -m main
git branch -m <기존> <새이름> 특정 브랜치 이름 변경 git branch -m master main
git branch --merged 현재 브랜치에 병합된 브랜치 목록 git branch --merged
git branch --no-merged 현재 브랜치에 병합되지 않은 브랜치 목록 git branch --no-merged
git branch --show-current 현재 브랜치 이름만 출력 (v2.22+) git branch --show-current
git checkout <브랜치> 브랜치 전환 git checkout develop
git checkout -b <브랜치> 브랜치 생성 후 즉시 전환 git checkout -b feature/login
git checkout -b <브랜치> <원격/브랜치> 원격 브랜치 기반으로 로컬 브랜치 생성 git checkout -b dev origin/develop
git checkout - 이전 브랜치로 전환 git checkout -
git checkout <커밋> 특정 커밋으로 이동 (detached HEAD) git checkout abc123
git checkout <태그> 특정 태그로 이동 git checkout v1.0.0
git switch <브랜치> 브랜치 전환 (v2.23+) git switch develop
git switch -c <브랜치> 브랜치 생성 후 전환 (v2.23+) git switch -c feature/new
git switch - 이전 브랜치로 전환 (v2.23+) git switch -

브랜치 전략 예시

# Git Flow 브랜치 전략
main              # 프로덕션 배포 브랜치
develop           # 개발 통합 브랜치
feature/*         # 기능 개발 브랜치
release/*         # 릴리스 준비 브랜치
hotfix/*          # 긴급 수정 브랜치

# 일반적인 브랜치 작업 흐름
git checkout develop
git pull origin develop
git checkout -b feature/user-profile
# 작업 수행
git add .
git commit -m "feat: 사용자 프로필 페이지 추가"
git push origin feature/user-profile
# PR 생성 및 리뷰 후 병합

브랜치 관리 예시

# 새 기능 브랜치 생성 및 작업
git checkout -b feature/payment
git add .
git commit -m "feat: 결제 기능 추가"

# 원격에 푸시
git push -u origin feature/payment

# main 브랜치로 돌아가기
git checkout main

# 최근 작업하던 브랜치로 빠르게 전환
git checkout -

# 병합된 브랜치 일괄 삭제
git branch --merged | grep -v "\*" | xargs -n 1 git branch -d

# 원격 브랜치 삭제
git push origin --delete feature/old-feature

# 원격에서 삭제된 브랜치 로컬에서 정리
git fetch --prune
git remote prune origin

7.  푸시  |  Push

푸시는 로컬 저장소의 커밋을 원격 저장소로 업로드하는 작업입니다. 일반적으로 작업이 완료되어 커밋을 생성한 후 팀원들과 공유하거나 백업하기 위해 원격 저장소로 푸시합니다. -u 옵션으로 업스트림을 설정하면 이후 git push만으로 간단하게 푸시할 수 있습니다. 강제 푸시(-f)는 원격 히스토리를 덮어쓰므로 협업 시 매우 신중하게 사용해야 하며, 가능하면 --force-with-lease 옵션을 사용하는 것이 안전합니다.

명령어 설명 예시
git push <원격> <브랜치> 특정 브랜치를 원격에 푸시 git push origin main
git push 현재 브랜치를 설정된 원격에 푸시 git push
git push -u <원격> <브랜치> 푸시 후 업스트림 설정 (이후 git push만 사용 가능) git push -u origin feature
git push --set-upstream <원격> <브랜치> 업스트림 설정 (--u와 동일) git push --set-upstream origin dev
git push <원격> --all 모든 로컬 브랜치를 원격에 푸시 git push origin --all
git push <원격> --tags 모든 태그를 원격에 푸시 git push origin --tags
git push <원격> <태그> 특정 태그를 원격에 푸시 git push origin v1.0.0
git push -f <원격> <브랜치> 강제 푸시 (원격 히스토리 덮어쓰기) git push -f origin feature
git push --force <원격> <브랜치> 강제 푸시 (--f와 동일) git push --force origin main
git push --force-with-lease 안전한 강제 푸시 (로컬이 최신일 때만) git push --force-with-lease
git push <원격> --delete <브랜치> 원격 브랜치 삭제 git push origin --delete old-feature
git push <원격> :<브랜치> 원격 브랜치 삭제 (구버전 문법) git push origin :old-feature
git push --dry-run 실제로 푸시하지 않고 시뮬레이션만 수행 git push --dry-run
git push --no-verify pre-push 훅 건너뛰고 푸시 git push --no-verify

푸시 실전 예시

# 기본 푸시 (처음 푸시하는 경우)
git push -u origin main
# 이후부터는
git push

# 새 브랜치 푸시
git checkout -b feature/new-feature
git add .
git commit -m "feat: 새 기능 추가"
git push -u origin feature/new-feature

# 여러 커밋 후 한 번에 푸시
git commit -m "작업1"
git commit -m "작업2"
git commit -m "작업3"
git push

# 모든 브랜치와 태그 푸시
git push origin --all
git push origin --tags

# 직전 커밋 수정 후 강제 푸시 (주의!)
git commit --amend -m "수정된 메시지"
git push --force-with-lease origin feature

# 원격 브랜치 삭제
git push origin --delete feature/old-branch

# 푸시 전 확인
git push --dry-run origin main

8. 풀  |  Pull

풀은 원격 저장소의 최신 변경사항을 가져와 현재 브랜치에 자동으로 병합하는 작업입니다. 내부적으로 git fetch와 git merge를 순차적으로 실행하는 것과 같습니다. 협업 시 작업을 시작하기 전에 항상 최신 코드를 받아오는 것이 좋으며, 충돌이 발생하면 수동으로 해결해야 합니다. --rebase 옵션을 사용하면 병합 커밋 없이 깔끔한 히스토리를 유지할 수 있습니다.

명령어 설명 예시
git pull 현재 브랜치의 원격 변경사항 가져와 병합 git pull
git pull <원격> <브랜치> 특정 원격 브랜치 가져와 병합 git pull origin main
git pull --rebase 병합 대신 리베이스로 가져오기 git pull --rebase
git pull --rebase <원격> <브랜치> 특정 브랜치를 리베이스로 가져오기 git pull --rebase origin develop
git pull --no-rebase 리베이스 설정 무시하고 병합으로 가져오기 git pull --no-rebase
git pull --ff-only Fast-forward 가능할 때만 병합 git pull --ff-only
git pull --all 모든 원격 브랜치 정보 가져오기 git pull --all
git pull --tags 태그 정보도 함께 가져오기 git pull --tags
git pull --no-commit 병합하지만 커밋은 생성하지 않음 git pull --no-commit

풀 실전 예시

# 작업 시작 전 최신 코드 받기
git checkout main
git pull origin main

# 개발 브랜치 최신화
git checkout develop
git pull --rebase origin develop

# 충돌 발생 시
git pull origin main
# 충돌 해결 후
git add .
git commit
# 또는 리베이스 중이면
git rebase --continue

# Fast-forward만 허용 (충돌 방지)
git pull --ff-only

# 여러 원격 저장소가 있을 때
git pull upstream main
git pull origin main

9. 페치  |  Fetch

페치는 원격 저장소의 변경사항을 가져오기만 하고 현재 작업에는 영향을 주지 않는 명령어입니다. Pull과 달리 자동으로 병합하지 않으므로 변경사항을 확인한 후 원하는 시점에 병합할 수 있어 더 안전합니다. 여러 브랜치의 상태를 확인하거나 다른 사람의 작업을 미리 검토할 때 유용하며, fetch 후 git diff나 git log로 차이점을 확인할 수 있습니다.

명령어 설명 예시
git fetch 현재 원격의 모든 브랜치 정보 가져오기 git fetch
git fetch <원격> 특정 원격의 브랜치 정보 가져오기 git fetch origin
git fetch <원격> <브랜치> 특정 원격 브랜치만 가져오기 git fetch origin main
git fetch --all 모든 원격 저장소 정보 가져오기 git fetch --all
git fetch --prune 원격에서 삭제된 브랜치를 로컬에서도 제거 git fetch --prune
git fetch -p --prune의 축약형 git fetch -p
git fetch --tags 태그 정보만 가져오기 git fetch --tags
git fetch --dry-run 실제로 가져오지 않고 시뮬레이션 git fetch --dry-run
git fetch <원격> +<브랜치>:<브랜치> 강제로 로컬 브랜치 업데이트 git fetch origin +main:main

페치 활용 예시

# 원격 변경사항 확인
git fetch origin
git log HEAD..origin/main --oneline

# 차이점 상세 확인
git fetch origin
git diff origin/main

# 페치 후 병합
git fetch origin main
git merge origin/main
# 또는
git fetch origin main
git rebase origin/main

# 원격 브랜치를 로컬로 가져오기
git fetch origin
git checkout -b feature origin/feature

# 삭제된 원격 브랜치 정리
git fetch --prune origin
# 또는
git remote prune origin

# 모든 원격 최신화
git fetch --all --prune

10. 비교  |  Diff

diff는 두 버전 또는 파일 간의 차이를 비교하는 명령어입니다. 커밋하기 전에 변경사항을 확인하거나, 브랜치 간 차이를 파악하거나, 특정 파일의 변경 이력을 추적할 때 사용합니다. 출력 결과에서 -로 시작하는 빨간색 줄은 삭제된 내용, +로 시작하는 초록색 줄은 추가된 내용을 나타냅니다. 다양한 옵션을 조합하여 원하는 비교 결과를 얻을 수 있습니다.

명령어 설명 예시
git diff 작업 디렉토리와 스테이징 영역 비교 git diff
git diff <파일> 특정 파일의 변경사항 비교 git diff index.html
git diff --staged 스테이징된 변경사항과 마지막 커밋 비교 git diff --staged
git diff --cached --staged와 동일 git diff --cached
git diff HEAD 작업 디렉토리와 마지막 커밋 비교 git diff HEAD
git diff <커밋> 특정 커밋과 현재 비교 git diff abc123
git diff <커밋1> <커밋2> 두 커밋 간 비교 git diff abc123 def456
git diff <커밋1>..<커밋2> 두 커밋 간 비교 (위와 동일) git diff abc123..def456
git diff <커밋1>...<커밋2> 공통 조상부터 커밋2까지 비교 git diff abc123...def456
git diff <브랜치1> <브랜치2> 두 브랜치 간 비교 git diff main develop
git diff <브랜치> 현재 브랜치와 특정 브랜치 비교 git diff develop
git diff <브랜치1>:<파일> <브랜치2>:<파일> 두 브랜치의 특정 파일 비교 git diff main:src/a.js dev:src/a.js
git diff HEAD~n n개 이전 커밋과 비교 git diff HEAD~3
git diff --stat 변경 통계만 간략하게 표시 git diff --stat
git diff --name-only 변경된 파일 이름만 표시 git diff --name-only
git diff --name-status 파일 이름과 상태(수정/추가/삭제) 표시 git diff --name-status
git diff --color-words 단어 단위로 변경사항 표시 git diff --color-words
git diff --word-diff 단어 단위 diff (다른 스타일) git diff --word-diff
git diff -w 공백 변경 무시 git diff -w
git diff --ignore-all-space 모든 공백 차이 무시 git diff --ignore-all-space

Diff 실전 예시

# 커밋 전 변경사항 확인
git diff

# 스테이징된 내용 확인
git diff --staged

# 특정 파일만 확인
git diff src/main.js

# 브랜치 간 차이 확인 (병합 전)
git diff main..feature

# 통계만 간단히
git diff --stat origin/main

# 변경된 파일 목록만
git diff --name-only HEAD~1

# 두 커밋 간 특정 파일 비교
git diff abc123 def456 -- src/utils.js

# 공백 변경 무시하고 비교
git diff -w

# 단어 단위로 차이 확인 (가독성 향상)
git diff --color-words HEAD~1

11. 작업 취소 및 초기화  |  Reset & Restore

작업 실수를 되돌리거나 특정 시점으로 이동하는 명령어들입니다. Restore는 파일 수준의 변경사항을 취소하고, Reset은 커밋 히스토리를 조작합니다. Reset의 세 가지 모드(--soft, --mixed, --hard)는 각각 다른 수준의 되돌리기를 제공하며, 신중하게 사용해야 합니다. 특히 --hard 옵션은 모든 변경사항을 완전히 삭제하므로 복구가 불가능합니다. 원격에 푸시된 커밋은 Reset 대신 Revert를 사용하는 것이 안전합니다.

명령어 설명 예시
git restore <파일> 파일의 변경사항 취소 (v2.23+) git restore index.html
git restore . 모든 파일의 변경사항 취소 (v2.23+) git restore .
git restore --staged <파일> 파일 언스테이징 (v2.23+) git restore --staged main.js
git restore --staged . 모든 파일 언스테이징 (v2.23+) git restore --staged .
git restore --source=<커밋> <파일> 특정 커밋의 파일로 복원 git restore --source=abc123 file.js
git checkout -- <파일> 파일 변경사항 취소 (구버전) git checkout -- index.html
git checkout HEAD -- <파일> 파일을 마지막 커밋 상태로 복원 git checkout HEAD -- main.js
git reset <파일> 파일 언스테이징 (변경사항 유지) git reset index.html
git reset 모든 파일 언스테이징 git reset
git reset --soft <커밋> 커밋만 취소 (스테이징 유지) git reset --soft HEAD~1
git reset --mixed <커밋> 커밋&스테이징 취소 (파일 유지) git reset --mixed HEAD~1
git reset <커밋> --mixed가 기본값 git reset HEAD~1
git reset --hard <커밋> 커밋&스테이징&파일 모두 취소 git reset --hard HEAD~1
git reset --hard HEAD 모든 변경사항 완전 제거 git reset --hard HEAD
git reset --hard origin/<브랜치> 원격 브랜치 상태로 완전히 되돌리기 git reset --hard origin/main
git reset HEAD~n n개 이전 커밋으로 이동 git reset HEAD~3
git reset <커밋해시> 특정 커밋으로 이동 git reset abc123
git reset --keep <커밋> 로컬 변경사항 유지하며 리셋 git reset --keep HEAD~1
git clean -n 삭제될 미추적 파일 미리보기 git clean -n
git clean -f 미추적 파일 삭제 git clean -f
git clean -fd 미추적 파일과 디렉토리 삭제 git clean -fd
git clean -fdx 무시된 파일까지 모두 삭제 git clean -fdx

Reset 모드 비교

# --soft: 커밋만 취소, 파일과 스테이징은 그대로
git reset --soft HEAD~1
# 결과: 파일 수정사항 그대로, 스테이징도 그대로, 커밋만 취소
# 사용 시나리오: 커밋 메시지를 수정하거나 여러 커밋을 하나로 합칠 때

# --mixed (기본값): 커밋과 스테이징 취소, 파일은 유지
git reset HEAD~1
# 결과: 파일 수정사항 그대로, 스테이징 취소, 커밋 취소
# 사용 시나리오: 커밋을 취소하고 파일을 다시 선택적으로 스테이징할 때

# --hard: 모든 것 완전히 제거
git reset --hard HEAD~1
# 결과: 파일 수정사항 삭제, 스테이징 취소, 커밋 취소
# 사용 시나리오: 모든 변경사항을 버리고 깨끗한 상태로 돌아갈 때 (주의!)

작업 취소 실전 예시

# 작업 중인 파일 변경사항 버리기
git restore index.html
git restore src/

# 모든 변경사항 버리기
git restore .

# 실수로 스테이징한 파일 취소
git restore --staged config.js

# 직전 커밋 취소 (파일은 유지)
git reset HEAD~1

# 직전 커밋 취소 (모든 변경사항 삭제)
git reset --hard HEAD~1

# 특정 커밋으로 완전히 되돌리기
git reset --hard abc123

# 원격과 동일하게 만들기 (로컬 변경사항 모두 삭제)
git fetch origin
git reset --hard origin/main

# 잘못된 병합 취소
git reset --hard HEAD~1
# 또는
git reset --hard ORIG_HEAD

# 미추적 파일 삭제 (빌드 파일 등)
git clean -fd

# 실수로 reset --hard 한 경우 복구
git reflog
git reset --hard <이전_커밋_해시>

12. 되돌리기  |  Revert

Revert는 특정 커밋의 변경사항을 취소하는 새로운 커밋을 생성합니다. Reset과 달리 히스토리를 유지하므로 협업 환경에서 안전하게 사용할 수 있으며, 이미 원격에 푸시된 커밋을 되돌릴 때 사용합니다. Revert는 원본 커밋을 삭제하지 않고 반대 작업을 수행하는 새 커밋을 추가하므로, 변경 이력이 투명하게 유지됩니다. 여러 커밋을 한 번에 되돌리거나 병합 커밋을 되돌릴 때는 특별한 옵션이 필요합니다.

명령어 설명 예시
git revert <커밋> 특정 커밋을 취소하는 새 커밋 생성 git revert abc123
git revert <커밋1> <커밋2> 여러 커밋을 각각 되돌리기 git revert abc123 def456
git revert <커밋1>..<커밋2> 범위의 커밋들을 되돌리기 git revert abc123..def456
git revert HEAD 최신 커밋 되돌리기 git revert HEAD
git revert HEAD~n n개 이전 커밋 되돌리기 git revert HEAD~3
git revert --no-commit <커밋> 되돌리지만 자동 커밋하지 않음 git revert --no-commit abc123
git revert -n <커밋> --no-commit의 축약형 git revert -n abc123
git revert --continue 충돌 해결 후 revert 계속 진행 git revert --continue
git revert --abort Revert 작업 중단 git revert --abort
git revert --skip 현재 커밋을 건너뛰고 다음으로 git revert --skip
git revert -m 1 <병합커밋> 병합 커밋 되돌리기 (첫 번째 부모 유지) git revert -m 1 abc123
git revert --no-edit <커밋> 기본 메시지로 자동 커밋 git revert --no-edit abc123

Revert 실전 예시

# 최신 커밋 되돌리기
git revert HEAD
# 에디터가 열리면 메시지 확인 후 저장

# 특정 커밋 되돌리기
git log --oneline
git revert abc123

# 여러 커밋 한 번에 되돌리기 (각각 커밋 생성)
git revert abc123 def456 ghi789

# 여러 커밋을 하나의 커밋으로 되돌리기
git revert --no-commit abc123
git revert --no-commit def456
git commit -m "Revert multiple commits"

# 병합 커밋 되돌리기
git revert -m 1 <병합커밋해시>
# -m 1: 첫 번째 부모(main)를 유지
# -m 2: 두 번째 부모(feature)를 유지

# Revert 중 충돌 발생 시
git revert abc123
# 충돌 해결 후
git add .
git revert --continue

# Revert 취소하고 원래 상태로
git revert --abort

Reset vs Revert 비교

# Reset (로컬 전용, 히스토리 삭제)
A - B - C - D (HEAD)
git reset --hard B
A - B (HEAD)
# C와 D는 히스토리에서 완전히 사라짐

# Revert (협업 가능, 히스토리 유지)
A - B - C - D (HEAD)
git revert C
A - B - C - D - C' (HEAD)
# C'는 C를 취소하는 새 커밋

# 사용 가이드
로컬 전용 작업: Reset 사용
원격에 푸시된 커밋: Revert 사용
히스토리 유지 필요: Revert 사용
완전히 삭제하고 싶음: Reset 사용 (신중하게!)

13. 임시 저장  |  Stash

Stash는 현재 작업 중인 변경사항을 임시로 저장하고 작업 디렉토리를 깨끗하게 만드는 기능입니다. 긴급한 다른 작업을 위해 브랜치를 전환해야 하지만 현재 작업을 커밋하기에는 너무 불완전할 때 유용합니다. Stash는 스택 구조로 관리되어 여러 작업을 순차적으로 저장할 수 있으며, 나중에 원하는 stash를 선택하여 적용할 수 있습니다. 추적 중인 파일뿐만 아니라 추적되지 않은 파일도 옵션으로 포함할 수 있습니다.

명령어 설명 예시
git stash 현재 작업을 임시 저장 git stash
git stash save "<메시지>" 메시지와 함께 저장 git stash save "작업 중인 로그인 기능"
git stash -m "<메시지>" 메시지와 함께 저장 (축약형) git stash -m "작업 중"
git stash -u 미추적 파일 포함하여 저장 git stash -u
git stash --include-untracked 미추적 파일 포함 (--u와 동일) git stash --include-untracked
git stash -a 무시된 파일까지 모두 저장 git stash -a
git stash --all 무시된 파일까지 저장 (--a와 동일) git stash --all
git stash -k 스테이징된 파일은 유지하고 저장 git stash -k
git stash --keep-index 스테이징 유지 (--k와 동일) git stash --keep-index
git stash list 저장된 stash 목록 확인 git stash list
git stash show 최신 stash의 변경사항 요약 git stash show
git stash show <stash> 특정 stash의 변경사항 요약 git stash show stash@{2}
git stash show -p 최신 stash의 상세 변경내용(diff) git stash show -p
git stash show -p <stash> 특정 stash의 상세 변경내용 git stash show -p stash@{1}
git stash apply 최신 stash 적용 (목록에서 제거 안 함) git stash apply
git stash apply <stash> 특정 stash 적용 git stash apply stash@{2}
git stash pop 최신 stash 적용 후 목록에서 삭제 git stash pop
git stash pop <stash> 특정 stash 적용 후 삭제 git stash pop stash@{1}
git stash drop 최신 stash 삭제 git stash drop
git stash drop <stash> 특정 stash 삭제 git stash drop stash@{3}
git stash clear 모든 stash 삭제 git stash clear
git stash branch <브랜치> Stash를 새 브랜치로 적용 git stash branch new-feature

Stash 실전 예시

# 기본 사용 흐름
git stash                        # 현재 작업 임시 저장
git checkout main                # 다른 브랜치로 전환
# 긴급 작업 수행
git checkout -                   # 원래 브랜치로 복귀
git stash pop                    # 저장한 작업 복원

# 메시지와 함께 저장
git stash save "로그인 기능 50% 완성"

# 여러 stash 관리
git stash list
# stash@{0}: WIP on feature: abc123 작업 중
# stash@{1}: WIP on main: def456 긴급 수정
# stash@{2}: WIP on develop: ghi789 실험

# 특정 stash 확인
git stash show stash@{1}
git stash show -p stash@{1}

# 특정 stash 적용 (목록에 유지)
git stash apply stash@{2}

# 특정 stash 적용 후 삭제
git stash pop stash@{1}

# 미추적 파일 포함 저장
git stash -u

# Stash를 새 브랜치로 전환
git stash branch experimental-feature

# 모든 stash 정리
git stash clear

# Stash 적용 중 충돌 발생 시
git stash pop
# 충돌 해결 후
git add .
# stash는 자동으로 목록에서 제거됨

14. 병합  |  Merge

병합은 두 개 이상의 브랜치를 하나로 합치는 작업입니다. 일반적으로 기능 개발이 완료된 브랜치를 메인 브랜치에 통합할 때 사용합니다. Fast-forward 병합은 선형 히스토리를 유지하며, 3-way 병합은 병합 커밋을 생성합니다. 충돌이 발생하면 수동으로 해결해야 하며, 충돌 마커(<<<<<<<, =======, >>>>>>>)를 제거하고 최종 코드를 선택해야 합니다. 병합 전략을 이해하면 더 효과적으로 협업할 수 있습니다.

명령어 설명 예시
git merge <브랜치> 현재 브랜치에 특정 브랜치 병합 git merge feature
git merge <브랜치> -m "<메시지>" 메시지와 함께 병합 git merge dev -m "Merge dev into main"
git merge --no-ff <브랜치> Fast-forward 가능해도 병합 커밋 생성 git merge --no-ff feature
git merge --ff-only <브랜치> Fast-forward 가능할 때만 병합 git merge --ff-only hotfix
git merge --squash <브랜치> 모든 커밋을 하나로 합쳐서 병합 git merge --squash feature
git merge --no-commit <브랜치> 병합하지만 자동 커밋하지 않음 git merge --no-commit dev
git merge --abort 병합 충돌 시 병합 취소 git merge --abort
git merge --continue 충돌 해결 후 병합 계속 git merge --continue
git merge --strategy <전략> 특정 병합 전략 사용 git merge --strategy ours feature
git merge -X <옵션> 병합 옵션 지정 git merge -X theirs feature
git merge --allow-unrelated-histories 관련 없는 히스토리 병합 허용 git merge --allow-unrelated-histories

병합 충돌 해결

# 충돌 발생 예시
git merge feature
# Auto-merging src/main.js
# CONFLICT (content): Merge conflict in src/main.js
# Automatic merge failed; fix conflicts and then commit the result.

# 충돌 파일 확인
git status
# both modified: src/main.js

# 파일 열어서 충돌 마커 확인
<<<<<<< HEAD (현재 브랜치)
const version = "1.0.0";
=======
const version = "2.0.0";
>>>>>>> feature (병합할 브랜치)

# 충돌 해결 (원하는 코드 선택하고 마커 제거)
const version = "2.0.0";

# 해결된 파일 스테이징
git add src/main.js

# 병합 완료
git commit
# 또는 충돌 해결 중인 경우
git merge --continue

병합 전략

# Fast-forward 병합 (선형 히스토리 유지)
main:    A - B - C
feature:         C - D - E
결과:    A - B - C - D - E (main)

# 3-way 병합 (병합 커밋 생성)
main:    A - B - C -------- M
                  \        /
feature:           D - E -
결과:    A - B - C - M (main)

# --no-ff (항상 병합 커밋 생성)
git merge --no-ff feature
# Fast-forward 가능해도 병합 커밋 생성

# --squash (커밋 압축)
git merge --squash feature
# feature의 모든 커밋을 하나로 합친 변경사항을 스테이징
git commit -m "Merge feature branch"

병합 실전 예시

# 기본 병합 흐름
git checkout main
git pull origin main
git merge feature
git push origin main

# 기능 브랜치 병합 (병합 커밋 생성)
git checkout develop
git merge --no-ff feature/user-profile
git push origin develop

# 충돌 발생 시
git merge feature
# 충돌 해결
git add .
git commit

# 병합 취소
git merge --abort

# 원격 브랜치 병합
git fetch origin
git merge origin/develop

# 여러 브랜치 병합
git merge feature1 feature2 feature3

15. 리베이스  |  Rebase

리베이스는 커밋 히스토리를 재작성하여 선형적이고 깔끔한 히스토리를 만드는 고급 기능입니다. 현재 브랜치의 커밋들을 다른 브랜치의 최신 커밋 위로 순차적으로 재배치합니다. 병합 커밋 없이 히스토리가 일직선으로 유지되므로 로그가 읽기 쉬워집니다. 단, 이미 원격에 푸시된 커밋은 리베이스하지 않는 것이 원칙이며, 로컬 브랜치나 개인 작업에만 사용해야 합니다. 인터랙티브 리베이스를 사용하면 커밋을 수정, 삭제, 합치기, 순서 변경 등을 할 수 있습니다.

명령어 설명 예시
git rebase <브랜치> 현재 브랜치를 대상 브랜치로 리베이스 git rebase main
git rebase <기준> <대상> 대상 브랜치를 기준 브랜치로 리베이스 git rebase main feature
git rebase --continue 충돌 해결 후 리베이스 계속 git rebase --continue
git rebase --skip 현재 커밋 건너뛰고 다음으로 git rebase --skip
git rebase --abort 리베이스 중단하고 원래 상태로 git rebase --abort
git rebase -i <커밋> 인터랙티브 리베이스 시작 git rebase -i HEAD~5
git rebase --interactive <커밋> 인터랙티브 리베이스 (--i와 동일) git rebase --interactive main
git rebase --onto <새기준> <구기준> <대상> 브랜치 기준점 변경 git rebase --onto main dev feature
git rebase --autosquash fixup/squash 커밋 자동 처리 git rebase --autosquash -i HEAD~5
git rebase --root 최초 커밋부터 리베이스 git rebase --root -i
git rebase --exec <명령> 각 커밋 적용 후 명령 실행 git rebase --exec "npm test" main

인터랙티브 리베이스 명령어

# git rebase -i HEAD~5 실행 시 에디터에 표시되는 내용
pick abc123 First commit
pick def456 Second commit
pick ghi789 Third commit
pick jkl012 Fourth commit
pick mno345 Fifth commit

# 사용 가능한 명령어:
# p, pick     = 커밋 사용
# r, reword   = 커밋 사용하지만 메시지 수정
# e, edit     = 커밋 사용하지만 수정 위해 멈춤
# s, squash   = 커밋 사용하지만 이전 커밋과 합침
# f, fixup    = squash와 같지만 메시지 버림
# x, exec     = shell 명령 실행
# b, break    = 여기서 멈춤
# d, drop     = 커밋 제거
# l, label    = 현재 HEAD에 이름 붙이기
# t, reset    = HEAD를 label로 리셋
# m, merge    = 병합 커밋 생성

# 예시: 커밋 합치기
pick abc123 First commit
squash def456 Second commit
squash ghi789 Third commit
pick jkl012 Fourth commit

# 예시: 커밋 메시지 수정
pick abc123 First commit
reword def456 Second commit
pick ghi789 Third commit

# 예시: 커밋 순서 변경
pick ghi789 Third commit
pick abc123 First commit
pick def456 Second commit

# 예시: 커밋 삭제
pick abc123 First commit
drop def456 Second commit
pick ghi789 Third commit

리베이스 실전 예시

# 기본 리베이스 (feature를 main 위로)
git checkout feature
git rebase main
# 충돌 발생 시 해결
git add .
git rebase --continue

# Pull with rebase (깔끔한 히스토리 유지)
git pull --rebase origin main

# 최근 3개 커밋 수정
git rebase -i HEAD~3

# 여러 커밋을 하나로 합치기
git rebase -i HEAD~5
# pick, squash, squash, squash, squash로 변경

# 커밋 메시지 일괄 수정
git rebase -i HEAD~3
# pick을 reword로 변경

# 리베이스 중 문제 발생 시 취소
git rebase --abort

# 원격 브랜치로 리베이스
git fetch origin
git rebase origin/main

# 리베이스 후 강제 푸시 (주의!)
git rebase main
git push --force-with-lease origin feature

Merge vs Rebase 선택 가이드

# Merge 사용 시기:
- 공개된 브랜치에서 작업할 때
- 협업 중인 브랜치에서 작업할 때
- 브랜치 히스토리를 보존하고 싶을 때
- 안전하게 작업하고 싶을 때

# Rebase 사용 시기:
- 개인 로컬 브랜치에서 작업할 때
- 깨끗한 선형 히스토리를 원할 때
- PR 전에 커밋을 정리하고 싶을 때
- 최신 main 브랜치 업데이트를 받을 때

# 황금 규칙:
# 원격에 푸시된 커밋은 리베이스하지 말 것!

16. 태그  |  Tag

태그는 특정 커밋에 의미있는 이름을 붙여 영구적으로 표시하는 기능입니다. 주로 릴리스 버전을 표시할 때 사용하며(v1.0.0, v2.1.3 등), 중요한 마일스톤을 기록합니다. 태그에는 Lightweight 태그와 Annotated 태그 두 가지가 있으며, Annotated 태그는 작성자, 날짜, 메시지 등의 메타데이터를 포함하므로 릴리스용으로 권장됩니다. 태그는 브랜치와 달리 이동하지 않으며, 생성된 커밋에 영구적으로 고정됩니다.

명령어 설명 예시
git tag 모든 태그 목록 확인 git tag
git tag -l "<패턴>" 패턴에 맞는 태그 검색 git tag -l "v1.*"
git tag <태그명> Lightweight 태그 생성 git tag v1.0.0
git tag -a <태그명> Annotated 태그 생성 (에디터로 메시지 작성) git tag -a v1.0.0
git tag -a <태그명> -m "<메시지>" 메시지와 함께 Annotated 태그 생성 git tag -a v1.0.0 -m "Release version 1.0.0"
git tag <태그명> <커밋> 특정 커밋에 태그 생성 git tag v0.9.0 abc123
git tag -a <태그명> <커밋> -m "<메시지>" 특정 커밋에 Annotated 태그 생성 git tag -a v0.9.0 abc123 -m "Beta release"
git show <태그> 태그 정보 및 커밋 내용 확인 git show v1.0.0
git tag -d <태그명> 로컬 태그 삭제 git tag -d v1.0.0
git push <원격> <태그> 특정 태그를 원격에 푸시 git push origin v1.0.0
git push <원격> --tags 모든 태그를 원격에 푸시 git push origin --tags
git push <원격> --delete <태그> 원격 태그 삭제 git push origin --delete v1.0.0
git checkout <태그> 특정 태그로 체크아웃 git checkout v1.0.0
git tag -f <태그> <커밋> 기존 태그를 다른 커밋으로 강제 이동 git tag -f v1.0.0 def456
git tag -n 태그와 첫 줄 메시지 함께 표시 git tag -n
git tag -n9 태그와 9줄 메시지 함께 표시 git tag -n9

태그 실전 예시

# 현재 커밋에 릴리스 태그 생성
git tag -a v1.0.0 -m "Release version 1.0.0"

# 태그 확인
git tag
git show v1.0.0

# 원격에 푸시
git push origin v1.0.0

# 모든 태그 원격에 푸시
git push origin --tags

# 특정 버전 패턴 검색
git tag -l "v2.*"
git tag -l "v1.0.*"

# 과거 커밋에 태그 추가
git log --oneline
git tag -a v0.9.0 abc123 -m "Beta release"

# 태그로 체크아웃 (detached HEAD 상태)
git checkout v1.0.0

# 태그에서 새 브랜치 생성
git checkout -b hotfix-1.0.1 v1.0.0

# 태그 삭제
git tag -d v1.0.0                      # 로컬 삭제
git push origin --delete v1.0.0        # 원격 삭제

# 잘못된 태그 수정 (이동)
git tag -f v1.0.0 def456
git push origin v1.0.0 --force

# Semantic Versioning 예시
git tag -a v1.0.0 -m "Major release"     # 주 버전
git tag -a v1.1.0 -m "Minor update"      # 부 버전
git tag -a v1.1.1 -m "Patch fix"         # 패치 버전
git tag -a v2.0.0-beta.1 -m "Beta release"  # 프리릴리스

Git 저장소 내에서 코드, 커밋 메시지, 작성자 등을 검색하는 다양한 방법들입니다. git grep은 작업 디렉토리에서 텍스트를 빠르게 검색하고, git log의 다양한 옵션으로 커밋 히스토리를 필터링할 수 있습니다. 특정 코드가 언제 추가되거나 삭제되었는지, 특정 버그를 도입한 커밋이 무엇인지 찾는 것이 가능합니다. 이러한 검색 기능은 대규모 프로젝트에서 코드를 추적하고 디버깅할 때 매우 유용합니다.

명령어 설명 예시
git grep "<키워드>" 작업 디렉토리에서 텍스트 검색 git grep "function"
git grep -n "<키워드>" 줄 번호 포함하여 검색 git grep -n "TODO"
git grep -i "<키워드>" 대소문자 구분 없이 검색 git grep -i "error"
git grep -c "<키워드>" 파일별 매칭 수 표시 git grep -c "import"
git grep "<키워드>" <브랜치> 특정 브랜치에서 검색 git grep "API_KEY" main
git grep "<키워드>" <커밋> 특정 커밋에서 검색 git grep "password" abc123
git grep -e "<패턴1>" --and -e "<패턴2>" 두 패턴 모두 포함 git grep -e "login" --and -e "password"
git grep --all-match -e "<패턴1>" -e "<패턴2>" 여러 패턴 중 하나 포함 git grep -e "error" -e "warning"
git log -S "<키워드>" 특정 텍스트를 추가/삭제한 커밋 검색 git log -S "API_KEY"
git log -G "<정규식>" 정규식 패턴 변경 커밋 검색 git log -G "function.*login"
git log --grep="<키워드>" 커밋 메시지에서 키워드 검색 git log --grep="fix"
git log --grep="<키워드>" -i 대소문자 구분 없이 커밋 메시지 검색 git log --grep="bug" -i
git log --author="<이름>" 특정 작성자의 커밋 검색 git log --author="홍길동"
git log --since="<날짜>" 특정 날짜 이후 커밋 검색 git log --since="2024-01-01"
git log --until="<날짜>" 특정 날짜 이전 커밋 검색 git log --until="2024-12-31"
git log -- <파일> 특정 파일의 커밋 히스토리 검색 git log -- src/main.js
git log --all --full-history -- <파일> 삭제된 파일 포함 히스토리 검색 git log --all --full-history -- old.js
git log --diff-filter=D --summary 삭제된 파일 검색 git log --diff-filter=D --summary
git log --diff-filter=A --summary 추가된 파일 검색 git log --diff-filter=A --summary
git bisect start 이진 검색으로 버그 커밋 찾기 시작 git bisect start
git bisect bad 현재 커밋을 나쁜 상태로 표시 git bisect bad
git bisect good <커밋> 특정 커밋을 좋은 상태로 표시 git bisect good abc123

검색 실전 예시

# 코드에서 특정 함수 찾기
git grep "loginUser"
git grep -n "loginUser"  # 줄 번호 포함

# 여러 브랜치에서 검색
git grep "API_KEY" main develop feature/*

# 특정 텍스트가 추가된 커밋 찾기
git log -S "API_KEY" --oneline

# 정규식으로 패턴 변경 찾기
git log -G "function.*login" -p

# 커밋 메시지에서 "bug" 검색
git log --grep="bug" --oneline

# 특정 작성자의 최근 커밋
git log --author="홍길동" -10 --oneline

# 삭제된 파일 찾기
git log --diff-filter=D --summary

# 특정 파일을 마지막으로 수정한 커밋
git log -1 --oneline -- src/config.js

# 두 날짜 사이의 커밋
git log --since="2024-01-01" --until="2024-12-31" --oneline

# 여러 조건 조합
git log --author="홍길동" --grep="feature" --since="1 month ago"

Git Bisect 사용법 (버그 커밋 찾기)

# 이진 검색으로 버그 도입 커밋 찾기
git bisect start                    # 시작
git bisect bad                      # 현재(HEAD)는 버그 있음
git bisect good v1.0.0             # v1.0.0은 정상 작동

# Git이 중간 커밋으로 이동
# 테스트 후 상태 표시
git bisect good    # 정상이면
# 또는
git bisect bad     # 버그 있으면

# 자동으로 다음 커밋으로 이동, 반복
# 버그 커밋을 찾으면 표시됨

# 종료
git bisect reset

# 자동화 (테스트 스크립트 사용)
git bisect start HEAD v1.0.0
git bisect run npm test
# 테스트가 실패하는 커밋을 자동으로 찾아줌

18. 고급 기능  |  Advanced

Git의 고급 기능들은 복잡한 작업을 효율적으로 처리하거나 특수한 상황에 대응할 수 있게 해줍니다. Submodule은 다른 Git 저장소를 서브디렉토리로 포함하고, Cherry-pick은 특정 커밋만 선택적으로 가져오며, Worktree는 하나의 저장소에서 여러 브랜치를 동시에 작업할 수 있게 합니다. 이러한 기능들은 일상적으로 사용하지 않지만, 특정 상황에서 매우 강력한 도구가 됩니다.

명령어 설명 예시
git cherry-pick <커밋> 특정 커밋만 현재 브랜치로 가져오기 git cherry-pick abc123
git cherry-pick <커밋1> <커밋2> 여러 커밋 가져오기 git cherry-pick abc123 def456
git cherry-pick <커밋1>..<커밋2> 범위의 커밋 가져오기 git cherry-pick abc123..def456
git cherry-pick --no-commit <커밋> 커밋하지 않고 체리픽 git cherry-pick --no-commit abc123
git cherry-pick --abort 체리픽 취소 git cherry-pick --abort
git cherry-pick --continue 충돌 해결 후 계속 git cherry-pick --continue
git submodule add <URL> <경로> 서브모듈 추가 git submodule add https://github.com/user/lib.git lib
git submodule init 서브모듈 초기화 git submodule init
git submodule update 서브모듈 업데이트 git submodule update
git submodule update --remote 서브모듈을 최신 커밋으로 업데이트 git submodule update --remote
git clone --recurse-submodules <URL> 서브모듈 포함하여 클론 git clone --recurse-submodules <URL>
git worktree add <경로> <브랜치> 새 작업 트리 추가 git worktree add ../hotfix hotfix-branch
git worktree list 모든 작업 트리 목록 git worktree list
git worktree remove <경로> 작업 트리 제거 git worktree remove ../hotfix
git worktree prune 더 이상 존재하지 않는 작업 트리 정리 git worktree prune
git reflog expire --expire=now --all Reflog 즉시 만료 git reflog expire --expire=now --all
git gc 가비지 컬렉션 (저장소 최적화) git gc
git gc --prune=now 즉시 정리 수행 git gc --prune=now
git fsck 저장소 무결성 검사 git fsck
git archive --format=zip HEAD > project.zip 현재 상태를 ZIP으로 압축 git archive --format=zip HEAD > project.zip
`git archive --format=tar --prefix=project/ HEAD gzip > project.tar.gz` TAR.GZ로 압축

Cherry-pick 실전 예시

# 다른 브랜치의 특정 커밋만 가져오기
git checkout main
git cherry-pick abc123

# 여러 커밋 한 번에 가져오기
git cherry-pick abc123 def456 ghi789

# 커밋 범위 가져오기 (abc123는 제외, def456 포함)
git cherry-pick abc123..def456

# 충돌 발생 시
git cherry-pick abc123
# 충돌 해결 후
git add .
git cherry-pick --continue

# 체리픽 취소
git cherry-pick --abort

# 자동 커밋하지 않고 체리픽 (수정 후 커밋)
git cherry-pick --no-commit abc123
# 수정 작업
git commit -m "Cherry-picked and modified abc123"

Submodule 사용법

# 서브모듈 추가
git submodule add https://github.com/user/library.git libs/library

# 서브모듈 포함하여 클론
git clone --recurse-submodules https://github.com/user/project.git

# 기존 프로젝트에서 서브모듈 초기화
git submodule init
git submodule update

# 서브모듈 업데이트
git submodule update --remote

# 모든 서브모듈을 최신으로
git submodule update --remote --merge

# 서브모듈 제거
git submodule deinit libs/library
git rm libs/library
rm -rf .git/modules/libs/library

Worktree 활용

# 동일한 저장소에서 여러 브랜치 동시 작업
# 메인 저장소
cd ~/project

# 긴급 수정을 위한 별도 작업 트리 생성
git worktree add ../project-hotfix hotfix-1.2.3
cd ../project-hotfix
# 여기서 hotfix 작업

# 원래 디렉토리는 그대로 feature 작업 계속
cd ~/project
# 여기서 feature 작업

# 작업 트리 목록
git worktree list

# 작업 완료 후 제거
git worktree remove ../project-hotfix

# 남아있는 불필요한 작업 트리 정리
git worktree prune

19. 구성 및 최적화  |  Configuration & Optimization

Git의 동작 방식을 세밀하게 조정하고 성능을 최적화하는 명령어들입니다. 전역 설정은 모든 저장소에 적용되고, 로컬 설정은 현재 저장소에만 적용됩니다. 저장소가 커질수록 가비지 컬렉션과 최적화가 중요해지며, 정기적인 유지보수로 성능을 개선할 수 있습니다. 에디터, diff 도구, 병합 도구 등을 자신의 환경에 맞게 설정하면 작업 효율이 크게 향상됩니다.

# 사용자 정보 설정
git config --global user.name "홍길동"
git config --global user.email "hong@example.com"

# 에디터 설정
git config --global core.editor "code --wait"     # VS Code
git config --global core.editor "vim"              # Vim
git config --global core.editor "nano"             # Nano

# Diff 도구 설정
git config --global diff.tool vimdiff
git config --global merge.tool vimdiff

# 색상 설정
git config --global color.ui auto
git config --global color.branch auto
git config --global color.diff auto
git config --global color.status auto

# 별칭 설정
git config --global alias.co checkout
git config --global alias.br branch
git config --global alias.ci commit
git config --global alias.st status
git config --global alias.unstage 'reset HEAD --'
git config --global alias.last 'log -1 HEAD'
git config --global alias.visual 'log --all --graph --decorate --oneline'

# Push 기본 동작 설정
git config --global push.default simple
git config --global push.followTags true

# Pull 기본 동작 설정
git config --global pull.rebase true
git config --global pull.ff only

# 인증 정보 캐싱 (비밀번호 저장)
git config --global credential.helper cache         # 메모리에 15분간 저장
git config --global credential.helper 'cache --timeout=3600'  # 1시간
git config --global credential.helper store         # 디스크에 평문 저장 (주의)
git config --global credential.helper osxkeychain   # macOS Keychain
git config --global credential.helper wincred       # Windows Credential Manager

# 성능 최적화
git config --global core.preloadindex true
git config --global core.fscache true
git config --global gc.auto 256

# 파일 크기 경고
git config --global core.bigFileThreshold 100m

# 가비지 컬렉션 및 최적화
git gc                          # 수동 가비지 컬렉션
git gc --aggressive            # 공격적 최적화 (느리지만 효과적)
git gc --auto                  # 필요시에만 자동 실행

# 저장소 최적화
git repack -a -d --depth=250 --window=250

# 저장소 크기 확인
git count-objects -vH

# 무결성 검사
git fsck --full

# 구성 파일 위치
# ~/.gitconfig              전역 설정
# .git/config               로컬 설정 (저장소별)
# /etc/gitconfig            시스템 설정

# 구성 확인
git config --list                    # 모든 설정
git config --global --list           # 전역 설정만
git config user.name                 # 특정 설정 값

# 구성 삭제
git config --global --unset user.name

20.  .gitignore 패턴

.gitignore 파일은 Git이 무시할 파일과 디렉토리를 지정합니다. 버전 관리가 필요 없는 파일들을 자동으로 제외하여 저장소를 깔끔하게 유지합니다.

# .gitignore 파일 작성 규칙

# 1. 특정 파일 무시
config.ini
secret.txt

# 2. 특정 확장자 무시
*.log
*.tmp
*.cache

# 3. 디렉토리 무시 (끝에 슬래시)
node_modules/
dist/
build/
.cache/

# 4. 특정 위치의 파일만 무시
/TODO.txt          # 루트의 TODO.txt만
src/temp.js        # src/temp.js만

# 5. 패턴 사용
*.log              # 모든 .log 파일
!important.log     # important.log는 예외 (추적함)

# 6. 모든 하위 디렉토리의 특정 파일
**/logs            # 모든 logs 디렉토리
**/node_modules    # 모든 node_modules

# 7. 주석
# 이것은 주석입니다

# 8. 실전 예시 - Node.js 프로젝트
node_modules/
npm-debug.log*
yarn-debug.log*
yarn-error.log*
.pnpm-debug.log*

# 환경 변수
.env
.env.local
.env.*.local

# 빌드 결과물
dist/
build/
out/
.next/
.nuxt/

# 에디터/IDE
.vscode/
.idea/
*.swp
*.swo
*~

# 운영체제
.DS_Store
Thumbs.db
desktop.ini

# 테스트 커버리지
coverage/
.nyc_output/

# 로그
logs/
*.log

# 9. 실전 예시 - Python 프로젝트
__pycache__/
*.py[cod]
*$py.class
*.so

# 가상환경
venv/
env/
ENV/
.venv

# 배포
*.egg-info/
dist/
build/

# Jupyter Notebook
.ipynb_checkpoints

# 10. 실전 예시 - Java 프로젝트
*.class
*.jar
*.war
*.ear

# Maven
target/
pom.xml.tag
pom.xml.releaseBackup

# Gradle
.gradle/
build/

# IntelliJ IDEA
.idea/
*.iml
*.iws

# Eclipse
.classpath
.project
.settings/

# 11. 전역 gitignore 설정
# ~/.gitignore_global 파일 생성 후
git config --global core.excludesfile ~/.gitignore_global

21. 자주 사용하는 실전 시나리오

실무에서 자주 마주치는 상황들과 해결 방법을 정리했습니다.

시나리오 1 : 잘못된 파일을 커밋한 경우

# 방법 1: 직전 커밋에서 파일만 제거
git rm --cached 파일명
git commit --amend --no-edit

# 방법 2: 파일을 .gitignore에 추가하고 제거
echo "secret.txt" >> .gitignore
git rm --cached secret.txt
git add .gitignore
git commit -m "Remove secret file and add to gitignore"

시나리오 2 : 잘못된 브랜치에서 작업한 경우

# 아직 커밋하지 않은 경우
git stash
git checkout correct-branch
git stash pop

# 이미 커밋한 경우
git log -1  # 커밋 해시 확인
git checkout correct-branch
git cherry-pick <커밋해시>
git checkout wrong-branch
git reset --hard HEAD~1

시나리오 3 : 여러 커밋을 하나로 합치기

# 최근 3개 커밋을 하나로
git rebase -i HEAD~3
# pick, squash, squash로 변경하고 저장

# 또는 soft reset 사용
git reset --soft HEAD~3
git commit -m "Combined commit message"

시나리오 4 : 특정 파일의 변경사항만 되돌리기

# 특정 파일을 이전 커밋 상태로
git checkout HEAD~2 -- src/config.js
git commit -m "Revert config.js to 2 commits ago"

# 또는 restore 사용 (Git 2.23+)
git restore --source=HEAD~2 src/config.js
git commit -m "Revert config.js"

시나리오 5 : 원격의 강제 푸시 받기

# 다른 사람이 강제 푸시한 경우
git fetch origin
git reset --hard origin/main
# 주의: 로컬 변경사항 모두 삭제됨!

# 로컬 변경사항 백업 후 받기
git stash
git fetch origin
git reset --hard origin/main
git stash pop

시나리오 6 : 실수로 삭제한 브랜치 복구

# reflog에서 브랜치의 마지막 커밋 찾기
git reflog
# 출력에서 삭제된 브랜치의 해시 확인

# 브랜치 재생성
git checkout -b recovered-branch <해시>

시나리오 7 : 대용량 파일 히스토리에서 제거

# BFG Repo-Cleaner 사용 (권장)
# https://rtyley.github.io/bfg-repo-cleaner/
bfg --delete-files large-file.zip
git reflog expire --expire=now --all
git gc --prune=now --aggressive

# 또는 git filter-branch (느림)
git filter-branch --force --index-filter \
  'git rm --cached --ignore-unmatch path/to/large-file.zip' \
  --prune-empty --tag-name-filter cat -- --all

시나리오 8 : 다른 저장소의 히스토리 가져오기

# 원격 추가
git remote add other-repo https://github.com/user/other-repo.git
git fetch other-repo

# 관련 없는 히스토리 병합 허용
git merge other-repo/main --allow-unrelated-histories

시나리오 9 : 특정 커밋 사이의 변경사항 적용

# 커밋 A부터 B까지의 변경사항을 현재 브랜치에 적용
git cherry-pick A^..B

시나리오 10 : 로컬과 원격이 완전히 달라진 경우

# 원격을 완전히 따라가기 (로컬 삭제)
git fetch origin
git reset --hard origin/main

# 또는 로컬을 강제로 원격에 푸시
git push origin main --force-with-lease
# 주의: 팀원과 협의 필수!

22. 팁과 모범 사례

커밋 메시지 작성 팁

# 좋은 커밋 메시지 형식
<type>: <subject>

<body>

<footer>

# Type 예시
feat: 새로운 기능 추가
fix: 버그 수정
docs: 문서 수정
style: 코드 포맷팅 (기능 변경 없음)
refactor: 코드 리팩토링
test: 테스트 추가/수정
chore: 빌드 작업, 패키지 관리
perf: 성능 개선
ci: CI 설정 수정

# 좋은 예
feat: 사용자 프로필 이미지 업로드 기능 추가

- 이미지 크기 최대 5MB 제한
- JPG, PNG 형식만 허용
- S3에 업로드 후 URL 반환

Closes #123

# 나쁜 예
fix bug        # 너무 모호함
작업완료       # 구체성 부족
.              # 의미 없음

브랜치 전략

# Git Flow
main        - 프로덕션 배포
develop     - 개발 통합
feature/*   - 새 기능
release/*   - 릴리스 준비
hotfix/*    - 긴급 수정

# GitHub Flow (더 단순함)
main        - 항상 배포 가능한 상태
feature/*   - 모든 작업은 feature 브랜치에서

# 브랜치 명명 규칙
feature/user-authentication
feature/payment-integration
bugfix/login-error
hotfix/security-patch
release/v1.2.0

작업 흐름 권장사항

# 1. 작업 시작 전 항상 최신 코드 받기
git checkout main
git pull origin main

# 2. 새 브랜치 생성
git checkout -b feature/new-feature

# 3. 작업 단위로 커밋
git add 관련된_파일들
git commit -m "의미있는 메시지"

# 4. 정기적으로 원격에 푸시 (백업)
git push -u origin feature/new-feature

# 5. PR 전 최신 main 반영
git checkout main
git pull origin main
git checkout feature/new-feature
git rebase main

# 6. 충돌 해결 후 강제 푸시
git push --force-with-lease

# 7. PR 생성 및 리뷰

# 8. 병합 후 브랜치 정리
git branch -d feature/new-feature
git push origin --delete feature/new-feature

 


Git 사용을 위한 최고의 레퍼런스를 위하여

이 Git 명령어 가이드는 초보 개발자부터 숙련된 개발자까지 참조할 수 있는 완벽한 레퍼런스를 목표로 작성되었습니다. Git은 처음에는 복잡해 보이지만, 기본 명령어부터 천천히 익히다 보면 강력한 도구가 됩니다. 모든 명령어를 외울 필요는 없으며, 필요할 때마다 이 문서를 참조하시면 됩니다. 실수를 두려워하지 마세요. Git은 거의 모든 작업을 되돌릴 수 있으며, reflog를 통해 대부분의 실수를 복구할 수 있습니다. 지속적인 연습과 실전 경험을 통해 Git 마스터가 되시길 바랍니다!

추가 학습 자료