Original article: Git Fetch vs Pull: What's the Difference Between the Git Fetch and Git Pull Commands?

Git에서 자주 하는 일 중 하나는 브랜치 전환입니다.

브랜치 전환은 git checkout 명령어를 사용하면 됩니다.

새 브랜치 생성하기

새 브랜치를 만드려면 git checkout 명령어와 함께 -b 플래그와 새 브랜치 이름을 전달해야 합니다.

명령어가 실행되면 현재 작업 중인 브랜치에서 새 브랜치가 생성됩니다. 새 브랜치의 커밋 히스토리는 작업하고 있던 브랜치의 마지막 커밋에서 시작됩니다.

현재 작업 중인 브랜치가 main이라고 가정해봅시다.

(main)$ git checkout -b my-feature
Switched to a new branch 'my-feature'
(my-feature)$

main에서 my-feature라는 새 브랜치가 생성된 것을 확인할 수 있습니다.

Git에서 생성된 브랜치로 전환하기

다른 브랜치로 전환하려면 git checkout-b 플래그 없이 다시 사용합니다. 이동하고 싶은 브랜치의 이름을 명령어와 같이 전달합니다.

예시:

(my-feature)$ git checkout main
Switched to branch 'main'
(main)$

이전 브랜치로 돌아가려면 브랜치 이름 대신 -git checkout과 함께 사용하는 편리한 방법도 있습니다.

(my-feature)$ git checkout -
Switched to branch 'main'
(main)$ git checkout -
Switched to branch 'my-feature'
(my-feature)$

특정 커밋으로 이동하기

특정 커밋으로 이동하는 것도 git checkout로 가능합니다. 대신 브랜치 이름이 아닌 SHA(Secure Hash Algorithm, 안전한 해시 알고리즘)를 명령어와 함께 전달해야 합니다.

브랜치는 사실상 특정 커밋들을 기록하는 포인터 같은 개체이기 때문에 특정 커밋으로의 이동 또한 브랜치 전환과 크게 다르지 않습니다.

커밋 SHA 찾기

특정 커밋의 SHA를 찾는 한 가지 방법은 Git 로그를 조회하는 것입니다.

이때 git log 명령어를 사용합니다.

(my-feature)$ git log
commit 94ab1fe28727b7f8b683a0084e00a9ec808d6d39 (HEAD -> my-feature, main)
Author: John Mosesman <johnmosesman@gmail.com>
Date:   Mon Apr 12 10:31:11 2021 -0500

    This is the second commmit message.

commit 035a128d2e66eb9fe3032036b3415e60c728f692 (blah)
Author: John Mosesman <johnmosesman@gmail.com>
Date:   Mon Apr 12 10:31:05 2021 -0500

    This is the first commmit message.

각 커밋 기록의 첫 번째 줄에는 commit이라는 단어 뒤에 숫자와 문자가 조합된 긴 문자열이 있습니다: 94ab1fe28727...

이 문자열이 SHA입니다. SHA는 특정 커밋을 가리키는 고유 식별자입니다.

특정 커밋으로 이동하려면 커밋의 SHA를 git checkout 매개변수로 전달하면 됩니다.

예시:

(my-feature)$ git checkout 035a128d2e66eb9fe3032036b3415e60c728f692
Note: switching to '035a128d2e66eb9fe3032036b3415e60c728f692'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by switching back to a branch.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -c with the switch command. Example:

  git switch -c <new-branch-name>

Or undo this operation with:

  git switch -

Turn off this advice by setting config variable advice.detachedHead to false

HEAD is now at 035a128 a
((HEAD detached at 035a128))$

참고: 일반적으로 SHA 값의 앞 4-5자만으로도 저장소 안에서 특정 커밋을 충분히 식별할 수 있기 때문에 SHA의 앞 몇 글자로 줄여 써도 됩니다.

detached HEAD(떨어져나온 HEAD) 상태의 의미

특정 커밋을 체크아웃하면 "detached HEAD" 상태가 됩니다.

Git 설명서에 의하면:

[a detached HEAD state(떨어져나온 HEAD 상태)]는 `HEAD`가 특정 브랜치가 아닌 특정 커밋을 직접 참조하고 있는 상태를 말합니다.

HEAD는 Git 히스토리 안에서 사용자가 현재 어느 지점에 있는지 기록하는 Git의 내부 포인터 중 하나입니다. "Detached HEAD" 상태는 HEAD가 기존 브랜치에서 우회했다는 것을 의미합니다. 이 시점에서 새 변경 사항이 발생하면 Git 히스토리에서 새로운 경로가 생성됩니다.

Git은 사용자가 "detached HEAD" 상태에서 작업하고 싶다는 것을 확인하기 위해 실험적인 변경이 가능한 "여유 공간"을 제공합니다.

출력된 메세지에 의하면:

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by switching back to a branch.

한글 번역: 
현재 '떨어져나간 HEAD' 상태에 있습니다. 둘러보고 실험적 변경을 실행하고 커밋할 수 있습니다.
또한 브랜치 전환을 하면 다른 브랜치에 영향을 주지 않고 
'떨어져나간 HEAD' 상태 중 실행한 커밋을 취소할 수 있습니다.

이런 경우 두 가지 옵션이 있습니다.

  • 실험한 다음 이전 브랜치로 돌아가 변경 사항을 취소하기
  • 작업 후 이 지점부터 새 브랜치 생성하기

git switch 명령어를 통해 변경한 내용을 취소하고 이전 브랜치로 돌아갈 수 있습니다.

변경 이력을 유지한 상태로 작업을 계속하려면 git switch -c <새-브랜치-이름>를 사용해 현재 커밋 히스토리부터 시작하는 새 브랜치를 만들 수 있습니다.

요약

git checkout 명령어는 여러모로 유용한 명령어입니다.

이 명령어 하나로 브랜치 생성, 브랜치 전환, 특정 커밋 이동 등과 같은 작업이 가능합니다.

이 튜토리얼이 마음에 드셨다면, 제 트위터 계정사이트를 통해 이런 주제에 대한 글을 확인할 수 있습니다.