버전을 이동하는 checkout 명령어와 이전 버전으로 시간을 되돌리는 reset 명령어의
차이점을 분명하게 알기 위해서 예제를 살펴 보겠습니다.
현재 그림을 살펴보면, Head는 master branch
를 가르키고 있고 master branch
에 위치는
커밋 1번 버전 입니다. 그리고 master branch
에서 파일을 수정하고 새로 커밋을 저장했어요
새로 생성된 커밋은 2번이고, master branch
의 위치가 2번 커밋이 되었어요.
Head commit은 master branch
의 2번 커밋을 가르키게 됩니다.
master branch
는 더이상 커밋을 원하지 않고, 이후의 작업들은 새로 저장소를 생성해서
작업을 이어 나가기 위해 google branch
를 생성하게 되요
google branch
를 생성하고, checkout 명령어를 통해서 저장소를 google
로 변경하게 되요.
Head commit 또한 자연스럽게 google branch
의 2번 커밋으로 이동하게 되죠.
이제 google branch
에서 한 가지 작업을 진행하고 커밋을 하게 됩니다.
저장소에 3번 커밋이라는 최신 커밋이 생겼어요.
google branch
의 현재 위치는 새로 생성한 3번 커밋이며, HEAD 또한 google
의 3번
커밋으로 이동하게 되요.
master branch
에서 파생된 google branch
는 더이상 master branch
와 같은 내용을
갖고 있지 않게 되었어요. 서로 다른 버전을 갖게 됩니다.
모든 작업이 종료되고 google branch
에서 checkout 명령어를 통해 master branch
로
이동을 했어요.
저장소가 master branch
에 2번 커밋으로 이동 되고, Head 또한 master branch
에 2번 커밋
으로 이동하게 됩니다. 여지껏 진행한 결과를 보니 문득 이런 생각을 할 수 있습니다.
checkout 명령어란, 버전을 이동한다고 볼 수 있지만 결과적으로는 Head가 이동되는 것이구나!
하고 말이에요. 그리고 더 놀라운 사실은 checkout 명령어는 브랜치 뿐만 아니라, 브랜치의
커밋으로도 이동할 수 있다는 사실이에요.
checkout commit1 이라고 실행하게 되면, branch
가 아니라 HEAD가 1번커밋을 직접적으로
가르키게 됩니다. 이렇게 브랜치가 아닌 커밋으로 이동한 Head를 GIT
에서는 Detached HEAD
라고 부릅니다.
Check Out는 HEAD
를 변경하고, Reset은 Branch
를 변경한다고 생각해도 됩니다.
위 이미지에서 reset commit2 을 실행하게 되면 checkout와 어떤 차이점이 나타날까요?
3번 커밋에 위치에 있던 google branch
는 reset 명령어로 인해 저장소의 버전이 2번 커밋으로
바뀌면서 2번 커밋 이후에 있던 모든 커밋은 사라지게 됩니다.
checkout이 HEAD을 이동하는 것이라면, reset은 브랜치를 과거로 되돌린다고 보시면 됩니다.