branch에는 switch, 파일에는 restore
오랫동안 git checkout은 서로 다른 두 일을 맡았어. branch를 바꾸는 일과 이력에서 파일을 복원하는 일이야. 이 과적재는 입문자 실수를 자주 불렀지. git checkout file.js를 파일을 연다는 뜻으로 오해해 commit하지 않은 편집을 통째로 날리는 식이야. Git 2.23(2019)은 역할을 git switch(branch)와 git restore(파일)로 나눴어. 새 명령이 의도를 더 분명하고 안전하게 드러내니 현대적인 안내라면 이쪽을 쓰는 게 맞아.
git switch <branch>는 현재 branch를 바꾸고, git switch -c <branch>는 만들면서 옮겨가. git switch -는 cd -처럼 직전 branch로 돌아가고, git switch --detach <commit>는 의도적으로 detached HEAD 상태에 들어가. 옛 git checkout도 여전히 작동하고 오래된 문서에서 보게 되겠지만, 새 작업에는 switch를 우선해.
Detached HEAD는 HEAD가 branch 이름을 거치지 않고 commit을 직접 가리키는 상태야. 오류가 아니라 옛 commit을 살피거나 tagged release를 빌드할 때 유효한 상태지. 다만 이곳에서 만든 commit은 어느 branch에도 속하지 않아. 다른 곳으로 switch하면 orphan이 돼. 떠나기 전에 git switch -c rescue-branch를 실행하면 HEAD의 정확한 자리에 branch가 생겨 작업을 붙잡아줘.
switch하기 전에 Git은 작업 트리를 확인해. 옮겨가면서 commit하지 않은 변경을 덮어쓰게 된다면 명령을 거부하지. 이때는 현재 작업을 commit하거나 amend하고, 아직 commit할 때가 아니라면 git stash push -u로 stash해. git config --global advice.detachedHead false로 detached HEAD 안내를 숨기는 팀도 있지만, 뜻을 충분히 이해한 다음에만 써.