콘텐츠로 이동

6장: 실무 꿀팁과 고급 기능

1. git stash: 작업 중인 걸 임시 보관

"다른 브랜치로 급하게 이동해야 하는데, 지금 하던 건 아직 커밋하기 애매한데..."

# 현재 작업 내용 임시 저장
git stash

# 메시지와 함께 저장 (나중에 찾기 쉬움)
git stash push -m "검색 기능 작업 중"

# stash 목록 보기
git stash list
# stash@{0}: On feature/search: 검색 기능 작업 중
# stash@{1}: WIP on main: a1b2c3d update readme

# stash 가져오기 (가장 최근 것)
git stash pop

# 특정 stash 가져오기
git stash apply stash@{1}

# stash 삭제 (pop은 apply + drop)
git stash drop stash@{0}

# stash 전부 삭제
git stash clear

2. git stash 실전 시나리오

# feature 브랜치에서 작업 중...
git checkout -b feature/search
# ... 코드 수정 중 ...

# 급히 main의 버그를 고쳐야 함!
git stash push -m "search 기능 반쯤 함"

# main으로 이동해서 버그 수정
git checkout main
# ... 버그 수정 ...
git add . && git commit -m "fix: critical bug"
git push

# 다시 feature 브랜치로 돌아와서 작업 복구
git checkout feature/search
git stash pop
# 반쯤 하던 작업이 그대로 복구됨!

3. .gitconfig: 나만의 Git 설정

# 단축어(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.unstage 'reset HEAD --'
git config --global alias.last 'log -1 HEAD'
git config --global alias.lg "log --oneline --graph --all"

설정 후:

git st          # = git status
git co main     # = git checkout main
git lg          # = git log --oneline --graph --all (최고!)
git unstage foo # = git reset HEAD -- foo

4. git log 활용법

# 커밋 히스토리를 예쁘게 보기
git log --oneline --graph --all --decorate

# 특정 파일의 변경 이력 보기
git log -p hello.py

# 누가 얼마나 커밋했는지
git shortlog -sn

# 최근 3개 커밋만 보기
git log -3 --oneline

# 특정 기간 커밋 보기
git log --since="2024-01-01" --until="2024-12-31"

# 검색: 커밋 메시지에서 찾기
git log --grep="login"

# 검색: 코드 변경 내용에서 찾기
git log -S "password"

5. git diff: 변경사항 자세히 보기

# 작업 디렉토리의 변경 보기 (add 전)
git diff

# 스테이징 영역의 변경 보기 (add 후, commit 전)
git diff --staged

# 특정 파일만 보기
git diff hello.py

# 두 커밋 간 차이 보기
git diff abc123 def456

# 두 브랜치 간 차이 보기
git diff main..feature/login

# 단어 단위로 차이 보기 (더 정밀함)
git diff --word-diff

6. git tag: 버전 표시하기

# 버전 태그 만들기
git tag v1.0.0
git tag v1.0.0 abc123  # 특정 커밋에 태그

# 주석이 있는 태그 (권장)
git tag -a v1.0.0 -m "첫 번째 릴리즈"

# 태그 목록 보기
git tag

# 태그 정보 보기
git show v1.0.0

# 태그 삭제
git tag -d v1.0.0

# 태그를 GitHub에 올리기
git push origin v1.0.0
git push origin --tags  # 모든 태그 한 번에

시맨틱 버저닝 (Semantic Versioning)

v1.2.3
│ │ │
│ │ └── Patch: 버그 수정 (하위 호환)
│ └──── Minor: 기능 추가 (하위 호환)
└────── Major: 큰 변화 (하위 호환 깨짐)

예시: - v1.0.0 → 첫 정식 릴리즈 - v1.1.0 → 새 기능 추가 - v1.1.1 → 버그 수정 - v2.0.0 → 대대적인 변경

7. git rebase: 커밋 히스토리 정리

주의: push한 커밋에는 절대 rebase 하지 마세요!

# 최근 3개 커밋을 합치거나 수정
git rebase -i HEAD~3

에디터가 열리면:

pick abc1234 첫 번째 커밋
pick def5678 두 번째 커밋
pick ghi9012 세 번째 커밋

# pick → squash로 바꾸면 이전 커밋에 합쳐짐
pick abc1234 첫 번째 커밋
squash def5678 두 번째 커밋
squash ghi9012 세 번째 커밋
# → 세 개가 하나로 합쳐짐

merge vs rebase

merge:
  main:   A → B → C → M (병합 커밋이 생김, 히스토리가 복잡)
               ↗     ↗
  feature: D → E

rebase:
  main:   A → B → C → D' → E' (히스토리가 일직선, 깔끔)
# feature 브랜치를 main 위에 rebase
git checkout feature/login
git rebase main

8. GitHub Actions (간단 소개)

GitHub 저장소에서 자동으로 실행되는 스크립트입니다.

.github/
└── workflows/
    └── test.yml   # push할 때마다 테스트 자동 실행

간단한 예시:

name: Run Tests
on: [push, pull_request]
jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - run: npm install
      - run: npm test

활용 예시: - push할 때마다 자동으로 테스트 실행 - PR을 올리면 코드 스타일 검사 - main에 병합되면 자동으로 배포

9. 자주하는 실수와 해결법

실수 해결
커밋 메시지 오타 git commit --amend -m "올바른 메시지"
add 잘못한 파일 git restore --staged 파일명
잘못된 브랜치에서 작업 git stash → 브랜치 이동 → git stash pop
push 안 했는데 reset --hard git reflog로 찾아서 복구
큰 파일을 실수로 커밋 .gitignore 추가 → git rm --cached 큰파일

10. 추천 도구

도구 용도 난이도
GitHub Desktop GUI Git 클라이언트 초보
VS Code Git 에디터 내장 Git 초보~중급
tig 터미널에서 git log 예쁘게 보기 중급
lazygit 터미널 Git UI 중급
GitHub CLI (gh) 터미널에서 PR/Issue 관리 중급

명령어 치트시트

# 일상 (매일 씀)
git status                    # 상태 확인
git add .                     # 전체 스테이징
git commit -m "메시지"        # 커밋
git push                      # 올리기
git pull                      # 받기

# 브랜치
git checkout -b feature/xxx     # 브랜치 만들고 이동
git merge feature/xxx         # 병합
git branch -d feature/xxx     # 삭제

# 되돌리기
git restore 파일              # 수정 취소
git restore --staged 파일     # 스테이징 취소
git reset --soft HEAD~1       # 최근 커밋 되돌리기 (안전)
git revert 커밋해시           # 커밋 취소 (히스토리 유지)

# 임시 보관
git stash                     # 임시 저장
git stash pop                 # 임시 저장 복구

# 정보 확인
git log --oneline --graph     # 히스토리 보기
git diff                      # 변경사항 보기
git remote -v                 # 원격 저장소 확인

이전 장: 05-github-collaboration.md 축하합니다! Git과 GitHub의 기초를 모두 배웠습니다 🎉