Post

[Git] 깃 커밋 롤백하는 법 정리

커밋 아이디 확인

커밋을 제어하기 전에 먼저 커밋 아이디를 확인해야 합니다. 커밋 아이디는 커밋을 생성할 때마다 자동으로 생성되는 고유 아이디를 의미합니다. 터미널을 열고 프로젝트 루트 폴더로 이동 후 git log를 입력하면 최신 커밋과 같이 이전 커밋들도 시간 순서대로 보여줍니다.

1
git log

git log git log

 

git revert, reset

revert, reset은 커밋을 되돌리기 위해 사용하는 명령어입니다. 둘 다 커밋을 되돌린다는 점에서는 동일하지만, reset은 커밋 history 자체를 뒤로 돌리고, revert는 커밋 history는 그대로 유지한 체 로컬 파일만 이전 커밋 상태로 되돌린다는 차이점이 있습니다.

1
2
3
4
5
git reset
# 커밋 history를 이전으로 되돌린다.

git revert
# 커밋 history를 유지한 체 로컬 파일만 이전 상태로 되돌린다.

 

reset

로컬에만 커밋이 머물러 있거나, 원격 저장소에 push를 했어도 나만 사용하는 게 확실한 브랜치라면 reset을 써도 상관없습니다. 하지만 다른 사람들과 공유하고 있는 브랜치라면 서로의 커밋 history가 달라지기 때문에 서로를 위해서도 하지 않는 게 좋습니다.

reset 옵션

–hard

되돌린 커밋 이후의 모든 커밋 history를 삭제합니다.

1
2
3
4
5
6
7
8
git reset --hard HEAD^
# 바로 이전 커밋으로 되돌린다.

git reset --hard HEAD~3
# 3 커밋 전으로 되돌린다.

git reset --hard 커밋아이디
# 특정 커밋으로 되돌린다.

–soft

커밋 history는 삭제되지만 변경 사항은 stage에 올라간 상태로 남습니다.

1
2
3
4
5
6
7
8
git reset --soft HEAD^
# 바로 이전 커밋으로 되돌린다.

git reset --soft HEAD~3
# 3 커밋 전으로 되돌린다.

git reset --soft 커밋아이디
# 특정 커밋으로 되돌린다.

–mixed

커밋 history는 삭제되지만 변경 사항은 stage에 올라가지 않은 상태로 남습니다. add랑 commit을 하기 전 상태.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
git reset --mixed HEAD^
# 바로 이전 커밋으로 되돌린다.

git reset --mixed HEAD~3
# 3 커밋 전으로 되돌린다.

git reset --mixed 커밋아이디
# 특정 커밋으로 되돌린다.

# 되돌린 이후 정상적으로 작동하면 변경 사항을 삭제하면 되고,
# 모종의 이유로 다시 원복하고 싶으면 아래 코드로 다시 커밋하면 된다.

git add .
# 모든 변경 사항을 stage에 올린다.

git commit -m "커밋 제목"
# stage에 올린 변경 사항 커밋

git push
# 원격 저장소에 push

원격 저장소에 올라간 커밋을 reset 하면?

원격 저장소에 올라간 커밋을 되돌리면 원격 저장소와 로컬 저장소의 커밋 history가 다르기 때문에 push 할 때 오류가 납니다. 이 때는 –force 옵션을 줘서 강제로 원격 저장소의 커밋 history를 로컬 저장소의 커밋 history로 덮어씌워야 합니다. 다른 사람들과 공유하고 있는 원격 저장소라면 공유중인 다른 사람들에게도 모두 오류가 발생하기 때문에 왠만하면 사용하지 않는 게 좋습니다. 부득이하게 사용한 경우라면 팀원들에게 상황을 공유하고 모두의 커밋 history를 강제로 맞추는 작업을 해야 합니다.

1
2
3
4
5
git push 원격저장소 커밋 --force
# 강제로 원격 저장소에 push 한다.

git push origin HEAD --force
# 강제로 마지막 커밋을 원격 저장소(origin)에 push 한다.

reset을 사용하는 경우

  • 커밋을 원격 저장소에 올리지 않고 로컬 저장소에만 올린 경우
  • 원격 저장소에 올려도 나만 사용하는 브랜치인게 확실한 경우
  • 치명적인 오류를 포함하고 있어 커밋 자체를 아예 삭제해야 하는 경우

 

revert

revert는 커밋을 삭제하는 게 아니라 이전의 변경 사항을 불러와서 새로운 커밋을 추가합니다. reset이 타임 머신을 타고 과거로 돌아가는 거라면, revert는 내 시간은 그대로고 과거의 사람을 현재로 불러오는 느낌? reset처럼 history가 꼬일 일이 잘 없기 때문에 더 안전한 방법이라고 할 수 있습니다.

revert를 사용하게 되면 git log에 Revert “커밋메시지”가 추가됩니다.

revert 사용 예시

1
2
3
4
5
6
7
8
9
10
11
git revert HEAD
# 바로 이전 커밋으로 되돌린다.

git revert 커밋아이디
# 특정 커밋아이디로 되돌린다.

git revert -m 1 HEAD
# 마지막 커밋이 merge라면, 마지막 커밋으로 되돌린다.

git revert --no-commit 커밋아이디
# 특정 커밋아이디를 stage에는 올라가지만 commit하지는 않은 상태로 되돌린다.

Revert는 커밋 history가 삭제되지 않고 어떤 커밋이 Revert 됐는지도 기록에 남기 때문에 history 관리에도 유용합니다. 결론은 깃 커밋을 롤백해야 된다면, revert를 사용하자!

 

레퍼런스

This post is licensed under CC BY 4.0 by the author.