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

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" # 프리릴리스
17. 검색 및 찾기 | Search
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 마스터가 되시길 바랍니다!
추가 학습 자료
- 공식 문서: https://git-scm.com/doc
- Pro Git 책 (무료): https://git-scm.com/book/ko/v2
- GitHub Learning Lab: https://lab.github.com
- Git 시각화 도구: https://git-school.github.io/visualizing-git
'AI 코딩' 카테고리의 다른 글
| [개발환경] homebrew를 활용한 python버전 전환 (8) | 2025.10.30 |
|---|---|
| Docker vs Podman 컨테이너 기술의 진화 (8) | 2025.10.29 |
| vi/vim 명령어 참조 사전 (0) | 2025.10.24 |
| MacOS에서 SQLite설치부터 활용까지 - 데이터베이스 (2) | 2025.10.22 |
| [개발환경] MacOS에서 Iptime VPN에 연결하는 방법 (6) | 2025.10.20 |