개발자를 위한 필수 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이 자동으로 변경사항을 병합할 수 없을 때는 수동으로 충돌을 해결해야 합니다:

  1. git status를 실행하여 어떤 파일에 충돌이 있는지 확인
  2. 충돌이 있는 파일을 열고 충돌 마커(<<<<<<<, =======, >>>>>>>)를 찾기
  3. 마커를 제거하면서 충돌을 해결하도록 파일 편집
  4. git add로 해결된 파일 스테이징
  5. 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

fetchpull의 차이는 중요합니다. 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            # 모든 스태시 제거

스태싱은 완벽