git revert, reset
잘못수정한 소스를 실수로 commit을 해버리거나 하는 등의 이유로 이전 버전으로 돌아가고 싶은 경우가 있다. 이때 사용할 수 있는 명령어가 2가지 있는 데 그것이 바로 git revert와 git log이다. 이 두 명령어는 차이가 존재하는 데 이에 대해서 알아보도록 하자.
git revert
특정 시점의 commit 상태로 변경하는 commit을 추가로 수행
git revert 명령은 특정 시점의 commit을 삭제하는 것이 아니라 이전 시점의 commit으로 되돌리는 효과가 나타나도록 새로운 commit을 추가하는 개념에 해당한다. 즉, git revert 명령을 수행하면 파일의 상태는 해당 commit 시점으로 돌아갈 수 있지만 여전히 git log에는 기록이 남아있기 때문에 revert한 commit은 나중에 복구하고 싶다면 복구할 수 있다.
git reset
특정 시점의 commit을 삭제
git reset 명령은 특정 시점의 commit을 완전히 삭제한다. 즉, git reset 명령을 수행하면 commit log를 포함해서 해당 commit과 관련된 모든 정보가 삭제되기 때문에 한번 삭제하면 복구가 불가능하다.
그렇다면 이를 실습을 통해서 확인해보도록 하자. 아래와 같이 commit이 수행되어 있는 프로젝트 디렉터리에서
각 버전별 파일의 내용은 다음과 같다.
각 버전별 차이가 눈에 더 잘보이도록 하기 위해서 간단한 소스로 구성하였다. 여기서 최근에 commit 한 ver 1.3에 문제가 있어 다시 ver 1.2로 돌아가야하는 상황이라고 가정해보자.
여기서 다음의 명령어를 입력해보도록 하겠다.
git revert HEAD
해당명령어를 입력하면 다음과 같이 에디터창이 열리게 된다.
이는 사용자가 버전을 되돌리는 revert를 수행함에 있어서 그 이유를 나중에도 확인하도록 하게하기 위한 메시지를 입력하는 것이다. 즉, revert는 특정시점의 커밋으로 변경하는 commit을 추가로 수행하는 작업이라고 생각하면 된다. 추가적인 commit을 수행하면서 이에 대한 commit message를 추가하는 것이다. 해당 메시지에 버전을 되돌리는 사유와 같은 내용들을 입력해주면 된다.
이를 수행한 후 git log를 입력해서 commit log를 조회해보면
다음과 같이 버전을 되돌리기 위한 커밋을 추가적으로 수행한 것을 확인할 수 있다. 그렇다면 hello.c 파일을 열어보도록 하자.
다음과 같이 ver 1.3에서 ver 1.2로 되돌아 간 것을 확인할 수 있다.
그렇다면 reset의 경우에는 어떨까? revert와 달리 reset은 되돌리는 버전 이후의 버전들에 대한 기록을 전부 삭제한다.
그렇기 때문에 삭제된 commit은 되돌리는 것이 불가능 하므로 사용시에 주의가 필요하다.
git reset에 대해서 자세히 알아보기 전에 우선 git reset과 함께 사용하는 옵션들에 대해서 알아보도록 하겠다. git reset과 같이 사용하는 옵션은 다음과 같다.
--hard |
해당 commit ID의 상태로 Working dirctory와 staging area 모두 초기화 된다(Working directory의 내용까지 모두 변경되므로 이에 대한 주의가 필요하다.) | |
--mixed |
해당 commit ID의 상태로 staging area는 초기화 되고 Working directory는 변경되지 않는다. 옵션을 별도로 입력하지 않는 경우 이 --mixed를 기본값으로 사용한다. | |
--soft |
해당 commit ID의 상태로 Working dirctory와 staging area 모두 변경되지 않는다. |
이제 다음의 환경에서 각 옵션별로 사용하여 실습을 진행해보도록 하겠다.
각 버전별로 파일의 내용은 이전에 git revert를 실습할 때와 같다. 다음의 상황에서 1.1 버전으로 되돌리고 싶다고 할 때, 각각의 옵션별로 수행결과를 살펴보면
--hard |
해당 commit ID의 상태로 Working dirctory와 staging area 모두 초기화 된다.(Working directory의 내용까지 모두 변경되므로 이에 대한 주의가 필요하다.) |
commit의 시점을 1.1 버전의 시점으로 되돌리기 위해서 hard 옵션을 사용해서 다음과 같이 명령어를 입력하겠다.
git reset --hard bd3f28c |
다음과 같이 commit log, Working directory, staging area가 모두 버전 1.1 시점으로 돌아간 것을 확인할 수 있다. 다음과 같이 --hard 옵션을 사용하면 그 동안 작업했던 내용들을 완전히 초기화 시켜버릴 수 있기 때문에 사용 시에 각별한 주의가 필요하다.
이번에는 --mixed 옵션을 사용해보도록 하겠다.
--mixed |
해당 commit ID의 상태로 staging area는 초기화 되고 Working directory는 변경되지 않는다. 옵션을 별도로 입력하지 않는 경우 이 --mixed를 기본값으로 사용한다. |
다음의 상황에서 이전과 동일하게 버전 1.1의 시점으로 돌아가기 위해서 다음과 같이 명령어를 입력해보면
git reset --mixed bd3f28c |
다음과 같이 commit시점은 ver 1.1의 시점으로 되돌아 갔지만 Working directory에서는 ver 1.3의 내용을 유지하고 있다. 그리고 ver 1.3의 내용을 담고 있는 파일이 modified 상태로 status 상에서 나타나는 것을 확인할 수 있다.
마지막으로 --soft 옵션을 사용해보도록 하겠다.
--soft |
해당 commit ID의 상태로 Working dirctory와 staging area 모두 변경되지 않는다. |
다음의 상황에서 이전과 동일하게 버전 1.1의 시점으로 돌아가기 위해서 다음과 같이 명령어를 입력해보면
git reset --soft 60cc47e |
다음과 같이 commit시점은 버전 1.1의 시점으로 돌아갔지만 Working directory에서는 버전 1.3의 hello.c를 그대로 유지하고 있고 staging area에도 modified 상태의 버전 1.3의 hello.c 가 유지되고 있는 것을 확인할 수 있다.
다음과 같이 각 옵션이 가지는 특징이 다르므로 필요한 상황에 따라서 적적한 옵션을 선택하여서 활용하는 것이 중요하다. 무엇보다 git reset은 잘못하면 작업내용을 모두 날릴 수도 있는 위험한 명령이므로 항상 주의해서 사용하는 것을 잊지 말도록 하자.
'Tools > Git, Github' 카테고리의 다른 글
github을 이용한 협업상황에서의 질문 (0) | 2021.01.21 |
---|---|
git rebase (0) | 2021.01.20 |
Git 실습 시나리오 따라해보기(3) (0) | 2021.01.18 |
Git 실습 시나리오 따라해보기(2) (0) | 2021.01.18 |
Git 실습 시나리오 따라해보기(1) (0) | 2021.01.17 |
댓글
이 글 공유하기
다른 글
-
github을 이용한 협업상황에서의 질문
github을 이용한 협업상황에서의 질문
2021.01.21 -
git rebase
git rebase
2021.01.20 -
Git 실습 시나리오 따라해보기(3)
Git 실습 시나리오 따라해보기(3)
2021.01.18 -
Git 실습 시나리오 따라해보기(2)
Git 실습 시나리오 따라해보기(2)
2021.01.18