Git 고급 사용법 - Rebase, Cherry-pick, Bisect



Git의 고급 기능들을 활용하면 더 깔끔한 커밋 히스토리 관리와 효율적인 디버깅이 가능합니다.



언제 사용하나요?



  • Rebase: 커밋 히스토리를 깔끔하게 정리

  • Cherry-pick: 특정 커밋만 다른 브랜치로 가져오기

  • Bisect: 버그가 발생한 커밋 찾기



Rebase - 브랜치 재정렬


# feature 브랜치를 main 최신 상태로 갱신
git checkout feature
git rebase main

# 충돌 발생 시
# 1. 충돌 파일 수정
# 2. git add 충돌파일
# 3. git rebase --continue

# rebase 취소
git rebase --abort


Merge vs Rebase


# Merge: 병합 커밋 생성 (히스토리 보존)
git merge feature
# A---B---C---M (main)
# /
# D---E (feature)

# Rebase: 히스토리 재작성 (선형)
git rebase main
# A---B---C---D\047---E\047 (feature가 main 위로 이동)


Interactive Rebase - 커밋 수정


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

# 에디터에서 명령어 변경
# pick = 그대로 유지
# reword = 커밋 메시지 수정
# edit = 커밋 내용 수정
# squash = 이전 커밋과 합치기
# drop = 커밋 삭제

# 예시: 여러 커밋을 하나로 합치기
pick abc1234 Add feature A
squash def5678 Fix typo
squash ghi9012 Add more code
# → 3개 커밋이 1개로 합쳐짐


Cherry-pick - 특정 커밋 가져오기


# 특정 커밋을 현재 브랜치로 가져오기
git cherry-pick 커밋해시

# 예시: hotfix 브랜치의 버그 수정을 main에도 적용
git checkout main
git cherry-pick abc1234

# 여러 커밋 가져오기
git cherry-pick abc1234 def5678 ghi9012

# 범위로 가져오기 (A는 제외, B까지)
git cherry-pick A..B

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

# 커밋하지 않고 변경사항만 가져오기
git cherry-pick -n 커밋해시


Bisect - 버그 커밋 찾기


# 이진 탐색으로 버그 도입 커밋 찾기

# 1. bisect 시작
git bisect start

# 2. 현재(버그 있음)를 bad로 표시
git bisect bad

# 3. 정상 작동하던 커밋을 good으로 표시
git bisect good v1.0 # 태그 또는 커밋 해시

# 4. Git이 중간 커밋으로 체크아웃
# 테스트 후 결과 알려주기
git bisect good # 이 커밋은 정상
git bisect bad # 이 커밋은 버그 있음

# 5. 반복하면 버그 도입 커밋 찾음
# abc1234 is the first bad commit

# 6. bisect 종료
git bisect reset


Bisect 자동화 (스크립트)


# 테스트 스크립트로 자동 탐색
git bisect start HEAD v1.0
git bisect run ./test.sh

# test.sh: 성공시 0, 실패시 1 반환
#!/bin/bash
npm test
exit $?


Stash - 임시 저장


# 현재 변경사항 임시 저장
git stash

# 메시지와 함께 저장
git stash save "작업중인 기능"

# stash 목록 확인
git stash list

# stash 적용 (제거 안 함)
git stash apply

# stash 적용 후 제거
git stash pop

# 특정 stash 적용
git stash apply stash@{2}

# stash 삭제
git stash drop stash@{0}

# 모든 stash 삭제
git stash clear


Reset - 되돌리기


# soft: 커밋만 취소, 변경사항 staging 유지
git reset --soft HEAD~1

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

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

# 특정 파일만 unstage
git reset HEAD 파일명


Reflog - 모든 히스토리


# 모든 HEAD 변경 이력 (reset 복구 가능)
git reflog

# reset --hard 실수 복구
git reflog
# abc1234 HEAD@{2}: commit: important work
git reset --hard abc1234


실전 시나리오



1. 커밋 메시지 수정


# 마지막 커밋 메시지 수정
git commit --amend -m "새로운 메시지"

# 이전 커밋 메시지 수정
git rebase -i HEAD~3
# reword로 변경


2. 작업 중 브랜치 변경


git stash
git checkout other-branch
# 작업
git checkout feature
git stash pop


3. main에 잘못 커밋함


# 새 브랜치로 커밋 이동
git branch new-feature # 새 브랜치에 현재 상태 저장
git reset --hard HEAD~1 # main 되돌리기
git checkout new-feature # 새 브랜치로 이동


주의사항



  • push한 커밋은 rebase 하지 않기 (협업 시 문제)

  • force push 필요시 팀원에게 알리기

  • reset --hard 전 중요 변경사항 백업