[Git] Reset, Revert

廷弼·2022년 11월 2일
0

Git

목록 보기
2/2

프로젝트를 진행하다 보면 commit을 뒤로 되돌려야 하는 경우가 생깁니다.
해당 포스트에서는 commit을 뒤로 되돌리는 2가지 명령어 reset과 revert에 대해서 작성합니다.

3개의 트리

reset, revert 명령을 알기 전에 3개의 트리 용어에 대해서 알아야 합니다.

  1. Working Directory
    Working Directory는 현재 작업하는 공간 입니다.

  2. Index
    Index는 바로 다음에 커밋할 것들입니다. git add 명령어를 사용하는 경우, Working Directory에 있는 변경된 파일들이 staging area에 올라가게 되는데, staging area == Index 라고 생각하면 됩니다.

  3. HEAD
    HEAD는 현재 브랜치를 가리키는 포인터이며, 브랜치에 담긴 커밋 중 가장 마지막 커밋을 가리킵니다.
    git commit 명령어를 사용하는 경우 Index에 작성된 변경사항들이 HEAD로 올라가게 됩니다.
    현재 브랜치 마지막 커밋의 스냅샷 이라고 생각하면 됩니다.

위에 작성한 3가지 트리는 다음과 같이 동작합니다.


git reset

reset 명령어는 이전 커밋으로 되돌아 가는 것을 말합니다.
3개의 커밋이 들어가 있는 상태는 다음과 같습니다.

git reset --soft


git reset --soft 명령어는 HEAD만 변경됩니다.
즉, 현재 HEAD가 가리키는 것은 file.txt v2 이지만, 그 외의 내용들은 Index로 저장되어 있는 상태입니다.

git reset --mixed (Default)


git reset --mixed 명령어는 Index 까지 변경됩니다.
하지만 현재 Working Directory에는 변경된 사항들이 있는 상태이며, git add 명령어를 통해 Index로 올릴 수 있습니다.

git reset --hard


git reset --hard 명령어는 Working Directory까지 변경됩니다.
Git에는 데이터를 삭제하는 옵션이 많지 않지만, 해당 옵션은 그 중 하나이므로 조심해서 사용해야 합니다.

만약, 해당 옵션을 통해서 Working Directory가 기존에 커밋했던 내용을 버리고 이전으로 돌아가는 경우 git reflog 명령어를 통해 복원할 수 있습니다.


git revert

revert 명령어는 해당 커밋을 취소하고, 취소 이력을 남깁니다.

A -> B -> C [HEAD] 로 이루어진 git 이력이 존재한다고 가정합니다.
git reset C 명령어를 사용한다면, 이력은 A -> B [HEAD] 가 되겠지만,
git revert C 명령어를 사용한다면, 이력은 A -> B -> C -> C revert [HEAD] 가 됩니다.

HEAD는 C revert 를 가리키고 있지만, 보여지는 내용은 B의 내용이 되겠네요.


마무리

Reset 명령어를 사용하면 커밋 이력을 깔끔하게 정리할 수 있고, 혼자 작업할 때 편하게 돌아갈 수 있습니다.
Revert 명령어를 사용하면 왜 돌아갔는지, 어떤 문제가 있었는지 이력으로 남기 때문에 같은 브랜치에서 협업하는 경우 코드 충돌을 최소화 할 수 있습니다.

다음 만화를 통해 보다 쉽게 이해할 수 있습니다.
https://www.devpools.kr/2017/01/31/%EA%B0%9C%EB%B0%9C%EB%B0%94%EB%B3%B4%EB%93%A4-1%ED%99%94-git-back-to-the-future/

출처

https://git-scm.com/book/ko/v2/Git-%EB%8F%84%EA%B5%AC-Reset-%EB%AA%85%ED%99%95%ED%9E%88-%EC%95%8C%EA%B3%A0-%EA%B0%80%EA%B8%B0

profile
2jeongfeel

0개의 댓글