개발자를 위한 필수 Git 명령어 치트시트
· 12분 읽기
목차
Git은 현대 소프트웨어 개발의 근간입니다. 혼자 작업하든 수백 명의 팀과 협업하든, Git 명령어를 마스터하는 것은 효율적인 버전 관리와 코드 관리에 필수적입니다.
이 포괄적인 치트시트는 기본 작업부터 고급 기술까지 모든 것을 다룹니다. 이 페이지를 북마크하고 Git 명령어에 대한 빠른 참조가 필요할 때마다 다시 참조하세요.
설정 및 구성
Git을 사용하기 전에 신원과 환경 설정을 구성해야 합니다. 이러한 설정은 Git의 동작 방식과 커밋이 어떻게 귀속되는지를 결정합니다.
초기 구성
Git 환경을 설정하기 위해 머신당 한 번씩 다음 명령어를 실행하세요:
# 이름과 이메일 설정 (필수)
git config --global user.name "Your Name"
git config --global user.email "[email protected]"
# 기본 브랜치 이름을 'main'으로 설정
git config --global init.defaultBranch main
# 가독성 향상을 위한 컬러 출력 활성화
git config --global color.ui auto
# 선호하는 텍스트 에디터 설정
git config --global core.editor "code --wait" # VS Code
git config --global core.editor "vim" # Vim
git config --global core.editor "nano" # Nano
# 모든 구성 설정 보기
git config --list
# 특정 구성 보기
git config user.name
git config user.email
--global 플래그는 머신의 모든 저장소에 설정을 적용합니다. 단일 저장소에 대한 설정을 구성하려면 해당 저장소로 이동하여 --global 플래그를 생략하세요.
구성 레벨
Git에는 세 가지 구성 레벨이 있으며, 각각 이전 레벨을 재정의합니다:
| 레벨 | 플래그 | 위치 | 범위 |
|---|---|---|---|
| 시스템 | --system |
/etc/gitconfig | 머신의 모든 사용자 |
| 전역 | --global |
~/.gitconfig | 현재 사용자의 모든 저장소 |
| 로컬 | --local |
.git/config | 현재 저장소만 |
프로 팁: 각 저장소에 로컬 구성을 설정하여 업무용과 개인 프로젝트에 다른 이메일 주소를 사용하세요. 이렇게 하면 잘못된 신원으로 실수로 커밋하는 것을 방지할 수 있습니다.
유용한 구성 옵션
# 자격 증명 캐싱 설정 (반복적인 비밀번호 프롬프트 방지)
git config --global credential.helper cache
git config --global credential.helper 'cache --timeout=3600'
# 자동 줄 끝 변환 활성화
git config --global core.autocrlf true # Windows
git config --global core.autocrlf input # Mac/Linux
# 일반 명령어에 대한 별칭 설정
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 merge.tool vimdiff
git config --global diff.tool vimdiff
기본 Git 명령어
이것들은 매일 사용하게 될 기본 명령어입니다. 고급 작업으로 넘어가기 전에 먼저 이것들을 마스터하세요.
저장소 초기화
# 새 Git 저장소 초기화
git init
# 특정 브랜치 이름으로 초기화
git init -b main
# 기존 저장소 복제
git clone https://github.com/user/repo.git
git clone [email protected]:user/repo.git # SSH
git clone https://github.com/user/repo.git my-folder # 사용자 지정 폴더 이름
# 최근 히스토리만 복제 (대용량 저장소에 더 빠름)
git clone --depth 1 https://github.com/user/repo.git
변경사항 작업
# 작업 디렉토리 상태 확인
git status
git status -s # 짧은 형식
git status -sb # 브랜치 정보가 포함된 짧은 형식
# 커밋을 위한 파일 스테이징
git add filename.js # 단일 파일
git add src/ # 전체 디렉토리
git add . # 현재 디렉토리의 모든 변경사항
git add -A # 전체 저장소의 모든 변경사항
git add -p # 대화형 스테이징 (패치 모드)
git add *.js # 모든 JavaScript 파일
# 파일 언스테이징
git reset filename.js # 특정 파일 언스테이징
git reset # 모든 파일 언스테이징
# 스테이징된 변경사항 커밋
git commit -m "feat: add user authentication"
git commit -am "fix: resolve login bug" # 추적된 파일 스테이징 + 커밋
git commit --amend # 마지막 커밋 수정
git commit --amend --no-edit # 메시지 변경 없이 수정
# 차이점 보기
git diff # 언스테이징된 변경사항
git diff --staged # 스테이징된 변경사항
git diff HEAD # 마지막 커밋 이후 모든 변경사항
git diff main..feature # 브랜치 간
git diff --stat # 변경사항 요약
빠른 팁: git add -p를 사용하여 변경사항을 대화형으로 검토하고 스테이징하세요. 이는 다른 변경사항은 언스테이징된 상태로 두면서 파일의 특정 부분만 커밋하는 데 완벽합니다.
파일 제거 및 이동
# 파일 제거
git rm filename.js # 작업 디렉토리에서 제거하고 삭제 스테이징
git rm --cached filename.js # Git에서 제거하지만 작업 디렉토리에는 유지
git rm -r directory/ # 디렉토리 재귀적으로 제거
# 파일 이동 또는 이름 변경
git mv old-name.js new-name.js
git mv src/file.js lib/file.js # 다른 디렉토리로 이동
git mv 또는 git rm을 사용하면 변경사항이 자동으로 스테이징됩니다. 이는 일반 셸 명령어를 사용한 다음 변경사항을 별도로 스테이징하는 것보다 더 편리합니다.
브랜치 및 병합
브랜치는 Git의 킬러 기능입니다. 메인 코드베이스를 방해하지 않고 여러 기능을 동시에 작업할 수 있게 해줍니다.
브랜치 관리
# 브랜치 목록
git branch # 로컬 브랜치
git branch -r # 원격 브랜치
git branch -a # 모든 브랜치 (로컬 + 원격)
git branch -v # 마지막 커밋 정보 포함
git branch --merged # 현재 브랜치에 병합된 브랜치
git branch --no-merged # 아직 병합되지 않은 브랜치
# 브랜치 생성
git branch feature-login # 새 브랜치 생성
git checkout -b feature-login # 새 브랜치 생성 및 전환
git switch -c feature-login # checkout의 최신 대안
# 브랜치 전환
git checkout main # main 브랜치로 전환
git switch main # 최신 대안
git checkout - # 이전 브랜치로 전환
# 브랜치 이름 변경
git branch -m old-name new-name # 브랜치 이름 변경
git branch -M new-name # 현재 브랜치 강제 이름 변경
# 브랜치 삭제
git branch -d feature-login # 병합된 브랜치 삭제
git branch -D feature-login # 강제 삭제 (병합되지 않아도)
git push origin --delete feature-login # 원격 브랜치 삭제
병합 전략
# 브랜치 병합
git merge feature-login # feature-login을 현재 브랜치에 병합
git merge --no-ff feature-login # fast-forward에도 병합 커밋 생성
git merge --squash feature-login # 모든 커밋을 하나로 스쿼시
# 병합 중단
git merge --abort
# 충돌 해결 후 계속
git merge --continue
| 병합 유형 | 명령어 | 사용 시기 |
|---|---|---|
| Fast-forward | git merge |
선형 히스토리, 분기 없음 |
| No fast-forward | git merge --no-ff |
기능 브랜치 히스토리 보존 |
| Squash | git merge --squash |
깨끗한 히스토리, 모든 커밋 결합 |
| Rebase | git rebase |
선형 히스토리, 커밋 재작성 |
리베이스
리베이스는 브랜치를 새로운 베이스 커밋으로 이동하여 커밋 히스토리를 재작성합니다. 이는 더 깨끗하고 선형적인 히스토리를 만들지만 신중하게 사용해야 합니다.
# 현재 브랜치를 main에 리베이스
git rebase main
# 대화형 리베이스 (커밋 편집, 스쿼시, 재정렬)
git rebase -i HEAD~3 # 마지막 3개 커밋
git rebase -i main # main에서 분기한 이후 모든 커밋
# 충돌 해결 후 계속
git rebase --continue
# 현재 커밋 건너뛰기
git rebase --skip
# 리베이스 중단
git rebase --abort
프로 팁: 공유 브랜치에 푸시된 커밋은 절대 리베이스하지 마세요. 리베이스는 히스토리를 재작성하므로 협업자에게 심각한 문제를 일으킬 수 있습니다. 푸시하기 전 로컬 정리에만 사용하세요.
병합 충돌 해결
Git이 자동으로 변경사항을 병합할 수 없을 때는 수동으로 충돌을 해결해야 합니다:
git status를 실행하여 어떤 파일에 충돌이 있는지 확인- 충돌이 있는 파일을 열고 충돌 마커(
<<<<<<<,=======,>>>>>>>)를 찾기 - 마커를 제거하면서 충돌을 해결하도록 파일 편집
git add로 해결된 파일 스테이징git commit또는git merge --continue로 병합 완료
# 병합 도구를 사용하여 충돌 해결
git mergetool
# 한쪽의 모든 변경사항 수락
git checkout --ours filename.js # 내 버전 유지
git checkout --theirs filename.js # 상대방 버전 유지
원격 작업
원격 저장소는 협업을 가능하게 합니다. 이러한 명령어는 GitHub, GitLab 또는 Bitbucket과 같은 원격 서버와 로컬 작업을 동기화하는 데 도움이 됩니다.
원격 관리
# 원격 저장소 목록
git remote
git remote -v # URL 포함
# 원격 저장소 추가
git remote add origin https://github.com/user/repo.git
git remote add upstream https://github.com/original/repo.git
# 원격 URL 변경
git remote set-url origin [email protected]:user/repo.git
# 원격 제거
git remote remove origin
# 원격 이름 변경
git remote rename origin upstream
# 원격 세부 정보 표시
git remote show origin
페치 및 풀
# 원격에서 변경사항 가져오기 (병합하지 않음)
git fetch origin
git fetch --all # 모든 원격에서 가져오기
git fetch --prune # 삭제된 원격 브랜치 제거
# 변경사항 풀 (fetch + merge)
git pull origin main
git pull --rebase origin main # 병합 대신 fetch + rebase
git pull --ff-only # fast-forward만, 병합 필요시 실패
# 자동 스태시로 풀
git pull --autostash
fetch와 pull의 차이는 중요합니다. Fetch는 변경사항을 다운로드하지만 작업 디렉토리를 수정하지 않는 반면, pull은 자동으로 변경사항을 병합합니다.
변경사항 푸시
# 원격으로 푸시
git push origin main
git push -u origin feature-login # 업스트림 설정 및 푸시
git push --all # 모든 브랜치 푸시
git push --tags # 모든 태그 푸시
# 강제 푸시 (주의해서 사용!)
git push --force # 원격 히스토리 덮어쓰기
git push --force-with-lease # 더 안전한 강제 푸시, 원격이 업데이트되면 실패
# 원격 브랜치 삭제
git push origin --delete feature-login
git push origin :feature-login # 대체 구문
프로 팁: 강제 푸시가 필요할 때는 --force 대신 --force-with-lease를 사용하세요. 마지막 fetch 이후 원격이 업데이트된 경우 실수로 다른 사람의 작업을 덮어쓰는 것을 방지합니다.
추적 브랜치
# 업스트림 브랜치 설정
git branch --set-upstream-to=origin/main main
git branch -u origin/main # 단축형
# 추적 브랜치 생성
git checkout -b feature origin/feature
git checkout --track origin/feature # 자동 이름 지정
# 추적 관계 보기
git branch -vv
변경사항 임시 저장
스태싱은 불완전한 작업을 커밋하지 않고 다른 작업을 할 수 있도록 변경사항을 임시로 보관합니다.
# 현재 변경사항 스태시
git stash
git stash save "work in progress on login feature"
git stash -u # 추적되지 않은 파일 포함
git stash -a # 추적되지 않은 파일과 무시된 파일 포함
# 스태시 목록
git stash list
# 스태시된 변경사항 적용
git stash apply # 가장 최근 스태시 적용
git stash apply stash@{2} # 특정 스태시 적용
git stash pop # 적용하고 스태시 목록에서 제거
# 스태시 내용 보기
git stash show
git stash show -p # 전체 diff 표시
git stash show stash@{1} # 특정 스태시 표시
# 스태시에서 브랜치 생성
git stash branch feature-name
# 스태시 제거
git stash drop stash@{1} # 특정 스태시 제거
git stash clear # 모든 스태시 제거
스태싱은 완벽