다른 버전으로 돌아가는 방법 3가지(reset, revert, checkout)

2025. 11. 5. 21:55·데이터 분석/04. Git

지금까지 쌓인 커밋은 다음과 같습니다

이렇게 시간순으로 기록된 타임캡슐을 꺼내서 프로젝트를 원하는 과거 시점으로 돌릴 수 있습니다.

 

이처럼 프로젝트를 과거로 돌아가게 하는 방법은 크게 Reset과 Revert 두 가지가 있습니다.


1. reset  vs revert  vs checkout

01. reset

말그대로 시간을 과거로 되돌리는 것인데요
중요한건 해당과거로 돌아간 다음 그 시점 이후 행적은 히스토리에서 지워버리는 것입니다.

  • 언제 사용하면 적합한가?
    • 전부 없애고 다시 만들고 싶을 때: 최근 커밋들을 통째로 지워 히스토리를 깔끔하게 정리하고 싶을 때
    • 대량의 커밋이 잘못됐을 때 효율적으로 되돌릴 때: 한 방에 과거 지점으로 브랜치를 이동
    • 실험용 브랜치에서 커밋이 많이 쌓였는데 한 개만 남기고 싶을 때

02. revert

과거의 행동을 반대로 되돌리는 새 커밋을 만드는 것입니다
쉽게 말해서 기록을 지우지 않고 되돌린다고 생각하면 됩니다. 히스토리를 보존하는 거죠

(삭제한것은 생성, 수정한 것은 그 반대로 수정하는 커밋이 자동 생성되는 것!)

  • 언제 사용하면 적합한가?
    • 협업 환경 : 이미 원격에 푸시된 커밋을 안전하게 되돌릴 때
    • 기존 히스토리는 유지하되 과거 버전에 실행했던 내용만 취소해야하는 경우에 적합
    • 왜/무엇을 되돌렸는지” 기록을 남겨야 할 때
  • revert를 사용하는 이유
    • 히스토리를 지우지 않고 안전하게 되돌릴 수 있기때문
    • 협업 관점 : revert는 과거를 삭제하지 않고 새로운 커밋을 추가합니다. 팀원들과 함께 일을 할 때 기록 삭제는 사고를 만들기 때문에  revert가 안전한거죠
    • 추적 관점 : revert는 "이 커밋을 되돌렸습니다" 라는 새로운 커밋을 생성합니다. 그래서 나중에 로그를 보면 어떠 커밋을 왜 취소했는지 추적할 수 있죠. 이건 기록을 분석하거나 문제 원인을 찾거나, 히스토리 트래킹을 할 때 중요한 장점이 됩니다!

03. checkout

: 기존의 시간선은 그대로 둔 채, 과거의 커밋을 잠깐 열어보는 것입니다.

이제까지 진행한 커밋들을 제거하지도, 새커밋을 추가하지도 않은 채, 과거 특정 시점의 프로젝트를 만나러가는 거죠.

비유를 하자면 책의 다른 페이지로 이동을 하는데  그 책 내용은 그대로 있고 나는 단지 어디를 펼쳐볼지를 바꾸는 것입니다

한마디로 "checkout은 현재 내가 작업할 위치를 바꾸는 명령어이고 과거에서 브랜치를 만들때만 새로운 평행세계가 생긴다."

라고 생각하면 됩니다!

2. reset : 과거 버전으로 돌아가보기 

우리는 바로 전 시점인 Add team Cheetas으로 갈겁니다.

git log

git log를 통해서 커밋 내역을 확인하고 여기서 되돌아갈 시점의 커밋 해시를 복사합니다(:q 으로 빠져나가기) 

git reset --hard (돌아갈 커밋 해시)

그리고 위 명령어를 실행해주면 아래와 같이 Add team Cheetas 시점으로 돌아갔다는 것을 알 수 있습니다.

그리고 panthers.yaml이 사라졌고

manager도 Luke로 돌아왔고,마지막에 지웠던 cheetasdhk cheets 파일이 다시 생긴 것을 확인할 수 있습니다.

이처럼 파일의 생성, 변경, 삭제 이 모든 과정이 다 과거로 돌아가 있는 것입니다.

source tree에서도 시점이 전으로 돌아간 것을 확인할 수 있습니다!

 

reset 하기 전 시점으로 복원해보기

git이 생각하는 마지막 커밋 상태로 만들기 

뒤에 커밋 해시가 없으면 마지막 커밋을 가리킴 

git reset --hard

 


3. revert : 과거시점으로 돌아가기

: 특정 커밋에서의 작업들을 거꾸로 수행하여 과오를 '청산'하는 것이 revert이다 

 

취소할 커밋의 해시를 구하기 (즉, Add George to Tigers의 커밋 해시)

git revert (되돌릴 커밋 해시)

 

이제 vim 모드로 들어왔는데 이미 커밋메시지가 써져있습니다

이는 Git이 해당 커밋을 리버트하고 이를 add하여 커밋 메시지까지 작성하고 난 뒤, 사용자의 결재를 기다리는 상태라고 보시면 됩니다. 사용자가 이를 저장하면 커밋 생성이 승인되는겁니다 

-> :wq 로 커밋 메시지 저장

George가 지워져있는 것을 알 수 있습니다.

이제 Add George to Tigers를 반대로 실행하는 커밋하나가 새로 생긴 것을 확인할 수 있습니다 

Add George to Tigers에서는 George를 추가한 기록이 있는데요

revert를 한걸 보면 David만 있는 것을 확인할 수 있습니다.

