formulous

주니어 개발자의 개발 지식 공유 블로그입니다.

Git

[Git] git revert / git reset : 이전 커밋으로 돌리기 (커밋 롤백)

formulous 2022. 12. 22. 08:32

 

 

안녕하세요.

 

오늘은 커밋한 내용에 대해서 다시 되돌릴 수 있는 명령어에 대해 알아봅시다.

 

Git을 활용하여 프로젝트 작업을 하다 잘못된 코드를 커밋하고 곤란하셨던 적 있나요?

 

 

 

 

오늘 업무 중에 미처 수정되지 못한 코드를 커밋해버리고 말았는데요.

 

커밋에 대해 롤백할 수 있는 방법을 찾다가 좋은 명령어를 알게되어 소개해보고자 합니다.

 

이미 커밋한 내용을 되돌릴 수 있는 명령어로는 git revert 명령어와 git reset 명령어가 있는데요.

 

두 명령어에는 이전 커밋으로 돌아가면서 현재 커밋 내역을 남기냐 안남기냐의 차이가 있습니다.

 

바로 본론으로 들어가볼까요?

 

 

 

 

* git reset

 

 

git reset 명령어는 돌아가고자 하는 커밋과 현재 커밋 사이의 모든 커밋이 제거되고, 해당 커밋들의 변경 사항들만 보존합니다.

 

예를 들어 아래와 같이 5번의 커밋을 진행했다고 예시를 들어봅시다.

 

git commit -m "1"
git commit -m "2"
git commit -m "3"
git commit -m "4"
git commit -m "5"

 

여기서 바로 직전 커밋인 4번 커밋으로 돌아가고 싶다면 어떻게 해야할까요?

 

git reset HEAD^

 

위와 같은 명령어로 바로 직전 커밋으로 돌아갈 수 있습니다.

 

혹은 훨씬 더 앞의 원하는 커밋으로 되돌아가고 싶다면 어떤 명령어를 사용해야 할까요?

 

git reset [commit hash]

 

위처럼 원하는 커밋의 hash 값을 reset 명령어 뒤에 써주면 해당하는 커밋으로 이동할 수 있게 됩니다.

 

이렇게 본인이 원하는 커밋으로 돌아가게 되면 reset 으로 이동한 커밋 이후에 존재하던 커밋들은 변경사항을 제외하고 제거된 상태가 됩니다.

 

그리고 남겨진 변경 사항들은 다시금 working directory로 저장되어 사용할 수 있습니다.

 

이렇게 변경 사항들을 남겨둔 채로 커밋은 제거하는 것 방식을 Plain Commit 이라 합니다.

 

git reset 을 진행하면서 변경 사항에 대해서도 남겨두지 않고 삭제하는 옵션을 줄 수도 있습니다.

 

git reset --hard [commit hash]

 

이렇게 --hard 옵션을 주어 reset 명령어를 수행하면 변경 사항들에 대해서도 남겨두지 않고 되돌아갈 수 있습니다.

 

하지만 git reset 명령어는 과거 커밋으로 돌아가면서 기존에 존재하던 커밋들을 다 제거하기 때문에 협업하는 환경에서는 큰 위험 부담이 있습니다.

 

그 위험 부담이라 함은, 본인의 커밋을 과거로 돌리려다 reset 목적지 커밋과 현재 커밋 사이의 협업중인 팀원들의 커밋을 같이 지워버리는 것이겠죠.

 

이러한 문제점으로 git reset 명령어는 협업 환경에서 가용하지 않는 축에 속하는데요.

 

그렇다면 팀원들의 업무에 영향이 없도록 본인이 원하는 커밋만 제거하려면 어떻게 진행할 수 있을까요?

 

바로 다음으로 알려드릴 git revert 명령어를 활용하면 됩니다.

 

 

 

* git revert

 

 

git revert 명령어는 git reset과 다르게 돌아가고자 하는 과거 커밋과 현재 커밋 사이의 다른 커밋들을 제거하지 않고 원하는 커밋만 제거할 수 있는 명령어 입니다.

 

기존의 커밋을 제거한다는 것은 커밋을 할 당시에 변경사항들을 원래대로 되돌린다는 의미가 되겠죠?

 

변경 사항을 원래대로 되돌린다는 것도 현재 커밋의 관점에서 보면 '기존 내용을 삭제하는 변경사항을 가진 커밋을 올리는 것'으로 볼 수 있습니다.

 

이처럼 revert 커밋은 지우고자 하는 커밋에서의 변경 사항을 삭제하는 revert 커밋을 새로 올리는 방식인데요.

 

git revert HEAD
git revert [commit hash]

 

  • git revert HEAD : 바로 직전의 커밋을 제거하는 revert 커밋이 커밋됩니다.
  • git revert [commit hash] : 원하는 커밋을 제거하는 revert 커밋이 커밋됩니다.

 

위와 같은 명령어 형태로 사용됩니다.

 

만약 1부터 5까지의 커밋을 진행하고 git revert HEAD 명령어를 사용한다면 git log에는 아래와 같이 나오겠죠.

 

Revert "5번 커밋"
5번 커밋
4번 커밋
3번 커밋
2번 커밋
1번 커밋

 

위와 같이 다섯 번의 커밋과 revert 커밋까지 총 6개의 커밋이 발생하는 것과 같습니다.

 

하지만 협업 당시에는 revert 커밋을 왜 진행했는지 기록을 남기는 것 역시 중요한데요.

 

git revert 는 명령어 사용 시 즉시 revert 커밋이 커밋되기 때문에 메세지를 남기려면 즉시 커밋되지 않게하는 옵션 사용이 필요합니다.

 

git revert --no-commit [commit hash]

 

위처럼 --no-commit 옵션을 사용하여 revert를 하면 revert 커밋의 변경 사항이 stage로 올라가고 커밋되진 않습니다.

 

그럼 stage로 올라간 revert 커밋의 변경 사항을 아래와 같이 메세지와 함께 따로 커밋을 진행해주면 되겠죠?

 

git commit -m "revert한 이유"

 

오늘은 커밋을 되돌리는 방법에 대해 알아보았습니다.

 

한번 알아두면 앞으로 협업을 진행하면서 많이 쓰일 내용들이니 꼭 이해하고 넘어가시길 바랍니다.

 

감사합니다.