git revert로 안전하게 특정 커밋 취소, git reset의 soft·mixed·hard 3가지 모드와 사용 기준, git stash로 변경 사항 임시 보관, 히스토리 재작성이 위험한 이유, 상황별 올바른 되돌리기 방법을 완전히 익힙니다.
🎯 학습 목표
이 강을 마치면 다음을 할 수 있습니다.
git revert로 특정 커밋을 안전하게 되돌릴 수 있습니다.git reset의 soft, mixed, hard 세 가지 모드의 차이를 이해하고 상황에 맞게 선택할 수 있습니다.git stash로 작업 중인 변경 사항을 임시 저장하고 복원할 수 있습니다.- 공유 브랜치에서 히스토리 재작성이 위험한 이유를 설명할 수 있습니다.
⚠️ 되돌리기 전 반드시 알아야 할 원칙
이 섹션에서는 Git의 되돌리기 명령을 사용하기 전에 반드시 이해해야 할 핵심 원칙을 살펴보겠습니다.
Git에서 "되돌리기"는 크게 두 가지 방향입니다. 하나는 안전한 되돌리기: 히스토리를 보존하면서 새 커밋으로 취소. 다른 하나는 히스토리 재작성: 과거 커밋 자체를 수정·삭제. 히스토리 재작성은 로컬 전용 브랜치에서만 안전합니다.
절대 규칙: 이미 원격 저장소에 push하고 팀원이 공유 중인 커밋은 히스토리를 재작성하지 마세요. 팀원의 저장소와 히스토리가 충돌해 심각한 문제가 생깁니다.
| 상황 | 권장 방법 | 히스토리 |
|---|---|---|
| 공유된 커밋 취소 | git revert | 보존 (새 취소 커밋 추가) |
| 로컬 커밋 수정·취소 | git reset | 재작성 (조심) |
| 작업 중 임시 저장 | git stash | 보존 (스택에 임시 보관) |
↩️ git revert — 안전한 커밋 취소
이 섹션에서는 팀 히스토리를 보존하면서 특정 커밋의 변경 사항을 없애는 가장 안전한 방법 git revert를 살펴보겠습니다.
git revert는 특정 커밋의 변경 사항을 "반대로" 적용하는 새 커밋을 만듭니다. 기존 히스토리를 그대로 두고 "이 커밋을 취소했다"는 새 기록을 추가합니다. 공유된 브랜치에서 가장 권장하는 방법입니다.
# 특정 커밋 취소 (커밋 해시로 지정)
git revert a1b2c3d
# 에디터가 열리며 기본 메시지: "Revert 'feat: 로그인 기능 추가'"
# 저장·종료하면 취소 커밋 생성
# 에디터 없이 기본 메시지로 바로 생성
git revert a1b2c3d --no-edit
# 최근 1개 커밋 취소
git revert HEAD
# 최근 3개 커밋 취소 (역순으로 각각 revert)
git revert HEAD~2..HEAD
# 출력 예시:
# [main c3d4e5f] Revert "feat: 로그인 기능 추가"
# 1 file changed, 50 deletions(-)
# delete mode 100644 login.html
revert 후 git log를 보면 원래 커밋과 취소 커밋이 모두 히스토리에 남아있습니다. 이것이 안전한 이유입니다. 팀원은 무슨 일이 있었는지 모두 추적할 수 있습니다.
🔄 git reset — 커밋 히스토리 재작성
이 섹션에서는 HEAD 포인터를 과거 커밋으로 되돌리는 git reset의 세 가지 모드와 각각의 사용 기준을 살펴보겠습니다.
git reset은 HEAD를 과거 커밋으로 이동시킵니다. 세 가지 모드가 있으며 파일과 스테이징 영역에 영향을 주는 범위가 다릅니다.
# 모드 1: --soft — 커밋만 취소, 변경 사항은 스테이징 영역에 유지
git reset --soft HEAD~1
# 결과: 마지막 커밋이 취소되고 변경 내용은 스테이징에 그대로
# 용도: 커밋 메시지를 수정하거나 커밋을 합치고 싶을 때
# 모드 2: --mixed (기본값) — 커밋 + 스테이징 취소, 파일 내용은 유지
git reset HEAD~1
git reset --mixed HEAD~1 # 같음
# 결과: 마지막 커밋이 취소되고 변경 내용은 작업 디렉터리에 (unstaged)
# 용도: 커밋을 취소하고 파일을 다시 검토·수정하고 싶을 때
# 모드 3: --hard — 커밋 + 스테이징 + 파일 내용 모두 취소 (⚠️ 위험)
git reset --hard HEAD~1
# 결과: 마지막 커밋이 취소되고 파일 내용도 이전 커밋 상태로 복원
# 용도: 최근 커밋을 완전히 없애고 싶을 때 (복구 불가!)
# 특정 커밋으로 리셋
git reset --hard a1b2c3d
세 모드의 차이를 정리하면 다음과 같습니다.
| 모드 | 커밋 히스토리 | 스테이징 영역 | 작업 디렉터리 |
|---|---|---|---|
--soft | 변경됨 | 유지됨 | 유지됨 |
--mixed | 변경됨 | 초기화됨 | 유지됨 |
--hard | 변경됨 | 초기화됨 | 초기화됨 |
⚠️ 경고: --hard 리셋으로 사라진 커밋은 git reflog로 복구할 수 있는 경우도 있지만, 일반적으로 복구가 매우 어렵습니다. 신중하게 사용하세요. 절대로 push된 공유 커밋에는 reset을 사용하지 마세요.
📦 git stash — 변경 사항 임시 저장
이 섹션에서는 작업 도중 다른 브랜치로 급하게 이동해야 할 때 변경 사항을 임시 보관하는 git stash를 살펴보겠습니다.
기능 개발 중에 긴급 버그 수정 요청이 오면 어떻게 해야 할까요? 아직 완성되지 않아 커밋하기 어려운 상태라면 git stash로 임시 저장합니다.
# 변경 사항을 stash에 저장 (작업 디렉터리와 스테이징 영역 초기화)
git stash
git stash push -m "로그인 페이지 작업 중" # 메시지와 함께 저장
# stash 목록 확인
git stash list
# stash@{0}: On feature/login: 로그인 페이지 작업 중
# stash@{1}: WIP on main: a1b2c3d 이전 커밋 메시지
# 다른 브랜치로 이동해 작업
git switch main
git switch -c hotfix/payment-error
# ... 긴급 수정 후 커밋·병합 ...
# 원래 브랜치로 돌아와 stash 복원
git switch feature/login
git stash pop # 가장 최근 stash 복원 후 목록에서 제거
git stash apply # 복원하되 목록에 유지 (여러 곳에 적용 가능)
# 특정 stash 적용
git stash pop stash@{1}
# stash 삭제
git stash drop stash@{0} # 특정 stash 삭제
git stash clear # 모든 stash 삭제
🔍 git reflog — 최후의 복구 수단
이 섹션에서는 reset이나 실수로 사라진 커밋을 찾아 복구하는 마지막 수단 git reflog를 살펴보겠습니다.
git reflog는 HEAD가 이동한 모든 기록을 보여줍니다. reset, switch, merge 등 HEAD 위치가 바뀔 때마다 기록됩니다. reset --hard 후에도 reflog에 이전 커밋이 남아 있어 복구가 가능합니다.
# reflog 확인
git reflog
# a1b2c3d (HEAD -> main) HEAD@{0}: reset: moving to HEAD~1
# d4e5f6g HEAD@{1}: commit: feat: 실수로 지운 기능
# c3d4e5f HEAD@{2}: commit: 이전 커밋
# HEAD@{1}의 커밋 해시 d4e5f6g를 복구
git reset --hard d4e5f6g
# 또는 새 브랜치로 복구
git switch -c 복구브랜치 d4e5f6g
reflog는 로컬에서만 기록되며 보통 90일간 보관됩니다. 원격 저장소에서 삭제된 브랜치는 reflog로 복구할 수 없으므로 중요한 변경은 항상 push해 두는 것이 최선의 예방책입니다.
📝 핵심 요약
15강에서 배운 내용을 정리해 보겠습니다.
# 상황별 되돌리기 명령어
# 공유된 커밋을 취소해야 할 때 (안전)
git revert 커밋해시
# 로컬 최근 커밋만 취소, 파일 유지
git reset --soft HEAD~1 # 스테이징에 유지
git reset HEAD~1 # unstaged로 유지
git reset --hard HEAD~1 # ⚠️ 파일도 초기화
# 작업 중 다른 브랜치로 급하게 이동
git stash
git stash pop # 복귀 후 복원
# 실수로 지운 커밋 찾기
git reflog
가장 중요한 원칙: push된 커밋은 reset 하지 말고 revert 하라. revert는 히스토리를 보존하므로 팀에 안전합니다.
다음 강인 16강 — README와 문서화에서는 저장소 첫인상을 결정하는 README.md 작성법, 마크다운 문법, 그리고 오픈소스 저장소를 완성도 있게 만드는 CONTRIBUTING.md, CHANGELOG 같은 부가 문서를 배웁니다!
관련 주제
- git revert
- git reset soft mixed hard
- git stash
- 히스토리 재작성 위험
- 공유 브랜치 주의
- 개발·프로그래밍
- 개발·프로그래밍 강의
- 깃허브 사용법 18강 — Git & GitHub 협업
- 무료강의
- 무료 온라인 강의
- NUGUNA
- 누구나
📚 시리즈 전체 공유
깃허브 사용법 18강 — Git & GitHub 협업
이 강의가 속한 시리즈는 총 15강, 모두 무료입니다. 처음부터 배우려는 동료에게 시리즈 전체를 알려 주세요.
댓글
불러오는 중...