전에 있는 두 커밋을 건너뛰고 해당부분의 변화만 골라서 가져온 것을 볼 수 있죠 

 

Replace Lions with Leopards를 revert해볼까요?

1) tigers의 manager는 John에서 Donald로 바뀌고

2) lions 파일은 삭제

3) leopards파일은 생성

이를 리버트하면 이 세 작업을 각각 거꾸로 진행하는 커밋이 만들어질 것입니다.

revert를 실행했을 때 lions파일은 생겨났고, tigers의ㅏ manager도 John으로 돌아왔습니다.

하지만 leopards 파일은 삭제되지 않고 남아있고 터미널 창에서도 에러가 발생한 것을 확인할 수 있습니다.

레오파드 파일에 대해 conflict즉, 충돌이 일어났다고 나와 있습니다 이는 revert 작업이 중단된 상태를 의미합니다.

 

왜 이런 일이 발생했을까요?

 

우리가 이전에 레오파드 파일이 생성된 이후인 Replace Cheetas with Pathers에서 해당 파일의 내용이 수정되었기 때문인데요.

이 파일이 생성된 커밋을 revert하려면 정확히 같은 파일을 Git 저장소에서 지워야하는데

생성 이후 작업에서 매니저가 Luke에서 Nora로 바뀌어버렸기 때문에

Git의 시각에서는 이름만 같은 다른 파일을 보이게 된겁니다.

 

그래서  Git은  터미널 창에 hint를 주면서 이 상황을 어떻게 해결할 수 있는지 힌트를 제공합니다!

 

1단계 - 레오파드 파일을 직접 지워주기
: 여기서 rm은 대상 파일을 지울 뿐만 아니라, 해당 파일이 지워졌다는 변경사항을 캡슐에 추가해 줍니다.
그래서 add까지 같이 진행해서 커밋만 해주면 되도록 만들어주죠 

git rm leopards.yaml

문제가 해결되었으니 중단된 revert를 계속 진행하라는 명령을 내려봅시다

git revert --continue

그럼 이렇게 Vi 창이 열리면서 아까와 같이 :wq로 저장해서 revert 완료 승인을 해주면 됩니다 


4. 커밋하지 않고 revert 하기

원하는 작업을 추가한 다음 함께 커밋을 하는 경우

git revert --no-commit 특정시점의 해시

그리고 나서 git status를 보면 커밋은 안되고 add만 된 상태를 볼 수 있습니다.

그 이후에 커밋을 하고싶을 때 커밋을 해주면 되는거죠!

 


5.checkout

: checkout은 이제껏 해온 커밋을 제거나 생성없이 원하는 시점의 프로젝트를 만나러가는 것

 

이 상태에서 checkout을 진행해 보겠습니다.

저는 Add George to Tigers 커밋으로 가보겠습니다

git checkout 방문하고자하는 커밋의 해시

Git의 그래프를 보니 아래와 같이 바꼈습니다

방문한 커밋 이후의 커밋들이 사라져서 마치 reset이 진행된 것 처럼 보이네요 

여기서 auto를 클릭하면 브랜치들 중 어떤 것들이 보이게 할 지 선택하는 창이 나타납니다.

여기서 all을 선택하면 모든 커밋들이 나타나고, 내가 방문한 커밋만 빈 동그라미가 표시되는것을 볼 수 있습니다!

파일들의 상태도 내가 방문한 커밋의 시점으로 돌아와있습니다.

 

소스트리에서 확인했을 때도 리셋한 것과는 다르다는 것을 알 수 있습니다.

다시 최신 커밋으로 돌아오려면 git switch라는 명령어를 입력하면 됩니다.

git switch 기본 브랜치의 이름

 

'데이터 분석 > 04. Git' 카테고리의 다른 글

Git branch 첫걸음 : 생성, 삭제, 이름 변경  (0) 2025.11.09
SourceTree로 커밋해보기  (0) 2025.11.05
새로운 버전 만들기  (0) 2025.11.05
gitignore : Git으로 관리하지 않을 파일과 폴더  (0) 2025.11.05
Git 설정하기  (2) 2025.11.05
'데이터 분석/04. Git' 카테고리의 다른 글
  • Git branch 첫걸음 : 생성, 삭제, 이름 변경
  • SourceTree로 커밋해보기
  • 새로운 버전 만들기
  • gitignore : Git으로 관리하지 않을 파일과 폴더
Growth DA Log
Growth DA Log
Growth DA Log 님의 블로그 입니다.
  • Growth DA Log
    Growth DA Log님의 블로그
    Growth DA Log
  • 전체
    오늘
    어제
    • 분류 전체보기 (125)
      • TIS_COMPANY (6)
      • 코딩 테스트 (61)
        • 01. Python (3)
        • 02. SQL (58)
      • 데이터 분석 (53)
        • 01. BigQuery (9)
        • 02. GA4 (1)
        • 02-1. GA4를 더 잘 다루기 위한 마케팅 개.. (5)
        • 03. streamlit (5)
        • 04. Git (12)
        • 05. 데이터 엔지니어링 (3)
        • 06. 데이터 모델링 (11)
        • 07. Excel (0)
        • 08. Tableau (4)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    git
    쿼리테스트
    tableau
    cross_join
    프로그래머스
    윈도우함수
    revert
    Reset
    rank
    AARRR
    코드잇스프린트후기
    solvesql
    tableaubootcamp
    streamlit
    이행성
    SQL
    코딩테스트
    DENSE_RANK
    ROW_NUMBER
    코테
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
Growth DA Log
다른 버전으로 돌아가는 방법 3가지(reset, revert, checkout)
상단으로

티스토리툴바