git revert

한 줄 요약

특정 커밋의 변경사항을 되돌리는 새 커밋 생성

선행 지식

기본 사용법

git revert <>

지정한 커밋의 변경사항을 되돌리는 새 커밋을 만듭니다.

주요 옵션

옵션설명예시
(없음)바로 커밋 생성git revert a1b2c3d
--no-commit / -n커밋 없이 되돌리기git revert -n a1b2c3d
--no-edit메시지 수정 없이git revert --no-edit a1b2c3d
--abortrevert 취소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 --continue

revert 취소

git revert --abort

언제 revert를 사용하나?

revert가 적합한 상황

  1. 이미 push한 커밋 되돌리기
  2. 협업 중인 브랜치에서 되돌리기
  3. 히스토리 보존이 중요할 때
  4. 특정 커밋만 되돌리고 싶을 때 (중간 커밋)

reset이 더 나은 상황

  1. 아직 push 안 한 로컬 커밋
  2. 히스토리 정리가 목적일 때
  3. 여러 커밋을 합치거나 수정할 때

git reset 참고

revert vs reset 비교

특성revertreset
히스토리유지 (새 커밋 추가)변경 (커밋 삭제)
협업 안전성안전위험
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>

관련 명령어

더 알아보기