🛠️ Tools/🐈 Github

[Git] Reset과 Revert의 차이 / 커밋 안남기고 revert 하기

minhe2810 2025. 7. 11. 15:38

git reset 과 revert 의 차이를 정확하게 아시나요? 🤔

 

알아도 다시 정리해볼게요.

 

먼저 이 글은 얄코의 git 강의를 들으며 스스로 정리한 내용입니다.

 

그림으로 이해하기

우선 그림으로 먼저 이해를 해보자면,

git reset

Reset 방식은 이전의 commit 으로 돌아가며, 해당 커밋 이후 시점의 기록들을 그냥 지워버립니다.

즉, Replace Cheetas with Panthers 커밋이 사라지고 Add team Cheetas 커밋으로 이동해버리는거죠.

 

git revert

Revert 방식은 작업 내용을 거꾸로 실행해서 해당 commit 의 작업 내용만 취소하는 것을 말합니다.

즉, Replace Cheetas with Panthers 에서 했던 작업 내용만 쏙 빼서 되돌리는 것이지요. 

 

Revert 의 장점은 1, 2, 3 번 순으로 커밋을 찍었는데 만일 2번에 추가했던 내용만 현재 코드에서 제거를 하고 싶을 때 유용하게 사용됩니다.

 

즉, 이후의 작업 내역들은 유지하면서 특정 작업만 선택해서 되돌릴 수 있다는 점이지용.

 

협업 시 부담없이 사용하기 좋은 명령어인 것 같습니다.

 

내가 저지른 일만 슥 되돌릴 수 있다니...!

 

Reset 과 Revert 의 차이는 간단하게 이렇게 설명 드릴 수 있을 것 같습니다! 

 

Reset 은 그냥 그 시점으로 돌아가버리기

Revert 는 내가 커밋했던 내용만 고스라니 되돌려버리기

 

협업 시, 한 번 공유가 된 코드는 Reset 을 사용해서 되돌리려고 하면,

해당 코드를 기반으로 작성된 코드들(내가 작성한 코드 이후의 작업들)도 모두 영향을 끼치니까 (상상만으로도 끔찍,,)

한번 공유가 된 코드는 반드시 Reset 이 아니라, Revert 를 활용해서 되돌려줘야할 것 같습니다.

 


1. RESET 실습

실습하기 전에 얄코 선생님께서 프로젝트의 .git 폴더를 백업해두라고 하셔서 다른 폴더에 복사 해두고 실습을 진행했습니다. 

 

로그를 확인한 뒤에

git log

 

 

로그들 중에 내가 돌아가고자 하는 상태의 commit 옆에 있는 hash 값 중 5-6글자를 복사해서

(예를 들면 Add George to Tigers 커밋으로 돌아가고 싶다면)

git reset --hard 9ea07e62

 

이렇게 명령어를 입력해주면, 해당 commit 을 남겼을 때로 돌아갈 수 있습니다.

 

이렇게 원하는 커밋으로 HEAD를 옮겨주는 Reset 명령어를 실행하게 된다면,

이전 커밋의 내용들은 모두 사라지고 그 당시의 커밋 상태로 돌아가게 되죠.

 

사진은 위의 명령어가 아닌 FIST COMMIT의 해시값을 넣고 reset 을 해준 뒤의 소스트리 모습입니다.

소스트리를 확인해보면 이전 커밋 내용이 모두 사라지고 첫번째 커밋만 남아있는 것을 확인할 수 있겠죠.

 

다시, 테스트를 위해 .git 폴더를 삭제하고 백업해뒀던 .git 폴더를 다시 프로젝트 파일에 넣어주었어요.

 

그러자 다시 Reset 이전에 찍었던 커밋 내역이 생성된 것을 볼 수 있습니다.

 

(.git 폴더에는 git 내역들이 저장되니까욤..)

살짝 혼돈의 카오스가 올 뻔 했지만, 정리하자면...

 

현재 프로젝트 파일의 내용은 FIRST COMMIT 때의 내용을 갖고 있는데,

커밋기록은 .git 폴더가 가지고 있는 Replace Cheetas with Panthers 커밋(최종 수정 직후의 커밋)을 갖고 있기 때문에

이전 커밋(Replace Cheetas with Panthers)과 다른 현재 파일 내용들을 uncommitted changes 로 가리키고 있습니다.

 

프로젝트 코드 내용은 FIRST COMMIT, .git 에 저장된 커밋 내역들은 Replace Cheetas with Panthers 커밋의 내용인 상태입니다.

 

이 변화들을 없애려면 다음과 같은 명령어를 입력하면 됩니다.

다시말해, Replace Cheetas with Panthers 커밋 상태로 코드 내용을 돌리고 싶다면, 이 명령어를 입력하면 됩니다.

git reset --hard

 

그러면 마지막 커밋의 내용으로 파일들이 복원됩니다.

 

 

소스트리로 확인해보면, 최종 커밋 상태(Replace Cheetas with Panthers)로 돌아간 것을 확인할 수 있다.

 

만약 FIRST COMMIT에서 생성된 파일이 마지막 커밋에는 존재하지 않는다면,
해당 파일은 untracked 상태로 남게 된다.
따라서 정말로 마지막 커밋 상태로 완전히 되돌리고 싶다면, 이 untracked 파일들도 직접 삭제해주어야 한다.

 


2. REVERT

revert 를 하고자 하는 커밋의 해시값 5-6자리를 복사해서

다음의 명령어를 실행해주면

git revert 99fc71256c5f

 

이렇게 커밋 메시지가 자동으로 작성됩니다.

 

소스트리 화면

RESET 과 달리 REVERT 는 해당 커밋에서 추가되었던 내용만 골라서 되돌려주는 즉 삭제해주는 기능입니다.

 

ADD George to Tigers 라는 커밋에서 members 에 George를 추가해줬었는데

Revert를 하자 추가되었던 George 를 삭제가 되는 것을 발견할 수 있습니다. 

 

여기서 한가지 상황을 가정해보자.

 

만약에 내가 revert 하려는 커밋에서 생성했던 파일이 그 이후의 커밋에서 만일 수정이 된 파일이라면?

 

충돌이 발생할 수 있습니다.

 

"너어가 revert 하려는 커밋에서 생성했던 leopard 라는 파일말이야. 너가 리버트하면 leopard 파일 삭제가 되어지는데

너어가 그 이후에 leopard 를 수정했던 내용의 커밋도 존재한다구~

너어가 이 커밋을 되돌리려면, leopard 라는 파일을 삭제할지! 아니면 지금 당장 git add leopard.yaml 을 하던지 해서

결정해줘~ 난 결정 못해~" 라고 물어보며 충돌을 알리는 메시지가 나옵니다.

핵심 문장은 이 두 문장.

git add/rm <pathspec>
git revert --continue

 

따라서 저는 leopard.yaml 파일을 삭제하고

revert 를 계속 진행하도록 하겠습니다.

그럼 이렇게 git bash 에 커밋 메시지와 설명이 주르륵,,,

leopards.yaml 삭제되었죠.

 


 

커밋 안 남기고 revert 하는 방법

보통 revert 를 하면 자동으로 commit 이 찍혔는데

git revert --no-commit (되돌릴  커밋 해시)

 

이렇게 명령어를 입력하면 commit 을 하지 않고 되돌리기가 가능합니다. 

 

커밋 안 남기고 revert가 필요한 상황

- 원하는 다른 작업을 추가한 다음에 함께 커밋

- 취소하려면 git reset --hard (즉, 커밋하지 않고 revert 를 했는데 다시 최종 커밋의 상태로 돌아가고 싶을 경우에)