#23 Git - Reset checkout

김현준·2022년 12월 25일
0

GIT

목록 보기
23/41
post-custom-banner

파일을 관리하다보면 과거로 이동해야할때가 종종 필요합니다.
이번시간에는 Git 에서 중요한 reset , checkout 기능을 알아보겠습니다.

두 명령을 실행했을때 git 의 내부에서 어떻게 변화되는지 알아보고 두 명령의 차이점 또한 알아보는 시간을 가져보도록 하겠습니다.

먼저 f2.txt 파일을 만든 후에 addcommit 를 해줍시다. commit 메세지는 11 로 하겠습니다.

이번에도 똑같은 작업을 반복해줍니다. f2.txt 내용에 b 를 추가했습니다.

이번에도 c 를 추가했습니다.

마지막으로 d 까지 추가해줬습니다.

총 4번의 작업을 반복했습니다.

만약 이때 commit id1f653bcc09b60573b92c6510a9309ba2cd3fc4a3 인 상태로 돌아가고 싶으면 어떻게 해야할까요?

즉 그 위에있는 301af2f46eb7225377f25456a9cce262f409b23bcommit 을 삭제할려면 어떻게 해야하는지 알아봅시다.

git reset --hard commit_id 를 실행해봅시다.

이제 git log 를 하면 commit 메세지가 4 인 부분이 사라졌습니다.

gistory .git 을 실행하고 localhost:8805 에 접속하면 .git\refs\heads\master 파일이 수정되었다고 뜹니다. 이전에 이 파일의 역할에 대해 알아봤는데 , 이 파일은 현재 checkout 한 위치에서 최신 commit 을 알려주는 역할을 합니다.

이때 가르키는 최신 commit id 1f653bcc09b60573b92c6510a9309ba2cd3fc4a3 입니다.

gitHEAD - refs/heads/master 로 이동해서 최신 commit id 를 확인하는 것입니다.

따라서 reset 을 한다는 것은 checkout 하고있는 현재 branch 에서 그 branch 가 가르키는 최신 commit 을 바꾸는 행위라고 볼 수 있습니다.

그러면 우리가 취소한 44commit 메세지는 정말 지워진 것일까요?

git 은 웬만해서는 어떠한 정보도 지우지 않습니다.
만약에 reset 을 했는데 취소는 어떻게 할까요?

일단 gistory 로 돌아가서 .git\ORIG_HEAD 파일을 봅시다.
여기에 아까 삭제한 44commit 에 대한 정보가 담겨있습니다.

.git\ORIG_HEAD 에서는 어떤 위험한 명령 또는 정보를 잃어버릴 수 있는 가능성이 있다면 git 은 현재 branch 에 최신 commit 을 기록한다음에 위험한 명령을 실행합니다.

.git\logs\refs\heads\master 로 가봅시다.
첫번째 있는 commit id301af2f46eb7225377f25456a9cce262f409b23b 로 우리가 삭제한 44 를 담고있는 commit 이고 그 다음에 있는 1f653bcc09b60573b92c6510a9309ba2cd3fc4a3 이 부분이 33 을 담고있는 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 를 보겠습니다.

이제 HEADcommit id 가 아니라 master 를 가르키게 되었습니다.

따라서 reset.git\ORIG_HEAD.git\logs\refs\heads\master 에서 commit 을 저장한다음에 되돌아 가는 것이고

git checkoutHEAD 가 돌아가고자 하는 commit id 를 가르키도록 하는 것입니다.

이제까지 checkoutreset 에 대해 알아보았고 그 차이를 알아보았습니다.

profile
울산대학교 IT융합학부 22학번
post-custom-banner

0개의 댓글