Contents
see ListGit 고급 사용법 - 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 --abortMerge 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 resetBisect 자동화 (스크립트)
# 테스트 스크립트로 자동 탐색
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 clearReset - 되돌리기
# 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 pop3. main에 잘못 커밋함
# 새 브랜치로 커밋 이동
git branch new-feature # 새 브랜치에 현재 상태 저장
git reset --hard HEAD~1 # main 되돌리기
git checkout new-feature # 새 브랜치로 이동주의사항
- push한 커밋은 rebase 하지 않기 (협업 시 문제)
- force push 필요시 팀원에게 알리기
- reset --hard 전 중요 변경사항 백업