git reset과 git revert 쉽게 이해하기

2 minute read

이 글은 git add, git commit, git pushgit의 기본 개념에 대한 이해를 전제로 합니다.

git reset, revert를 사용하는 이유

  • git resetgit revertcommit 또는 push했던 내용을 이전 상태로 되돌리는 경우에 사용하는 명령어입니다.

  • 로컬의 commit 내용을 변경하고자 할 때는 reset을 주로 사용하지만, 원격 저장소에 push한 결과를 되돌리고 싶을 때는 revert를 사용해야합니다.



git의 4가지 영역

git은 Working Directory, Repository, Index, Stash 의 4개의 영역으로 구성되어 있습니다.

1. Working Directory(작업영역)

프로젝트 디렉토리이며, 개발자가 직접 코드를 수정하는 공간을 의미합니다.

.git을 제외한 모든 영역에 해당합니다.

2. Index (Staging Area)

Working Directory 에서 Repository로 정보가 저장되기 전 준비 영역입니다.

.git/index 파일로 관리됩니다.

3. Repository(저장소)

파일이나 폴더를 변경 이력별로 저장해두는 곳입니다.

.git 디렉토리 내에 존재합니다.

Local, Remote Repository로 구분됩니다.

4. Stash

임시적으로 작업사항을 저장해두고, 나중에 꺼내올 수 있는 영역입니다.

영역 역할 위치
Working Directory 프로젝트 디렉토리이며, 개발자가 직접 코드를 수정하는 공간을 의미합니다. .
Index (Staging Area) Working Directory 에서 Repository로 정보가 저장되기 전 준비 영역입니다. .git/index
Repository 파일이나 폴더를 변경 이력별로 저장해두는 곳입니다. .git
Stash 임시적으로 작업사항을 저장해두고, 나중에 꺼내올 수 있는 영역입니다. .git/refs/stash


git reset

$ git reset 커밋ID

과거 커밋 지점으로 이동하고, 이동된 이후의 커밋은 삭제하는 명령어 입니다. git reset에는 3가지 종류가 있습니다.

2.1 git reset –hard

해당 커밋ID의 상태로 이동하고, Working Directory와 Index영역 모두 초기화합니다.

2.2 git reset –mixed

해당 커밋ID의 상태로 이동하고, Index영역은 초기화되고 Working Directory는 변경되지 않습니다.

2.3 git reset –soft

해당 커밋ID의 상태로 이동하고, Index영역과 Working Directory 모두 변경되지 않고, commit된 파일들을 staging area로 돌려놓습니다.

명령어 역할
git reset --hard 해당 커밋ID의 상태로 이동하고, Working Directory와 Index영역 모두 초기화합니다.
git reset --mixed 해당 커밋ID의 상태로 이동하고, Index영역은 초기화되고 Working Directory는 변경되지 않습니다.
git reset --soft 해당 커밋ID의 상태로 이동하고, Index영역과 Working Directory 모두 변경되지 않습니다.


유의사항

원격 저장소에 push한 경우에는 git reset을 사용할 때 주의가 필요합니다.

예를 들어, 커밋 A, B, C, D을 push한 후 git reset을 사용한다고 가정해봅시다.

이 때 B 커밋으로 reset --hard를 하게 되면 C, D 커밋은 사라지게 되지만, 원격 저장소에는 C, D가 남아있습니다.

나 혼자 사용하는 브랜치라면 push --force 명령어로 원격 저장소에 올릴 수 있지만, 다른 팀원이 있는 경우 충돌이 발생합니다.

이럴 때 사용할 수 있는 것이 git revert입니다.



git revert

$ git revert 커밋ID

git revert 커밋ID를 사용하면 이전 커밋 내역을 그대로 남겨둔 채 새로운 커밋을 생성합니다.

앞선 상황에서, git revert를 사용한 결과는 다음과 같습니다.

되돌릴 커밋이 여러개라면 범위를 주어서 여러개를 선택할 수도 있습니다.

git revert 2664ce8..15413dc

TIP 1. git reset을 이용하여 git add, git commit 취소하기

git add 취소하기

  • git reset 혹은 git reset HEAD (전체 파일 add 취소)
  • git reset HEAD 파일명 (특정 파일 add 취소)

git commit 취소하기

  • git reset HEAD^ (가장 최신 커밋 1개 취소(삭제))
  • git reset HEAD^^(가장 최신 커밋 2개 취소(삭제))
  • 꺽쇠 갯수에 따라 최신 커밋을 필요한만큼 순서대로 삭제
  • git reset HEAD~n (가장 최신 커밋 n개 취소(삭제))

참고자료

[1] Git 좀 잘 써보자

[2] [초보용] Git 되돌리기( Reset, Revert )

[3] git reset vs git revert 차이

[4] git add 취소 / commit 취소하기