본문 바로가기
# Tools/- Git

GitHub 사용법 5편 : Git에서의 작업을 되돌리는 명령어(Reset, Revert)

by Graffitio 2023. 8. 23.
GitHub 사용법 5편 : Git에서의 작업을 되돌리는 명령어(Reset, Revert)
728x90
반응형
[개요]

 

Git system

 

Git은 일반적으로 세 가지 트리를 관리하는 시스템이며,

여기서 트리는 '파일의 묶음'이라 생각하면 된다.

 

1. Working Directory

    : 현재 작업 중인 코드와 파일들이 실제로 존재하는 디렉토리

      (= 샌드박스)

      HEAD와 Index는 .git 디렉토리에 저장되고,

     워킹 디렉토리는 실제 파일로 존재한다.

 

2. Staging Area 또는 Index

    : 작업 디렉토리에 있는 변경 사항들 중에서

      다음 커밋에 포함될 변경 사항들을 선택하는 중간 단계

      스테이징 영역에 추가되면 다음 커밋에 포함된 내용이 준비됨.

 

3. Repository(∋ HEAD)

    : Git의 핵심적인 데이터베이스로,  모든 커밋 이력과 버전 관리 정보가 저장되는 곳.

      여기서 HEAD는 현재 작업 중인 브랜치의 가장 최신 커밋을 가리키는 포인터

 


 

작업 되돌리기

 

GitHub를 활용하여 작업을 하다 보면,

Commit 또는 push했던 내용이 잘못 되어 이전 상태로 되돌려야 하는 경우가 종종 발생한다.

 

이때 사용하는 명령어가 reset, revert 이며,

보통 Local에 commit만 하는 경우에는 reset,

Remote까지 push된 경우에는 revert를 사용한다.

 

Why?

reset은 커밋 이력을 수정하고 브랜치를 변경할 수 있으며,

revert는 이전 커밋을 변경하지 않고 새로운 커밋을 생성하기 때문에

remote repository 에서 더 안전하게 사용할 수 있다.

 


 

[Reset / Revert 사용법]

 

git reset

 

// git reset 사용법
// 여기서 Commit ID는 앞자리 일부만 사용이 가능하다.
$ git reset <--옵션> <Commit ID>

// 현재부터 6개 이전 이력으로 돌아가라고 지정해줄 수 있다.
$ git reset <--옵션> HEAD~6

 

'git reset' 명령어는 커밋 기록을 조작하고 브랜치를 이동하는 데 사용되며,

애초에 commit 하지 않은 것처럼 예전 커밋으로 브랜치를 옮긴다 생각하면 쉽다.

 

reset에는 세 가지 모드가 존재하고 내용은 다음과 같다.

 

1. Soft reset

// git reset --soft <commit>
$ git reset --soft HEAD~1

 

    위 명령어를 사용하여 HEAD를 특정 커밋으로 이동시키고

    해당 커밋 이후의 변경 사항을 스테이징 영역에 유지한다.

    이때 이전 커밋들은 스테이징 영역에 그대로 남아있게 되며,

    변경 내용을 다시 커밋하거나 스테이징할 수 있다.

 

    ex) 프로젝트 디렉토리에 Text.txt 파일을 추가 커밋

          Text2.txt 파일을 git add Text2.txt 로 add

          git reset --soft <commit> 명령어 실행

          Text.txt, Text2.txt 둘 다 add되어 있는 것을 확인할 수 있다.(git status)

 

2. Mixed reset (기본값)

// git reset --mixed <commit>
$ git reset --mixed HEAD~1

 

    위 명령어를 사용하여 HEAD를 특정 커밋으로 이동시키고

    해당 커밋 이후의 변경 사항을 스테이징 영역에서 제거한다.

 

    ex) 프로젝트 디렉토리에 Text.txt 파일을 추가 커밋

          git reset --mixed <commit> 명령어 실행

          Text.txt 파일은 살아 있으며, Index 영역에는 추가 안 된 상태

          (Workspace에만 남아 있는 상태)

 

3. Hard reset

// git reset --hard <commit>
$ git reset --hard HEAD~1

 

    위 명령어를 사용하여 HEAD를 특정 커밋으로 이동시키고,

    해당 커밋 이후의 변경 사항을 완전히 삭제한다.

    데이터 복구가 어려우니, 주의해서 사용할 것.

 

    ex) 프로젝트 디렉토리에 Text.txt 파일을 추가 커밋

          git reset --hard <commit> 명령어 실행

          Text.txt 파일은 제거되고, Index 영역에서도 확인 불가

          (Workspace에서도 삭제)

 

 

※ 요약 

    --soft : reset하기 전까지 했던 staging area, working directory의 작업은 남겨 둠

               commit 한 것만 되돌림

    --mixed : staging area는 리셋, workspace는 유지

                   commit, add 둘 다 되돌림

    --hard : staging area, workspace 모두 다 리셋

                 그냥 싹 다 날림.

 

※ 주의 사항

    ① hard reset 후 push할 때,

         - 로컬 저장소의 커밋 히스토리가 원격 저장소의 커밋 히스토리보다 뒤에 있어,

           non fast-forward인 경우, push 진행 시 오류 발생

         - 이럴 때는 강제로 덮어써야 하므로 push 뒤에 -f 또는 -force 옵션 부여하여

           강제로 덮어 쓴다.

 

    ② reset을 원격 저장소에서 사용할 때,

         - 혼자 사용하는 브랜치가 아니므로

            reset 후 삭제될 커밋 중 다른 사람이 작성한 커밋이 있을 수 있다.

         - 커밋들을 되돌리기 전 다른 사람들이 커밋을 땡겨갔다면,

           다른 사람들의 로컬 저장소에는 내가 reset하기 전의 커밋이 남아 있다.

 

 


 

git revert

 

// git revert <commit>
$ git revert HEAD~1

 

    위 명령어를 사용하면, 특정 커밋을 취소하는 새로운 커밋을 생성하고

    이로써 이전 커밋의 변경 내용이 취소되며, 이때 변경 내용은 이전 커밋 히스토리에 유지된다.

    

    ex)

    A, B, C라는 3개의 커밋이 있을 때,

    B 커밋을 되돌리기 위해 git revert B 를 실행하면 새로운 커밋 D가 생성되어

    B 커밋의 변경 내용을 취소한 상태로 기록된다.

 

 


728x90
반응형