git reset과 git revert 쉽게 이해하기
이 글은 git add
, git commit
, git push
등 git
의 기본 개념에 대한 이해를 전제로 합니다.
git reset, revert를 사용하는 이유
-
git reset
과git revert
는commit
또는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 )