이 방법은 로컬과 원격 모두 특정 상태로 강제로 되돌리는 것이다. 기록이 덮어쓰기되므로 주의해야 한다.
아래와 같은 커밋 히스토리가 있다고 가정한다.
a1b2c3 (HEAD -> main, origin/main) 최근 잘못된 커밋
d4e5f6 이전 정상 상태 커밋
g7h8i9 이전 커밋
d4e5f6 커밋으로 되돌리고 싶은 상황이다. 즉, push 이후에 실수해서 이전 상황으로 되돌아가고 싶은 상황이다.
현재 브랜치 상태 확인
git log --oneline
a1b2c3 (HEAD -> main, origin/main) 최근 잘못된 커밋
d4e5f6 이전 정상 상태 커밋
g7h8i9 이전 커밋되돌릴 커밋으로 로컬 브랜치를 초기화
git reset --hard d4e5f6
d4e5f6 대신 되돌리고 싶은 커밋의 해시를 입력.--hard 옵션은 파일 상태까지 포함해 이전 상태로 강제로 되돌린다.remote 브랜치를 강제로 업데이트
git push origin main --force
--force는 remote 브랜치에 덮어씌울 때 쓴다.이 방법은 히스토리를 유지하면서 되돌리려는 작업의 반대 작업을 수행한다. 협업 프로젝트에서 권장되는 방법이다.
아래와 같은 커밋 히스토리가 있다.
a1b2c3 (HEAD -> main, origin/main) 최근 잘못된 커밋
d4e5f6 이전 정상 상태 커밋
g7h8i9 이전 커밋
a1b2c3 커밋의 변경 사항을 되돌리고 싶은 상황이다. 앞에서 설명한 상황과 동일하다.
되돌리기 커밋 생성
git revert a1b2c3
a1b2c3 커밋의 변경 사항을 무효화하는 새로운 커밋을 생성한다.git revert는 remote 브랜치와 충돌 없이 기록을 안전하게 남긴다.다수의 커밋을 한 번에 되돌리기
git revert <첫 번째 커밋 해시>..<마지막 커밋 해시>예:git revert d4e5f6..a1b2c3<첫 번째 커밋>은 되돌리지 않고, 마지막 커밋까지 되돌리게 된다.원격 브랜치로 푸시
git push origin main
git log에서 새로 생성된 커밋을 확인한다.a1b2c3 최근 잘못된 커밋
c9d8e7 (HEAD -> main, origin/main) Revert "최근 잘못된 커밋"| 구분 | Reset | Revert |
|---|---|---|
| 작업 방식 | 기존 기록을 삭제하고 강제로 상태를 되돌림 | 되돌리려는 작업의 반대 작업을 새로운 커밋으로 생성 |
| 히스토리 | 덮어씌워짐 | 기록이 보존됨 |
| 협업 안전성 | 낮음 (충돌 가능성 있음) | 높음 |
| 적합한 상황 | 개인 작업 또는 잘못된 커밋을 제거해야 하는 경우 | 협업 프로젝트에서 안전하게 되돌리고 싶을 때 |