GitGit/GitHub 기초 · 6입문

Git 고급 기능 — stash, rebase, cherry-pick

Gitstashrebasecherry-pickreset고급

git stash: 작업 임시 저장

급하게 다른 브랜치로 이동해야 할 때, 커밋하기엔 아직 이른 작업을 임시 저장합니다.

# 현재 작업 임시 저장
git stash
# Saved working directory and index state WIP on main: a1b2c3d

# 저장된 stash 목록
git stash list
# stash@{0}: WIP on main: a1b2c3d 기능 개발 중
# stash@{1}: WIP on feature: b2c3d4e 다른 작업

# 가장 최근 stash 복원 (삭제됨)
git stash pop

# 특정 stash 복원 (삭제 안 함)
git stash apply stash@{1}

# stash 삭제
git stash drop stash@{0}
git stash clear   # 전체 삭제

git rebase -i: 커밋 정리

interactive rebase로 push 전 커밋 이력을 깔끔하게 정리합니다.

# 최근 3개 커밋 수정
git rebase -i HEAD~3

에디터가 열립니다:

pick a1b2c3d feat: 기능 A
pick b2c3d4e 오타 수정
pick c3d4e5f fix: 버그 수정

명령어를 변경:

pick a1b2c3d feat: 기능 A
squash b2c3d4e 오타 수정   # 이전 커밋과 합치기
reword c3d4e5f fix: 버그 수정  # 메시지만 수정
명령설명
pick그대로 유지
squash (s)이전 커밋과 합치기
reword (r)메시지 수정
drop (d)커밋 삭제
edit (e)커밋 내용 수정

git cherry-pick: 특정 커밋만 가져오기

다른 브랜치의 특정 커밋만 현재 브랜치에 적용합니다.

# 커밋 해시 확인
git log --oneline feature/hotfix
# f1e2d3c fix: 결제 버그 긴급 수정
# a9b8c7d feat: 새 결제 UI

# main에 버그 수정 커밋만 적용
git switch main
git cherry-pick f1e2d3c

# 여러 커밋
git cherry-pick f1e2d3c a9b8c7d

# 충돌 시
git cherry-pick --continue
git cherry-pick --abort   # 취소

git reset: 커밋 되돌리기

flowchart LR
    C3["커밋 C"]
    C2["커밋 B"]
    C1["커밋 A"]

    C1 --> C2 --> C3
    HEAD["HEAD"] --> C3
    HEAD -->|"reset --soft HEAD~1"| C2soft["커밋 B\n(변경사항은 staged 유지)"]
    HEAD -->|"reset --hard HEAD~1"| C2hard["커밋 B\n(변경사항 삭제!)"]
# soft: 커밋만 취소, 변경사항 staged 유지
git reset --soft HEAD~1

# mixed (기본): 커밋 취소, 변경사항 unstaged
git reset HEAD~1

# hard: 커밋 취소 + 변경사항 완전 삭제 (주의!)
git reset --hard HEAD~1

# 특정 커밋으로
git reset --hard a1b2c3d

git revert: 안전하게 되돌리기

push한 커밋은 reset 대신 revert를 사용합니다. 새 커밋을 만들어 되돌립니다.

# 특정 커밋을 되돌리는 새 커밋 생성
git revert a1b2c3d

# 여러 커밋
git revert HEAD~3..HEAD

# 커밋 없이 변경사항만 적용
git revert --no-commit a1b2c3d

git reflog: 삭제된 커밋 복구

실수로 reset --hard를 했어도 복구할 수 있습니다.

# 모든 HEAD 이동 이력
git reflog
# a1b2c3d HEAD@{0}: reset: moving to HEAD~1
# b2c3d4e HEAD@{1}: commit: feat: 기능 추가
# a1b2c3d HEAD@{2}: commit: 초기 설정

# 복구
git reset --hard b2c3d4e

.git 폴더 구조 (참고)

.git/
├── HEAD          ← 현재 브랜치
├── config        ← 저장소 설정
├── objects/      ← 모든 커밋/파일 데이터
├── refs/
│   ├── heads/    ← 로컬 브랜치
│   └── remotes/  ← 원격 브랜치
└── COMMIT_EDITMSG ← 마지막 커밋 메시지

정리

명령어역할
git stash작업 임시 저장
git stash pop저장된 작업 복원
git rebase -i HEAD~N커밋 정리 (squash 등)
git cherry-pick <hash>특정 커밋만 적용
git reset --soft HEAD~1커밋 취소 (변경사항 유지)
git revert <hash>되돌리는 새 커밋 생성
git reflog삭제된 커밋 복구

Git/GitHub 기초 시리즈를 완료했습니다. 다음은 TypeScript 기초 — JavaScript에 타입을 더해 안전한 코드를 작성하는 방법입니다.

궁금한 점이 있으신가요?

협업·의뢰는 아래로, 가벼운 소통은 인스타그램 @bluefox._.hi도 환영이에요.