🛠
EPISODE 04
stash · reset · revert · cherry-pick · tag · reflog
Git 심화
임시 저장(stash), reset의 3가지 모드, 안전한 revert, 특정 커밋만 가져오는 cherry-pick, 버전 태그, 그리고 잃어버린 커밋을 복구하는 reflog까지.
Gitstashresetreflog
소요 시간
⏱ 60분
난이도
📊 중급
선수 조건
🎯 git-coop-03
결과물
고급 Git 명령으로 실수와 변경을 자유자재로 다룸
이 강의에서 배우는 것
- 1stash로 작업을 임시 저장하고 복원한다
- 2reset --soft/--mixed/--hard 의 차이를 안다
- 3공개된 커밋은 reset 대신 revert를 사용한다
- 4cherry-pick으로 특정 커밋만 가져온다
- 5tag로 릴리즈 버전을 표시한다
- 6reflog로 잃어버린 커밋을 복구한다
1. git stash
bash
git stash
git stash push -m "로그인 폼 절반 완성"
git stash list
# stash@{0}: On main: 로그인 폼 절반 완성
git stash pop # 가장 최근 + 목록에서 제거
git stash apply stash@{1} # 특정 stash, 목록 유지
git stash drop stash@{0}
git stash clear2. git reset 3가지 모드
| 옵션 | 커밋 | 스테이징 | 작업 디렉토리 |
|---|---|---|---|
| --soft | 취소 | 유지 | 유지 |
| --mixed | 취소 | 취소 | 유지 |
| --hard | 취소 | 취소 | 취소 |
bash
# 커밋만 취소, 변경은 스테이징 상태로 유지
git reset --soft HEAD~1
# 커밋 취소 + 스테이징 해제 (기본값)
git reset HEAD~1
# 커밋 취소 + 변경 완전 삭제 ⚠️
git reset --hard HEAD~1⚠️
git reset은 로컬에서만! push된 커밋을 reset하면 팀원의 히스토리와 충돌.
3. git revert — 공개 커밋 안전 되돌리기
bash
git revert abc1234 # 특정 커밋
git revert HEAD # 최근 커밋
git revert HEAD~3..HEAD # 여러 커밋
git revert --no-commit HEAD| reset | revert | |
|---|---|---|
| 동작 | 커밋 삭제 | 되돌리기 커밋 추가 |
| 히스토리 | 변경됨 | 보존됨 |
| 안전성 | 로컬 전용 | push된 커밋도 안전 |
| 팀 작업 | 위험 | 권장 |
4. git cherry-pick
bash
git cherry-pick abc1234 # 특정 커밋
git cherry-pick abc1234 def5678 # 여러 개
git cherry-pick abc1234..def5678 # 범위
# 충돌 해결 후
git add .
git cherry-pick --continue
git cherry-pick --abort예: feature 브랜치의 버그 수정 커밋만 main에 적용.
5. git tag
bash
git tag v1.0.0 # 경량 태그
git tag -a v1.0.0 -m "첫 정식 릴리즈" # 주석 태그 (권장)
git tag -a v0.9.0 abc1234 -m "베타" # 특정 커밋
git tag # 목록
git tag -l "v1.*" # 패턴
git show v1.0.0 # 상세
git push origin v1.0.0 # 태그 push
git push origin --tags # 모든 태그
git tag -d v1.0.0 # 로컬 삭제
git push origin :v1.0.0 # 원격 삭제6. git reflog — 위험한 상황 복구
HEAD가 이동한 모든 이력. reset --hard로 삭제한 커밋도 reflog로 복구 가능!
bash
git reflog
# abc1234 HEAD@{0}: reset: moving to HEAD~3 ← 잘못된 reset!
# def5678 HEAD@{1}: commit: feat: 중요한 기능
git reset --hard HEAD@{1} # 방금 전 상태로
git reset --hard def5678 # 해시로 복구💡
reflog는 로컬에만 — gc 실행 시 사라질 수 있습니다.