formulous

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

Git

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

formulous 2022. 12. 22. 08:32
728x90

 

 

안녕하세요.

 

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

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

 

 

 

비슷한 상황에 처한 분들이 적지 않을 듯하여 커밋 실수를 했을 때 대처할 수 있는 방법을 알려드리려 합니다

 

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

 

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

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

 

 

 

* git reset

 

 

git reset 명령어는 특정 커밋으로 이동하며, 그 이후의 커밋을 삭제하거나 보존할 수 있는 옵션을 제공합니다.

예를 들어 아래와 같은 5개의 커밋 로그가 쌓인 상태라고 생각해 봅시다.

 

 

7131f102 네번째 개발사항 Commit

42719ab2 세번째 개발사항 Commit

aee307ee 두번째 개발사항 Commit

3ebe1f10 첫번째 개발사항 Commit

5042b5e8 Initial Commit

 

 

여기서 바로 직전 커밋인 "네 번째 개발사항 Commit"으로 돌아가고 싶다면 어떻게 해야 할까요?


기본적으로, reset 에는 아래 세 가지 옵션이 존재합니다.

 

--soft 커밋만 취소하고 파일 변경 내용은 보존 (stage 상태 유지)
--mixed 커밋을 취소하고 stage는 비우지만, 파일 변경 사항은 보존
--hard 커밋을 취소하고, stage 및 파일 변경 사항까지 모두 삭제

 

옵션을 주지 않는 경우 기본 mixed로 동작하게 됩니다.

 

※ git reset --hard를 실행하면 해당 커밋 이후의 모든 변경 사항이 삭제되며, 되돌릴 수 없습니다. 반드시 백업하거나 조심하여 사용해 주세요!

 

git reset HEAD^
git reset --mixed HEAD^
git reset --soft HEAD^
git reset --hard HEAD^

 

 

git reset 명령어는 위와 예시와 같이 실행할 수 있습니다!

 

세 가지 옵션을 현재 상황에 맞춰 사용해 주시면 되겠습니다.

그렇다면, 바로 이전 커밋이 아닌 훨씬 더 앞의 원하는 커밋으로 되돌아가고 싶다면 어떤 명령어를 사용해야 할까요?

 

 

git reset [commit hash]

 

 

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

이렇게 Commit Hash를 이용하여 reset 하는 경우에도 soft, mixed, hard 옵션을 동일하게 사용할 수 있겠죠??

 

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

 

저는 웬만해서 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한 이유"

 

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

 

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

 

감사합니다.

 

728x90