추천 게시물

Git 체크아웃, 리버트, 리셋의 차이

목차

Git을 사용하다 보면 필연적으로 과거의 특정 시점으로 돌아가야 하는 상황과 마주한다. 코드를 잘못 수정했거나, 기능 추가 이전으로 돌아가야 할 때 우리는 시간 여행을 꿈꾼다. Git은 checkout, revert, reset이라는 세 가지 강력한 시간 여행 도구를 제공한다. 하지만 이 도구들은 비슷해 보이면서도 동작 방식과 역사(커밋 기록)에 미치는 영향이 완전히 다르다.

이들의 차이를 명확히 이해하지 못한 채 사용하면, 개인의 작업물을 넘어 팀 전체의 저장소를 망가뜨리는 끔찍한 재앙을 초래할 수 있다. 이 글에서는 세 명령어의 핵심 개념과 차이점을 명확히 분석하고, 언제 어떤 명령어를 사용해야 하는지에 대한 확실한 가이드를 제공한다.

1. `git checkout`: 역사를 바꾸지 않는 가벼운 탐색

checkout은 가장 안전하고 기본적인 시간 여행 방법이다. 이 명령어의 핵심은 커밋 기록을 전혀 변경하지 않고, 단순히 다른 브랜치나 과거의 특정 커밋을 '구경'하러 가는 것이다. 마치 책을 읽다가 궁금한 이전 페이지를 잠시 펴보는 행위와 같다.

checkout을 통해 과거의 커밋으로 이동하면, HEAD라는 포인터(현재 위치를 가리키는 표시)가 해당 커밋으로 이동하여 작업 폴더의 파일들이 그 시점의 상태로 바뀐다. 하지만 브랜치의 최종 커밋 위치는 그대로 유지된다. 구경을 마친 뒤 다시 원래 브랜치로 checkout하면 모든 것이 원래대로 돌아온다.

중요: 특정 커밋으로 checkout한 상태(이를 'detached HEAD' 상태라고 한다)에서 파일을 수정하고 **새로운 커밋을 만들면, 해당 시점에서 새로운 분기(branch)가 만들어진다.** 파일 수정만으로는 아무런 변화가 없으며, 반드시 커밋을 해야 새로운 분기점이 생긴다. 이 새로운 작업을 잃어버리지 않으려면, git checkout -b [새로운 브랜치 이름] 명령어로 새 브랜치를 만들어 작업을 저장해야 한다.

2. `git revert`: 실수를 인정하고 새로운 역사를 쓰는 방법

revert는 과거의 실수를 되돌리는 가장 '정직한' 방법이다. 이 명령어는 문제가 되는 커밋을 삭제하거나 수정하는 대신, 해당 커밋에서 수행했던 변경 사항을 정확히 반대로 수행하는 새로운 커밋을 생성한다.

예를 들어, "A 기능 추가"라는 커밋을 revert하면 "A 기능 추가를 취소함"이라는 새로운 커밋이 그 위에 쌓인다. 결과적으로 A 기능은 코드에서 사라지지만, "A를 추가했다가 다시 제거했다"는 모든 과정이 역사에 투명하게 기록된다. 이는 출판된 책의 오타를 발견했을 때, 책을 전량 회수하여 폐기하는 것이 아니라 "정오표"를 추가로 배포하여 수정하는 것과 같다.

3. `git reset`: 역사를 지우고 다시 쓰는 강력한 도구

reset은 이름 그대로 과거의 특정 상태로 '초기화'하는 가장 강력하고 위험한 도구다. reset은 특정 시점 이후의 커밋 기록을 아예 없었던 일처럼 삭제하고 브랜치가 그 시점을 가리키도록 강제로 이동시킨다. 아직 출판되지 않은 원고의 마지막 몇 페이지가 마음에 들지 않아 그냥 찢어버리는 행위에 비유할 수 있다.

