[Git] reset, revert - 깃 수정 내용 및 버전 되돌리기
깃 시작하기 - 설치와 기본 사용법
`Do it! 지옥에서 온 문서 관리자 깃&깃허브 입문`의 내용을 정리합니다. 이 글에서 작업한 파일 내용, 스테이지에 올렸던 파일, 커밋 을 작업 전으로 되돌리는 방법을 알아봅니다.
해당 내용은 기존에 작성한 깃 시작하기(scshim.tistory.com/232)의 글을 이어서 작성합니다. 기존 글을 보지 않아도, 디렉토리를 하나 정하여 hello.txt, hello2.txt파일을 생성한 후 깃 저장소를 만든 후(git init) 실습을 진행할 수 있습니다.
학습 목표
ㆍ작업 트리에서 수정한 파일 되돌리기, git checkout
ㆍ스테이징 취소하기, git reset HEAD 파일 이름
ㆍ최신 커밋 되돌리기, git reset HEAD^
ㆍ커밋 삭제하지 않고 되돌리기, git revert
ㆍgit reset vs git revert
작업 트리에서 수정한 파일 되돌리기, git checkout
hello.txt 파일을 열어 숫자 ‘3’을 ‘three’로 수정 후 저장한다.
git status 명령어로 현재 파일 상태를 확인하자. 두 번째 괄호 안의 메시지(git checkout~)에 작업 트리(디렉토리)의 변경 사항을 취소하려면 checkout을 사용하라고 되어 있다.
git checkout 명령 다음에 붙임표 2개(--)를 붙이고 한 칸 뛴 다음 파일 이름을 쓴다.
$ git checkout -- hello.txt
정상적으로 처리되면 화면에 아무것도 나타나지 않는다. hello.txt 파일 내부를 확인해보자. 추가했던 ‘three’가 사라지고 ‘3’이 그대로 남아있는 걸 확인할 수 있다.
스테이징 취소하기, git reset HEAD 파일 이름
수정된 파일을 스테이징했을 때, 스테이징을 취소하는 방법을 알아보자. 먼저 hello2.txt 파일을 열어 기존 내용을 지우고 ‘A’, ‘B’, ‘C’, ‘D’를 입력, 저장한다.
git add 명령으로 hello2.txt 파일을 스테이지에 올린 후 git status 명령으로 파일의 상태를 확인한다. 상태 메시지 중 괄호 안의 내용을 살펴보자. 스테이지에서 내리려면 git reset HEAD 명령어를 사용하라고 되어 있다.
git reset HEAD 명령어를 사용하여 hello2.txt를 스테이지에서 내려보자.
$ git reset HEAD hello2.txt
hello2.txt가 스테이지에서 내려졌다(unstaged)는 메시지가 출력되었다.
다시 git status를 사용해 파일의 상태를 확인하자. 파일이 아직 스테이지에 올라가기전(not staged)으로 돌아간 것을 확인할 수 있다.
최신 커밋 되돌리기, git reset HEAD^
수정된 파일을 스테이징 후 커밋까지 했을 때, 가장 마지막에 한 커밋을 취소하는 방법을 알아보자. hello2.txt 파일을 열어 대문자 ‘E’를 추가한 후 저장한다.
git commit 명령으로 스테이징과 커밋을 함께 실시한다.
$ git commit -am “fourthCommit”
이후 git log 명령으로 상태를 확인한다. 최신 커밋 메시지가 ‘fourthCommit’이다.
이제 git reset HEAD^ 명령으로 최신 커밋을 되돌려보자.
$ git reset HEAD^
커밋이 취소되고 스테이지에서도 내려졌다는 메시지를 볼 수 있다.
git log 명령으로 현재 상태를 확인해봐도 ‘fourthCommit’ 커밋이 사라졌다.
reset 명령은 옵션에 따라 되돌릴 수 있는 단계가 다르다.
--soft HEAD^ : 최신 커밋을 하기 전 상태로 작업 트리 되돌리기
--mixed HEAD^ : 최신 커밋과 스테이징 하기 전 상태로 작업 트리 되돌리기(기본 옵션)
--hard HEAD^ : 최신 커밋과 스테이징, 파일 수정을 하기 전 상태로 작업 트리 되돌리기. 이 옵션으로 되돌린 내용은 복구할 수 없다.
git reset 커밋해시, 특정 커밋으로 되돌리기
깃에는 파일을 수정하고 커밋할 때마다 저장된 버전들이 쌓인다. 여기서 특정 커밋으로 되돌릴 때는 git reset 명령 다음에 커밋 해시를 사용한다.
연습을 위해 몇 개의 커밋을 만들어 보자. rev.txt를 만들어 ‘a’를 입력한 후 저장한다.
rev.txt를 스테이지에 올린 후 ‘R1’ 메시지와 함께 커밋한다.
$ git add rev.txt
$ git commit -m “R1”
rev.txt를 다시 열고 ‘b’를 추가하고, ‘R2’ 메시지와 함께 커밋한다.
$ git add rev.txt
$ git commit -m “R2”
git log 명령을 사용해서 로그 목록을 확인한다. 최신 커밋인 R2에서 기존 버전인 R1 커밋으로 되돌아가 보자. 되돌아갈 목표 커밋인 R1 커밋의 커밋 해시를 복사한다.
git reset 명령어에 --hard 옵션을 입력한 후 복사한 커밋 해시를 붙여넣는다.
$ git reset --hard 578a8dadfa9dacba8fff2e711c6705274286c848
HEAD가 방금 붙여 넣은 커밋 해시 위치로 옮겨졌다. 즉, 해당 커밋이 가장 최신 커밋이 되었다.
커밋 삭제하지 않고 되돌리기, git revert
커밋을 되돌릴 때 수정한 내용을 삭제하지 않고, 나중에 사용할 것을 대비해서 취소한 커밋을 남겨두어야 할 때가 있다. 이때는 git reset이 아닌 git revert라는 명령을 사용한다.
앞서 문자 ‘a’가 입력되어있는 rev.txt 파일에 문자 ‘b’를 추가한다.
수정한 파일을 ‘R2’라는 메시지와 함께 커밋한다.
$ git add rev.txt
$ git commit -m “R2”
git log를 입력해 버전을 확인한다. 최근 커밋한 R2에서, R1 커밋으로 되돌아가보자. 취소하려는 버전인 R2 커밋의 커밋해시를 복사한다.
그리고 다음과 같이 입력한다.
$ git revert 복사한R2커밋해시
revert 명령이 동작하면, 깃을 설치할 때 지정했던 편집기가 자동으로 나타난다. 이곳에서 커밋 메시지를 입력할 수 있다. 커밋 메시지 맨 위에는 어떤 버전을 revert 했는지 확인할 수 있다. 커밋 메시지로 ‘일시적으로 커밋 보류함’을 입력하고 저장한다.
다시 git log를 입력하자. 로그에 R2를 revert한 새로운 커밋이 생성되었다. 그리고 기존 R2 역시 사라지지 않았다. R2 버전을 지우는 대신 R2에서 변경했던 이력을 취소한 새 커밋을 만든 것이다.
R2 커밋을 취소한 것이 문서에도 반영되었는지 문서를 열어 확인해보자. 앞서 추가한 ‘b’ 문자가 없어졌다.
git reset vs git revert
git reset 명령어는 취소하려는 커밋 자체를 커밋 이력에서 제외하지만, git revert는 커밋 변경 사항을 되돌렸다는 새로운 커밋을 커밋 이력에 생성한다.
git reset으로 커밋 이력을 깔끔하게 유지할 수 있지만, 여러 개발자가 함께 협업하는 프로젝트에서는 git revert로 작업을 되돌리는 이력도 서로 확인할 수 있는 것이 좋다.
출처
Do it! 지옥에서 온 문서 관리자 깃&깃허브 입문