현재 로컬 저장소의 README 파일에는 추가 과정을 거치지 않았다면 "Git 테스트를 위한 발걸음"이라는 문구가 저장되어 있을 것이다.
이 문구를 "Git Test Start!"로 바꿔본 후 다시 커밋 시켜보자.
이후 git log
를 입력하면 (커밋 메시지는 다르더라도) 아래와 같이 나올 것이다.
이젠 README 파일에 저장된 문구를 다시 "Git 테스트를 위한 발걸음"으로 바꿔보자.
(즉, 이전 버전으로 원복 시켜보자)
git checkout [커밋 ID]
우리는 최초 커밋 시의 README 파일로 되돌리고 싶은 것이므로 git checkout c4a464b5719d273ae8b1eed849cffe289991235a
를 입력하면 될 것이다.
이후 README 파일을 확인해 보자.
정상적으로 원복 되었다!
물론 git checkout c4a464b5719d273ae8b1eed849cffe289991235a
로 커밋 ID를 통해 되돌릴 수도 있지만, 최신 커밋으로 되돌릴 경우 커밋 ID 대신 간단히 '-'만 입력해도 된다.
즉, git checkout -
를 입력해도 최신 커밋의 README로 되돌릴 수 있다.
최신 커밋의 README로 되돌려졌음을 확인할 수 있다.
Git에서는 checkout
명령을 통해 원하는 시점(커밋)으로 파일을 되돌릴 수 있다.
이를 "체크아웃 한다"라고도 부른다.
git checkout
명령을 사용할 때 커밋 ID를 사용하는데, 이때 위 실습처럼 모든 커밋 ID를 사용하지 않아도 앞 7자릿값만 존재한다면 정상적으로 checkout이 가능하다.
즉, git checkout c4a464b5719d273ae8b1eed849cffe289991235a
에서 앞 7자리만 가지고 와 git checkout c4a464b
로 입력해도 동일한 동작을 한다는 것이다.
checkout
명령은 Git에서 오래전부터 애용되오던 명령어이다 보니 명령 1개에 너무 많은 기능이 포함되어 있다.
위 예시처럼 다른 커밋으로 갈 때도 git commit
을 사용할 수 있지만 새로운 (로컬) 브랜치로 이동하기, 특정 파일을 복구하는 용도로도 사용될 수 있다.
# checkout을 통한 특정 파일 복구 방법
git checkout <커밋 ID> <특정 파일 경로>
또한 checkout
을 통해 원격 브랜치에 체크아웃하면 원격 브랜치의 내용을 로컬 환경에 가져오는 역할도 할 수 있다.
이렇게 많은 기능을 가지고 있다 보니 Git은 checkout
명령어를 switch
라는 브랜치 이동 명령어와 restore
라는 파일 복구 명령어로 나누었다.
하지만 checkout에만 존재하는 기능도 몇 가지 존재하기 때문에, git checkout
을 아예 잊어버리면 안 되겠다.
(예를 들어, git checkout
에서는 커밋 아이디를 통해 특정 커밋을 지정해서 돌아갈 수 있지만 git switch
에는 해당 방법이 존재하지 않는다. 이는 커밋 ID를 지정하여 특정 커밋으로 되돌아가는 것이 매우 위험한 명령이기 때문이다.)
위에서 git checkout
으로 특정 커밋으로 이동할 때 c4a464b5719d273ae8b1eed849cffe289991235a
와 같이 숫자와 문자로 이루어진 암호문 같은 값이 존재했다.
이 값은 커밋 체크섬으로 커밋 ID라고 부른다.
커밋 ID는 생성되는 모든 커밋마다 고유하게 존재하며, 전 세계에서 유일한 값을 가진다.
커밋 ID는 소문자 + 숫자 조합의 40자로 SHA1 Hash Checksum 값으로 구성된다.
여기서 SHA1 해시 체크섬이란 SHA1 암호 알고리즘을 활용해 만들어낸 체크섬이라는 의미이다.
이러한 커밋 ID는 모든 커밋이 가지고 있는 전 세계에서 유일한 40자릿값이지만 커밋에 대한 작업을 수행할 때마다 40자리를 모두 입력하는 것은 힘들다.
따라서 Git은 앞 7자리만 화면에 보여주고 앞 7자리만 입력해도 정상적으로 CLI에서 커밋 처리를 수행할 수 있게 만들어졌다.