주의: reset은 팀원과 공유된(Push한) 커밋에 절대 사용해서는 안 된다. 개인의 로컬 저장소에서 아직 Push하지 않은 커밋을 정리할 때만 제한적으로 사용해야 한다.

Revert와 Reset 시각적으로 이해하기

두 명령어의 가장 큰 차이점은 기존 커밋 기록을 어떻게 다루는지에 있다.

Revert의 동작 방식

C2 커밋("버그 수정")에 문제가 있어 되돌리고 싶다고 가정해 보자.

변경 전 히스토리

C1
기능 추가
C2
버그 수정
C3
HEAD

git revert C2를 실행하면, C2의 변경사항을 취소하는 C4 커밋이 새로 생긴다. 기존의 C1, C2, C3 기록은 그대로 보존된다.

Revert 실행 후 히스토리

C1
C2
C3
C4
Revert "C2"

Reset의 동작 방식

C3 커밋이 불필요하다고 판단하여 C2 시점으로 돌아가고 싶다고 가정해 보자.

변경 전 히스토리

C1
기능 추가
C2
버그 수정
C3
HEAD

git reset C2를 실행하면, C3 커밋이 히스토리에서 **완전히 사라진다.** 마치 처음부터 없었던 것처럼 기록이 삭제된다.

Reset 실행 후 히스토리

C1
기능 추가
C2
HEAD

초심자를 위한 Git GUI 프로그램 추천

Git은 원래 터미널에서 명령어로 사용하는 도구이지만, 복잡한 명령어에 익숙하지 않은 초심자에게는 그래픽 사용자 인터페이스(GUI)를 제공하는 프로그램이 큰 도움이 된다. 다음은 초심자가 사용하기 좋은 대표적인 Git GUI 프로그램이다.

1. SourceTree (소스 트리)

Atlassian(Jira, Confluence 개발사)에서 만든 무료 Git GUI 클라이언트다. Git의 복잡한 브랜치 구조와 커밋 히스토리를 시각적으로 매우 잘 보여주어 초보자가 Git의 흐름을 이해하는 데 큰 도움이 된다. 기능이 강력하고 상세한 조작이 가능하지만, 처음에는 기능이 너무 많아 다소 복잡하게 느껴질 수도 있다.

2. GitHub Desktop (깃허브 데스크톱)

GitHub에서 직접 만든 프로그램으로, 매우 직관적이고 사용법이 간단하다. GitHub 저장소와의 연동이 뛰어나며, 커밋, 푸시, 풀 등 필수적인 기능을 몇 번의 클릭만으로 쉽게 처리할 수 있다. 기능이 단순한 만큼 복잡한 작업을 하기에는 한계가 있지만, Git을 처음 시작하는 입문자에게 가장 추천하는 도구다.

3. GitKraken (깃크라켄)

세련된 디자인과 강력한 기능을 자랑하는 프로그램이다. 브랜치 병합, 충돌 해결 등을 시각적으로 편리하게 처리할 수 있다. 개인적인 용도나 공개 저장소에서는 무료로 사용할 수 있지만, 상업적인 용도의 비공개 저장소에서는 유료 구독이 필요하다.

결론: 상황에 맞는 올바른 도구를 선택하라

세 가지 명령어의 차이를 한 문장으로 요약할 수 있다.

"공유된 역사는 `revert`로 안전하게, 나만의 역사는 `reset`으로 깔끔하게, 과거로의 탐사는 `checkout`으로 자유롭게 하라."

Git의 시간 여행은 강력한 기능이지만, 그만큼 책임이 따른다. 특히 여러 사람이 함께 작업하는 환경에서는 기록의 투명성과 안정성이 무엇보다 중요하다. 이 세 가지 도구의 차이점을 명확히 인지하고 상황에 맞는 올바른 도구를 사용하는 것이, 재앙을 막고 스마트한 개발자로 거듭나는 첫걸음이다.

댓글