Git 핵심 명령어 모음
버전 관리 시스템(VCS) Git에서 주로 사용하는 명령을 빠르게 정리합니다.
# 구성 (Config)
구성(Config)은 운영체제 단위의 Git 환경 설정입니다.
개행 문자(Newline) 구성은 Windows와 Unix 계열 운영체제(macOS) 간의 줄바굼 호환성 문제를 방지하기 위한 설정입니다.
이름과 이메일은 버전 생성 시 작성자 정보를 표시하기 위함으로, GitHub 등의 서비스 사용자 정보와 달라도 무방하나 되도록 같게 작성하는 것이 좋습니다.
| 명령 | 설명 |
|---|---|
git -v |
Git 버전 확인 |
git config --global core.autocrlf input |
개행 문자 설정 (macOS) |
git config --global core.autocrlf true |
개행 문자 설정 (Windows) |
git config --global user.name '<이름>' |
사용자 이름 설정 |
git config --global user.email '<이메일>' |
사용자 이메일 설정 |
git config --global init.defaultBranch main |
Git v2.28 미만인 경우, 메인 브랜치 이름을 main으로 설정 |
git config --global pull.rebase true |
pull 명령어 실행 시 리베이스를 기본 동작으로 설정 (선택) |
git config --global --list |
구성 목록 확인 |
git config --global --unset <항목이름> |
구성 항목 삭제 |
git config --global --unset-all <항목이름> |
중복 구성 항목 삭제 |
1vim ~/.gitconfig
# 초기화 (Init)
초기화(Init)는 프로젝트 단위로 Git 버전 관리를 시작하는 기능입니다.
원격 별칭(Remote Alias)은 원격 저장소를 지칭하는 이름으로, 단일 원격인 경우 origin을 사용하는 것을 추천합니다.
| 명령 | 설명 | 예시 |
|---|---|---|
git init |
프로젝트 버전 관리 시작 | |
git remote |
원격 저장소 목록 확인 | |
git remote -v |
원격 저장소 URL 확인 | |
git remote add <원격별칭> <URL> |
원격 저장소 추가 | git remote add origin https://github.com/ParkYoungWoong/heropy.git |
git clone <URL> |
원격 저장소 복제 | git clone https://github.com/ParkYoungWoong/heropy.git |
rm -rf .git |
버전 관리 초기화 (macOS) | |
rd /s /q .git |
버전 관리 초기화 (Windows CMD) | |
Remove-Item -Recurse -Force .git |
버전 관리 초기화 (Windows Powershell) |
# 추적 (Track)
추적(Track)은 버전을 관리할 대상(파일)을 지정하는 것을 말합니다.
스테이징(Staging)은 추적 파일을 버전 생성을 위해 준비하는 것을 말합니다.
| 명령 | 설명 | 예시 |
|---|---|---|
git status |
현재 브랜치의 변경사항 확인 | |
git add <파일> |
특정 파일 추적 및 스테이징 | git add ./src/main.js |
git add . |
모든 파일 추적 및 스테이징 | |
git mv <파일A> <파일B> |
스테이징된 파일 이름 변경 | git mv ./mnin.js ./main.js |
git rm -r --cached <파일> |
추적 목록에서 제거 (.gitignore 갱신) |
git rm -r --cached ./src |
git clean -fdn |
삭제 가능한 추적되지 않은 파일 목록 확인 | |
git clean -fd |
추적되지 않은 파일 삭제 | |
git restore --staged <파일> |
특정 파일 언스테이징 (v2.23) | git restore --staged ./src/main.js |
git restore --staged . |
모든 파일 언스테이징 (v2.23) |
# 버전 생성 (Commit)
버전 생성(Commit)은 현재 작업 내용을 하나의 버전으로 기록(생성)하는 것을 말합니다.
| 명령 | 설명 |
|---|---|
git commit -m '<메시지>' |
버전 생성 (따옴표 닫기 전에는 메시지 줄바꿈 가능) |
git commit -am '<메시지>' |
추적 파일 스테이징 및 버전 생성 |
git commit > i > 메시지 입력 > esc > :wq |
Vim 에디터로 메시지 작성 및 버전 생성 |
git commit --amend |
직전 커밋을 현재 커밋으로 덮어쓰기, Empty Commit (이후 강력(-f) 푸시 필요) |
git commit --amend -m '<메시지>' |
직전 커밋 메시지를 수정 (이후 강력(-f) 푸시 필요) |
gut add <누락파일>git commit --amend --no-edit |
직전 커밋에 현재 스테이징된 변경 사항을 추가, 메시지 유지 (이후 강력(-f) 푸시 필요) |
# 확인 (Log)
확인(Log)은 생성한 버전 내용이나 내역, 변경 사항, 작업자 등을 확인하는 것을 말합니다.
| 명령 | 설명 | 예시 |
|---|---|---|
git log |
현재 브랜치의 버전 내역을 확인 | |
git log -<숫자> |
숫자만큼만 최신 버전 내역 확인 | git log -2 |
git log --all |
모든 브랜치 내역 확인 | |
git log --oneline |
간략한 버전 내역 확인 | |
git log --graph |
그래프 형태로 버전 내역 확인 | |
git reflog |
로컬의 모든 버전 관리 내역 확인 | |
git show |
현재 브랜치의 최신 버전 확인 | |
git show <브랜치> |
특정 브랜치의 최신 버전 확인 | git show dev |
git show <해시> |
특정 버전 확인 | git show 1a2b3c4d |
git blame <파일> |
특정 파일의 작업자 확인 | git blame ./src/main.js |
git blame -L <시작>,<종료> <파일> |
특정 파일의 시작부터 종료 줄까지 작업자 확인 | git blame -L 10,20 ./src/main.js |
git blame -L <시작> <파일> |
특정 파일의 시작부터 마지막 줄까지 작업자 확인 | git blame -L 10 ./src/main.js |
git blame -L ,<종료> <파일> |
특정 파일의 처음부터 종료 줄까지 작업자 확인 | git blame -L ,20 ./src/main.js |
git branch --show-current |
현재 브랜치 이름 확인 (v2.22) |
# 브랜치 (Branch)
브랜치(Branch)는 프로젝트에서 여러 작업을 나눠 병렬로 진행할 수 있는, 버전 관리의 각 분기점을 의미합니다.
| 명령 | 설명 | 예시 |
|---|---|---|
git branch |
로컬 브랜치 목록 확인 | |
git branch -r |
원격 브랜치 목록 확인 | |
git branch -a |
로컬 및 원격 브랜치 목록 확인 | |
git branch -vv |
로컬 브랜치와 연결된 업스트림(원격 브랜치) 정보 확인 | |
git branch <브랜치> |
브랜치 생성 | git branch dev |
git branch -D <브랜치> |
브랜치 삭제 | git branch -D dev |
git branch -d <브랜치> |
병합 완료된 브랜치 삭제 (안전한 삭제) | git branch -d dev |
git branch -m <브랜치> |
현재 브랜치 이름 변경 | git branch -m main |
git branch -m <이전브랜치> <새브랜치> |
특정 브랜치 이름 변경 | git branch -m master main |
git branch --show-current |
현재 브랜치 이름 확인 (v2.22) | |
git checkout <브랜치> |
브랜치 전환 | git checkout dev |
git checkout -b <브랜치> |
브랜치 생성 및 전환 | git checkout -b dev |
git checkout <해시> |
특정 버전 체크아웃 | git checkout 1a2b3c4d |
git switch <브랜치> |
브랜치 전환 (v2.23) | git switch dev |
git swtich -c <브랜치> |
브랜치 생성 및 전환 (v2.23) | git switch -c dev |
# 밀어내기 (Push)
밀어내기(Push)는 로컬 저장소의 버전 내역을 원격 저장소로 업로드하는 기능입니다.
강제 플래그(--force, -f)는 충돌을 무시하고 원격 저장소를 덮어쓰므로, 확실한 경우에만 사용해야 합니다.
| 명령 | 설명 | 예시 |
|---|---|---|
git push <원격별칭> <브랜치> |
원격 저장소로 밀어내기 | git push origin dev |
git push <원격별칭> --all |
원격 저장소로 모든 브랜치 밀어내기 | git push origin --all |
git push <원격별칭> <브랜치> -f |
원격 저장소로 강제(Force) 밀어내기 | git push origin dev -f |
git push <원격별칭> <브랜치> -u |
원격 저장소로 밀어내기 후 생략 가능 | git push origin dev -u 이후 git push |
# 당겨오기 (Pull)
당겨오기(Pull)는 원격 저장소의 버전 내역을 로컬 저장소로 다운로드하는 기능입니다.
| 명령 | 설명 | 예시 |
|---|---|---|
git pull <원격별칭> <브랜치> |
원격 저장소에서 브랜치 당겨오기 | git pull origin dev |
git pull --rebase <원격별칭> <브랜치> |
원격 저장소의 브랜치로 로컬 브랜치 덮어쓰기 | git pull --rebase origin dev |
# 가져오기 (Fetch)
가져오기(Fetch)는 원격 저장소의 최신 내역을 로컬의 원격 내역과 동기화하는 기능으로, 로컬 브랜치에는 영향을 주지 않습니다.
| 명령 | 설명 | 예시 |
|---|---|---|
git fetch |
현재 원격 저장소의 브랜치 목록 가져오기 | |
git fetch <원격별칭> |
특정 원격 저장소의 브랜치 목록 가져오기 | git fetch origin |
git fetch --all |
모든 원격 저장소의 브랜치 목록 가져오기 | |
git fetch --prune |
원격 저장소에서 브랜치 목록 가져와서 로컬의 원격 브랜치 목록 덮어쓰기 |
# 비교 (Diff)
비교(Diff)는 두 개의 버전이나 파일 등의 차이를 서로 비교하는 기능입니다.
| 명령 | 설명 | 예시 |
|---|---|---|
git diff <파일> |
파일의 수정 내용 확인 | |
git diff <파일A> <파일B> |
A와 B 파일 비교 | |
git diff <브랜치> |
특정 브랜치와 현재 브랜치 비교 | git diff dev |
git diff <브랜치A> <브랜치B> |
A와 B 브랜치 비교 | git diff main dev |
git diff <브랜치A>:<파일> <브랜치B>:<파일> |
A와 B 브랜치의 파일 비교 | git diff main:src/main.js dev:src/main.js |
git diff <해시> |
현재 버전과 특정 버전 비교 | git diff 1a2b3c4d |
git diff <해시A> <해시B> |
A와 B 버전 비교 | git diff 1a2b3c4d 5e6f7g8h |
# 작업 취소 (Rollback)
롤백(Rollback)은 현재 작업 중인 변경 사항을 모두 취소하고 버리는 것을 말합니다.
| 명령 | 설명 | 예시 |
|---|---|---|
git checkout HEAD -- <파일> |
특정 파일 롤백 | git checkout HEAD -- ./src/main.js |
git restore <파일> |
특정 파일 롤백 (v2.23) | git restore ./src/main.js |
git restore . |
모든 파일 롤백 (v2.23) | |
git reset --hard HEAD |
모든 파일 롤백 |
# 초기화 (Reset)
초기화(Reset)는 특정 버전으로 이동하고 그 이후 버전 내역을 제거하는 기능입니다.
| 명령 | 설명 | 예시 |
|---|---|---|
git reset --hard HEAD~<번호> |
번호만큼 이전 버전으로 리셋 | git reset --hard HEAD~2 |
git reset --hard HEAD~1 |
직전 버전으로 리셋 (1 버전 전으로) |
|
git reset --hard HEAD~ |
직전 버전으로 리셋 (1 생략) |
|
git reset --hard <해시> |
특정 버전으로 리셋 | git reset --hard 1a2b3c4d |
git reset --hard HEAD^ |
마지막 버전을 삭제 | |
git reset --hard |
수정 내용을 버림 | |
git reset --soft |
수정 내용을 스테이징 | |
git reset --mixed |
수정 내용을 스테이징하지 않음 |
# 되돌리기 (Revert)
되돌리기(Revert)는 특정 버전을 취소하고 취소한 새로운 버전을 생성하는 기능입니다.
| 명령 | 설명 | 예시 |
|---|---|---|
git revert <해시> |
특정 버전을 취소하고 새로운 버전 생성 | git revert 1a2b3c4d |
# 임시 저장 (Stash)
임시 저장(Stash)는 작업 중인 변경사항을 버전으로 생성하지 않고 별도로 저장하는 기능입니다.
| 명령 | 설명 | 예시 |
|---|---|---|
git stash list |
임시 저장된 작업 목록 확인 | |
git stash |
현재 작업을 임시 저장 | |
git stash -a |
미추적 파일 포함, 임시 저장 | |
git stash -m '<메시지>' |
메시지와 함께 현재 작업을 임시 저장 | |
git stash -am '<메시지>' |
미추적 파일 포함, 메시지와 함께 현재 작업을 임시 저장 | |
git stash show <번호> |
특정 번호의 임시 저장 내용 보기 | git stash show 2 |
git stash apply |
가장 최신의 임시 저장 내용을 현재 브랜치에 적용 | |
git stash apply <번호> |
특정 번호의 임시 저장 내용을 현재 브랜치에 적용 | git stash apply 2 |
git stash drop |
가장 최신의 임시 저장 내용 삭제 | |
git stash drop <번호> |
특정 번호의 임시 저장 내용 삭제 | git stash drop 2 |
git stash pop |
가장 최신의 임시 저장을 적용하고 목록에서 삭제 | |
git stash clean |
모든 임시 저장 목록 삭제 |
# 병합 (Merge)
병합(Merge)은 두 개의 브랜치를 하나로 합치는 기능입니다.
| 명령 | 설명 | 예시 |
|---|---|---|
git merge <브랜치> |
현재 브랜치에 특정 브랜치 병합 | git merge dev |
git merge --abort |
충돌 시, 병합 과정 중단 |
병합을 통해 두 브랜치의 내용이 달라 충돌(Conflict)이 발생하는 경우, 충돌을 해결하고 다시 커밋해야 합니다.
'현재 변경 사항'은 현재 브랜치(main)의 작업 내용, '수신 변경 사항'은 병합할 브랜치(dev)의 작업 내용을 의미합니다.
충돌 해결 후 수정된 파일을 스태이징(git add)하고 병합 버전을 생성(git commit)해야 합니다.
12345<<<<<< HEAD (현재 변경 사항) main / abc ======= dev / xyz >>>>>> dev (수신 변경 사항)
# 재배치 (Rebase)
재배치(Rebase)는 현재 브랜치의 내역을 대상 브랜치의 최신 버전 다음으로 배치(이동)하는 기능입니다.
123(main)-- A - B - C \ (dev)----- D - E
1(main)-- A - B - C - D - E
| 명령 | 설명 | 예시 |
|---|---|---|
git rebase <브랜치> |
현재 브랜치를 대상 브랜치로 재배치 | git rebase main |
git rebase --continue |
재배치 계속 진행 | |
git rebase --abort |
재배치 과정 중단 |
다음은 dev 브랜치를 main 브랜치로 재배치하는 과정입니다.
git checkout dev: 재배치할 브랜치로 전환.git rebase main: 현재 브랜치(dev)를 대상 브랜치(main)로 재배치 시작.- 충돌(Conflict) 발생 시 해결.
git add .: 충돌 해결 후 스테이징.git rebase --continue: 재배치 계속 진행.- 버전 메시지 수정 및 저장(
:wq). - 3~6번 과정 반복 및 재배치 완료!
# 선별 적용 (Cherry-pick)
선별 적용(Cherry-pick)은 다른 브랜치의 특정 버전(커밋)을 현재 브랜치에 선택적으로 적용하는 기능입니다.
브랜치 전체를 병합하지 않고, 필요한 버전만 가져올 때 유용합니다.
| 명령 | 설명 | 예시 |
|---|---|---|
git cherry-pick <해시> |
특정 버전을 현재 브랜치에 적용 | git cherry-pick 1a2b3c4d |
git cherry-pick <해시A> <해시B> |
여러 버전을 현재 브랜치에 적용 | git cherry-pick 1a2b3c4d 5e6f7g8h |
git cherry-pick <해시A>..<해시B> |
A 이후부터 B까지의 버전을 적용 (A 미포함) | git cherry-pick 1a2b3c4d..5e6f7g8h |
git cherry-pick --no-commit <해시> |
커밋 없이 변경 사항만 적용 | git cherry-pick --no-commit 1a2b3c4d |
git cherry-pick --continue |
충돌 해결 후 체리픽 계속 진행 | |
git cherry-pick --abort |
체리픽 과정 중단 |
# 별칭 (Alias)
별칭(Alias)은 자주 사용하는 Git 명령을 짧은 이름으로 등록하여 사용하는 기능입니다.
| 명령 | 설명 | 예시 |
|---|---|---|
git config --global alias.<별칭> '<명령>' |
별칭 등록 | git config --global alias.co 'checkout' |
git config --global --unset alias.<별칭> |
별칭 삭제 | git config --global --unset alias.co |
git config --global --get-regexp alias |
등록된 별칭 목록 확인 |
12345git 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.lg 'log --oneline --graph --all'
12345git co dev # git checkout dev git br -a # git branch -a git ci -m '메시지' # git commit -m '메시지' git st # git status git lg # git log --oneline --graph --all
# 태그 (Tag)
태그(Tag)는 특정 버전에 이름을 붙여 표시하는 기능으로, 주로 릴리스 버전을 관리할 때 사용합니다.
경량(Lightweight) 태그는 단순히 이름만 붙이고, 주석(Annotated) 태그는 작성자, 날짜, 메시지 등의 정보를 함께 기록합니다.
| 명령 | 설명 | 예시 |
|---|---|---|
git tag |
태그 목록 확인 | |
git tag -l '<패턴>' |
패턴과 일치하는 태그 목록 확인 | git tag -l 'v1.*' |
git tag <태그> |
경량 태그 생성 | git tag v1.0.0 |
git tag -a <태그> -m '<메시지>' |
주석 태그 생성 | git tag -a v1.0.0 -m '첫 번째 릴리스' |
git tag <태그> <해시> |
특정 버전에 태그 생성 | git tag v1.0.0 1a2b3c4d |
git tag -d <태그> |
태그 삭제 | git tag -d v1.0.0 |
git show <태그> |
태그 정보 확인 | git show 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 |
경량 태그는 특정 버전을 단순히 가리키는 포인터로, 별도의 정보 없이 이름만 생성됩니다.
12345git tag v1.0.0 git show v1.0.0 # commit 1a2b3c4d5e6f7g8h9i0j1k2l3m4n5o6p7q8r9s0t # Author: Heropy <thesecon@gmail.com> # Date: Mon Apr 22 09:00:00 2024 +0900
주석 태그는 태그 자체에 작성자, 날짜, 메시지 등의 메타 정보를 포함하며, 릴리스 태그에는 주석 태그를 권장합니다.
1234567891011git tag -a v1.0.0 -m '첫 번째 릴리스' git show v1.0.0 # tag v1.0.0 # Tagger: Heropy <thesecon@gmail.com> # Date: Mon Apr 22 09:00:00 2024 +0900 # # 첫 번째 릴리스 # # commit 1a2b3c4d5e6f7g8h9i0j1k2l3m4n5o6p7q8r9s0t # Author: Heropy <thesecon@gmail.com> # Date: Mon Apr 22 09:00:00 2024 +0900
# 서브모듈 (Submodule)
서브모듈(Submodule)은 하나의 Git 저장소 안에 다른 Git 저장소를 하위 디렉토리로 포함하여 관리하는 기능입니다.
공통 라이브러리나 외부 프로젝트를 독립적인 버전 관리를 유지하면서 참조할 때 유용합니다.
| 명령 | 설명 | 예시 |
|---|---|---|
git submodule add <URL> |
서브모듈 추가 | git submodule add https://github.com/user/lib.git |
git submodule add <URL> <경로> |
특정 경로에 서브모듈 추가 | git submodule add https://github.com/user/lib.git ./libs/lib |
git submodule init |
서브모듈 초기화 (.gitmodules 정보를 로컬 설정에 등록) |
|
git submodule update |
서브모듈을 등록된 버전으로 업데이트 | |
git submodule update --init |
초기화 및 업데이트를 한 번에 실행 | |
git submodule update --init --recursive |
중첩된 서브모듈까지 초기화 및 업데이트 | |
git submodule update --remote |
서브모듈을 원격의 최신 버전으로 업데이트 | |
git submodule status |
서브모듈 상태 확인 | |
git submodule foreach '<명령>' |
모든 서브모듈에서 명령 실행 | git submodule foreach 'git pull origin main' |
git clone --recurse-submodules <URL> |
서브모듈을 포함하여 저장소 복제 | git clone --recurse-submodules https://github.com/user/project.git |
git submodule deinit <경로> |
서브모듈 등록 해제 | git submodule deinit ./libs/lib |
git rm <경로> |
서브모듈 제거 (등록 해제 후) | git rm ./libs/lib |
서브모듈이 포함된 저장소를 처음 복제하는 경우, 서브모듈 디렉토리는 비어 있습니다.git submodule update --init --recursive 명령으로 서브모듈 내용을 가져와야 합니다.
123git clone https://github.com/ParkYoungWoong/hello-submodule.git cd hello-submodule git submodule update --init --recursive
서브모듈을 완전히 제거하려면, 등록 해제와 파일 삭제를 순서대로 진행합니다.
1234git submodule deinit ./hello-submodule git rm ./hello-submodule rm -rf .git/modules/hello-submodule git commit -m "서브모듈 제거"
# 워크트리 (Worktree)
워크트리(Worktree)는 하나의 Git 저장소에서 여러 브랜치를 별도의 디렉토리에 동시 체크아웃해서 작업할 수 있는 기능입니다.
git switch 같은 일반적인 브랜치 전환은 하나의 디렉토리에서 브랜치를 바꾸는 방식입니다.
따라서 작업 중이던 변경사항이 있을 때 브랜치를 변경하려면, 변경사항을 임시 저장(Stash)하거나 버전 생성(Commit)을 해야 합니다.
IDE에서 열어둔 파일, 빌드 캐시, 개발 서버 상태도 모두 초기화됩니다.
워크트리를 사용하면 각 브랜치가 독립된 디렉토리에 존재하게 됩니다.
따라서 기존 작업을 중단하지 않고 다른 브랜치에서 바로 작업을 시작할 수 있습니다.
| 명령 | 설명 | 예시 |
|---|---|---|
git worktree add <경로> |
경로명으로 새 브랜치 생성 및 워크트리 추가 | git worktree add ./.worktrees/hotfix/signup-error |
git worktree add <경로> -b <브랜치> |
다른 이름으로 새 브랜치 생성 및 워크트리 추가 | git worktree add ./.worktrees/hotfix/signup-error -b hotfix/new-branch-name |
git worktree add <경로> <브랜치> |
존재하는 기존 브랜치로 워크트리 추가 | git worktree add ./.worktrees/hotfix hotfix/existing-branch-name |
git worktree list |
모든 워크트리 목록 확인 | |
git worktree remove <경로> |
워크트리 제거 | git worktree remove ./.worktrees/hotfix/signup-error |
git worktree prune |
삭제된 디렉토리의 워크트리 정보 정리 | |
git worktree move <경로> <새경로> |
워크트리 위치 이동 | git worktree move ./.worktrees/feature ./.worktrees/new-feature |
main 브랜치에서 개발 중 긴급 버그 수정이 필요한 상황이라면 다음과 같이 워크트리를 활용할 수 있습니다.
프로젝트 루트의 파일은 변경되지 않으므로, IDE 상태나 개발 서버를 유지하면서 긴급 작업을 처리할 수 있습니다.
123456789101112131415# main 브랜치에서 작업 중에 긴근 버그 수정을 위해 워크트리 생성 git worktree add ./.worktrees/hotfix/signup-error # 워크트리 디렉토리로 이동해서 수정 작업 및 버전 생성 cd ./.worktrees/hotfix/signup-error git add . git commit -m "회원가입 버그 수정" # 다시 main 브랜치 디렉토리로 이동해서 병합 cd ../../.. git merge hotfix/signup-error # 워크트리와 브랜치 삭제 git worktree remove ./.worktrees/hotfix/signup-error git branch -d hotfix/signup-error
끝까지 읽어주셔서 감사합니다.
좋아요와 응원 댓글은 블로그 운영에 큰 힘이 됩니다!