git revert
한 줄 요약
특정 커밋의 변경사항을 되돌리는 새 커밋 생성
선행 지식
기본 사용법
git revert <커밋>지정한 커밋의 변경사항을 되돌리는 새 커밋을 만듭니다.
주요 옵션
| 옵션 | 설명 | 예시 |
|---|---|---|
| (없음) | 바로 커밋 생성 | git revert a1b2c3d |
--no-commit / -n | 커밋 없이 되돌리기 | git revert -n a1b2c3d |
--no-edit | 메시지 수정 없이 | git revert --no-edit a1b2c3d |
--abort | revert 취소 | git revert --abort |
시각적 이해
reset vs revert
reset (히스토리 변경):
Before:
[c1]───▶[c2]───▶[c3]───▶[c4]
▲
HEAD
After reset:
[c1]───▶[c2]───▶[c3] [c4 삭제됨]
▲
HEAD
revert (새 커밋 추가):
Before:
[c1]───▶[c2]───▶[c3]───▶[c4]
▲
HEAD
After revert:
[c1]───▶[c2]───▶[c3]───▶[c4]───▶[c4 되돌리기]
▲
HEAD
revert는 히스토리를 유지하면서 안전하게 되돌립니다.
실제 예제
직전 커밋 되돌리기
$ git log --oneline -3
a1b2c3d (HEAD -> main) feat: 버그 있는 기능
9x8y7z6 fix: 이전 수정
5w4v3u2 Initial commit
$ git revert HEAD
# 에디터가 열림: Revert "feat: 버그 있는 기능"
$ git log --oneline -4
f1e2d3c (HEAD -> main) Revert "feat: 버그 있는 기능"
a1b2c3d feat: 버그 있는 기능
9x8y7z6 fix: 이전 수정
5w4v3u2 Initial commit특정 커밋 되돌리기
# 특정 커밋 ID로 되돌리기
git revert a1b2c3d여러 커밋 되돌리기
# 범위로 되돌리기 (새 것부터 오래된 것 순서)
git revert HEAD~3..HEAD
# 또는 하나씩
git revert HEAD
git revert HEAD~1
git revert HEAD~2커밋 없이 되돌리기
여러 revert를 하나의 커밋으로 합치고 싶을 때:
# 커밋하지 않고 변경만
git revert -n a1b2c3d
git revert -n 9x8y7z6
# 확인 후 한 번에 커밋
git commit -m "Revert: 두 커밋 되돌리기"revert 시 충돌
되돌리려는 변경사항이 이후 커밋과 충돌할 수 있습니다:
$ git revert a1b2c3d
Auto-merging app.js
CONFLICT (content): Merge conflict in app.js
error: could not revert a1b2c3d충돌 해결
# 1. 충돌 파일 수정
# 2. Stage에 추가
git add app.js
# 3. revert 계속
git revert --continuerevert 취소
git revert --abort언제 revert를 사용하나?
revert가 적합한 상황
- 이미 push한 커밋 되돌리기
- 협업 중인 브랜치에서 되돌리기
- 히스토리 보존이 중요할 때
- 특정 커밋만 되돌리고 싶을 때 (중간 커밋)
reset이 더 나은 상황
- 아직 push 안 한 로컬 커밋
- 히스토리 정리가 목적일 때
- 여러 커밋을 합치거나 수정할 때
→ git reset 참고
revert vs reset 비교
| 특성 | revert | reset |
|---|---|---|
| 히스토리 | 유지 (새 커밋 추가) | 변경 (커밋 삭제) |
| 협업 안전성 | 안전 | 위험 |
| push된 커밋 | 적합 | 부적합 |
| 중간 커밋 되돌리기 | 가능 | 어려움 |
| 히스토리 깔끔함 | 덜 깔끔 | 깔끔 |
자주 하는 실수
merge 커밋 revert
merge 커밋은 부모가 2개라서 특별한 옵션이 필요합니다:
# -m 1: 첫 번째 부모(main) 기준으로 되돌리기
git revert -m 1 <merge-commit>revert의 revert
실수로 revert했다면, revert 커밋을 다시 revert:
# revert 커밋 찾기
git log --oneline
# revert의 revert (원래 변경 복원)
git revert <revert-commit>관련 명령어
- git reset - 히스토리 변경 방식
- git log - 커밋 히스토리 확인
- git cherry-pick - 특정 커밋 가져오기
더 알아보기
- Commit - 커밋의 구조
- 이전 버전으로 돌아가기 - 상황별 가이드
- push를 취소하고 싶을 때 - push 후 되돌리기