파일을 관리하다보면 과거로 이동해야할때가 종종 필요합니다.
이번시간에는 Git
에서 중요한 reset
, checkout
기능을 알아보겠습니다.
두 명령을 실행했을때 git
의 내부에서 어떻게 변화되는지 알아보고 두 명령의 차이점 또한 알아보는 시간을 가져보도록 하겠습니다.
먼저 f2.txt
파일을 만든 후에 add
와 commit
를 해줍시다. commit
메세지는 로 하겠습니다.
이번에도 똑같은 작업을 반복해줍니다. f2.txt
내용에 b
를 추가했습니다.
이번에도 c
를 추가했습니다.
마지막으로 d
까지 추가해줬습니다.
총 4번의 작업을 반복했습니다.
만약 이때 commit id
가 1f653bcc09b60573b92c6510a9309ba2cd3fc4a3
인 상태로 돌아가고 싶으면 어떻게 해야할까요?
즉 그 위에있는 301af2f46eb7225377f25456a9cce262f409b23b
의 commit
을 삭제할려면 어떻게 해야하는지 알아봅시다.
git reset --hard commit_id
를 실행해봅시다.
이제 git log
를 하면 commit
메세지가 4 인 부분이 사라졌습니다.
gistory .git
을 실행하고 localhost:8805
에 접속하면 .git\refs\heads\master
파일이 수정되었다고 뜹니다. 이전에 이 파일의 역할에 대해 알아봤는데 , 이 파일은 현재 checkout
한 위치에서 최신 commit
을 알려주는 역할을 합니다.
이때 가르키는 최신 commit id
는 1f653bcc09b60573b92c6510a9309ba2cd3fc4a3
입니다.
즉 git
은 HEAD
- refs/heads/master
로 이동해서 최신 commit id
를 확인하는 것입니다.
따라서 reset
을 한다는 것은 checkout
하고있는 현재 branch
에서 그 branch
가 가르키는 최신 commit
을 바꾸는 행위라고 볼 수 있습니다.
그러면 우리가 취소한 의 commit
메세지는 정말 지워진 것일까요?
git
은 웬만해서는 어떠한 정보도 지우지 않습니다.
만약에 reset
을 했는데 취소는 어떻게 할까요?
일단 gistory
로 돌아가서 .git\ORIG_HEAD
파일을 봅시다.
여기에 아까 삭제한 의 commit
에 대한 정보가 담겨있습니다.
.git\ORIG_HEAD
에서는 어떤 위험한 명령 또는 정보를 잃어버릴 수 있는 가능성이 있다면 git
은 현재 branch
에 최신 commit
을 기록한다음에 위험한 명령을 실행합니다.
.git\logs\refs\heads\master
로 가봅시다.
첫번째 있는 commit id
는 301af2f46eb7225377f25456a9cce262f409b23b
로 우리가 삭제한 를 담고있는 commit
이고 그 다음에 있는 1f653bcc09b60573b92c6510a9309ba2cd3fc4a3
이 부분이 을 담고있는 commit
입니다.
즉 .git\logs\refs\heads\master
의 파일은 master
에서 여러가지 활동을 기록하는 저장소 입니다.
따라서 git reset --hard ORIG_HEAD
를 통해 reset
을 취소 할 수 있습니다.
git reflog
를 하면 이때까지 한 commit
을 모두 출력해줍니다.
이번에는 git checkout
에다가 branch
이름을 넣지 말고 commit id
를 넣어보겠습니다.
그러면 git branch
를 실행시 commit id
를 가르키게 됩니다.
그렇다면 내부적으로 어떤 변화가 발생하였을까요?
gistory
로 이동 후에 HEAD
를 보면 branch
를 가르키는게 아니라 commit id
를 가르키고 있습니다. 즉 현재 우리의 HEAD
는 특정 commit
를 가르키고 있습니다. 이를 detached HEAD
라고도 표현합니다.
이제 다시 master
로 이동한 후 gistory
를 보겠습니다.
이제 HEAD
는 commit id
가 아니라 master
를 가르키게 되었습니다.
따라서 reset
은 .git\ORIG_HEAD
와 .git\logs\refs\heads\master
에서 commit
을 저장한다음에 되돌아 가는 것이고
git checkout
은 HEAD
가 돌아가고자 하는 commit id
를 가르키도록 하는 것입니다.
이제까지 checkout
과 reset
에 대해 알아보았고 그 차이를 알아보았습니다.