“과거로 돌아가 보자!!”
이번 글에서는 이전 커밋으로 돌아가거나, 파일을 복구하거나 하는 Git의 개념들에 대해 정리해보려고 한다.
git restore
git restore는 ‘파일을 되돌리는 명령어’다.
$ git restore a.txt
- a.txt 파일을 ‘최신 커밋’ 시점으로 되돌린다.
$ git restore --source <커밋아이디> a.txt
- a.txt를 특정 커밋 시점으로 되돌린다.
- 당연히 git log –oneline으로 커밋 아이디는 알아내서 입력해야한다.
$ git restore --staged a.txt
- 스테이징된 a.txt 파일을 staging 취소를 해버릴 수 있다.
$ git restore .
- 현재 작업 디렉토리의 모든 파일을 최신 커밋의 상태로 복구한다.
- 여러 파일이 restore가 되는 것임.
git revert
git revert는 특정 커밋 시점에서의 파일 변경사항을 없애고 새로운 commit을 만드는 명령어다.

예를 들어, 다음처럼 커밋을 계속하고 있는데, b파일을 생성했던 커밋을 취소해서 그때 변경 사항을 없애고 싶을 때 쓰는 것이다.
근데 실제로 commit까지 없애는 것은 아니다. 다 커밋 기록에는 남아있지만, 그 커밋에서의 변경사항을 없앤 새로운 커밋을 만드는 것이다.
git revert <특정 커밋아이디>
이걸 입력하면 아래와 같이 Vim 에디터가 뜬다.

커밋 메시지를 수정하라는 건데, 여기서 수정을 하려면 지금의 ‘일반 모드’를 ‘삽입(insert) 모드’로 바꿔줘야 한다.
‘i’를 누르면 삽입모드로 변경된다. (만약 아무거나 눌러서 날아갔다면 Esc 버튼을 눌러서 일반모드로 간 후에, ‘u’를 누르면 복구가 된다.)
삽입모드에서 메시지를 수정했다면, Esc를 눌러 일반모드로 간 후에, :wq를 누르고 엔터를 누르면 저장이 완료된다.(Vim에디터 처음에 너무 쫄았는데 별 거 없는 것 같다.)

그럼 다음과 같이 새로 커밋이 생성된다. 이전 커밋도 당연히 남아있기 때문에 취소했던 걸 다시 취소(?)도 할 수 있다.
git reset
git reset은 가장 극단적으로 과거로 되돌리는 명령어다. 실제 협업을 할 때는 잘 사용하지 않는다고 한다.
git reset은 완전히 과거 상태로 되돌아가기 때문에 그 과거 시점 이후 commit은 전부 사라진다.
다만 옵션들에 따라 정도의 차이가 있다.
git reset –hard
$ git reset --hard <특정 시점 커밋아이디>
가장 강력한 옵션이다. 과거 시점으로 돌아가면서 이후 커밋된 내용들은 아예 흔적도 안남기고 삭제해 준다.
git reset –soft
$ git reset --soft <특정 시점 커밋아이디>
다소 부드러운 옵션이다. 특정 커밋 시점으로 돌아가지만, 이후 커밋 내용들이 staging area에 남게 된다.
즉, 다시 commit하면 이후 내용을 남길 수 있다.
git reset –mixed
이 친구는 과거 커밋 시점으로 돌아가면서, 이후 커밋 내용이 working directory에 남게 된다.
또한 git reset의 기본값이기 때문에, 위의 다른 옵션을 딱히 작성하지 않는다면 –mixed의 옵션이 적용된다.
$ git reset --mixed <특정 시점 커밋아이디>
$ git reset <특정 시점 커밋아이디> : 똑같다~
No Responses