git switch 사용법
git switch는 브랜치를 전환하기 위해서 사용하는 Git 명령어입니다.
Git 2.23 버전(2019년 8월)에서 처음 도입되었으며, 기존 git checkout 명령어의 브랜치 전환 기능을 좀 더 명확하고 안전하게 사용할 수 있도록 설계되었습니다.
레거시 명령어인
git checkout에 대해서는 별도 포스팅에서 다루고 있으니 참고 바랍니다.
브랜치 전환
가장 기본적인 사용법은 이미 존재하는 브랜치로 전환하는 것입니다.
$ git switch <브랜치명>
예를 들어, main 브랜치로 전환하려면 다음과 같이 입력합니다.
$ git switch main
feature/user-auth라는 이름의 feature 브랜치로 전환할 수도 있습니다.
$ git switch feature/user-auth
몇 가지 유용한 팁을 드릴께요.
- 기호를 사용하면 바로 직전에 있던 브랜치로 빠르게 전환할 수 있습니다.
두 브랜치를 자주 오가며 작업할 때 매우 유용합니다.
$ git switch -
대부분의 최신 쉘 환경에서는 Git 자동 완성이 기본으로 제공됩니다. 우선 브랜치 이름을 입력할 때는 TAB 키를 사용하여 자동 완성 기능을 활용하면 편리합니다.
브랜치 생성 후 전환
git switch 명령어로 이미 존재하지 않는 브랜치로 전환하려고 하면 다음과 같은 오류가 발생합니다.
$ git switch unknown
error: pathspec 'unknown' did not match any file(s) known to git
새로운 브랜치를 만들면서 동시에 해당 브랜치로 전환하려면 -c 또는 --create 옵션을 사용합니다.
$ git switch -c <브랜치명>
예를 들어, feature/login-page라는 새 브랜치를 만들고 바로 전환하려면 다음과 같이 입력합니다.
$ git switch -c feature/login-page
Switched to a new branch 'feature/login-page'
특정 지점에서 브랜치 생성
현재 브랜치가 아닌 다른 브랜치나 특정 커밋이나 태그에서 새로운 브랜치를 따고 싶을 때가 있습니다. 이럴 때는 두 번째 인자에 새로운 브랜치를 시작하고 싶은 지점을 명시해주면 됩니다.
$ git switch -c <브랜치명> <시작-지점>
예를 들어, v1.2.0 태그를 기반으로 릴리스 브랜치를 만들려면 다음과 같이 입력합니다.
$ git switch -c release/v1.2.0 v1.2.0
특정 커밋 해시를 기반으로 버그 수정 브랜치를 만들 수도 있습니다.
$ git switch -c fix/123 a1b2c3d
이 방법은 어떤 피쳐 브랜치에서 작업을 하다가 갑자기 디폴트 브랜치를 기반으로 다른 피쳐 브랜치를 만들어야 할 때 특히 유용합니다.
# 현재 feat1 브랜치에 있음
$ git branch --show-current
feat1
# main 브랜치 기준으로 feat2 브랜치를 생성 후 이동
$ git switch -c feat2 main
이는 다음 두 명령어를 한 번에 실행하는 것과 같습니다.
$ git switch main
$ git switch -c feat2
-C 옵션(대문자)을 사용하면 이미 존재하는 브랜치를 강제로 재생성하면서 전환할 수 있습니다.
$ git switch -C <브랜치명> <시작-지점>
예를 들어, feature/new이라는 브랜치가 이미 존재하는데 기존 작업 내용을 버리고 main을 기반으로 다시 만들고 싶다면 다음과 같이 입력합니다.
$ git switch -C feature/new main
기존 브랜치의 작업 내용이 완전히 손실될 수 있으므로 매우 신중하게 사용해야 합니다.
특정 커밋이나 태그로 이동
이전 커밋을 코드를 임시로 확인하거나 테스트하기 위해서 브랜치가 아닌 특정 커밋으로도 직접 이동해야 할 때가 종종 있습니다.
그런데 git switch는 기본적으로 브랜치 전환을 위한 명령어이기 때문에 커밋 해시를 직접 입력하면 다음과 같은 오류가 발생하죠
$ git switch a1b2c3d
fatal: a branch is expected, got commit 'a1b2c3d'
hint: If you want to detach HEAD at the commit, try again with the --detach option.
HEAD 포인터가 브랜치를 가리키지 않고 특정 커밋을 직접 가리키는 상태를 보통 Detach 되었다고 하는데요.
즉, Detached HEAD는 HEAD가 브랜치로 부터 떨어져나온 상태를 의미합니다.
그래서 특정 커밋으로 이동하려면 d 또는 --detach 옵션을 명시적으로 사용해야 합니다.
$ git switch -d <커밋-해시>
특정 태그로 이동할 수도 있습니다.
$ git switch -d v1.0.0
최근 커밋으로 이동할 때는 HEAD~ 또는 HEAD^과 같은 표현식을 사용할 수 있습니다.
예를 들어, 3개 커밋 이전 상태를 확인하려면 다음과 같이 입력합니다.
$ git switch -d HEAD~3
Note: switching to 'HEAD~3'.
You are in 'detached HEAD' state...
Git에서 HEAD가 무엇을 의미하는지에 대해서는 별도 포스팅에서 자세히 다루고 있으니 참고 바랍니다.
브랜치 강제 전환
로컬에 커밋하지 않은 변경사항이 있을 때 브랜치를 전환하려고 하면 Git이 경고를 표시합니다.
$ git switch main
error: Your local changes to the following files would be overwritten by switch:
src/app.js
Please commit your changes or stash them before you switch branches.
이때 -f 또는 --force 옵션을 사용하면 변경사항을 무시하고 강제로 브랜치를 전환할 수 있습니다.
$ git switch -f <브랜치명>
이 옵션을 사용하면 작업 디렉토리(working directory)와 스테이징 영역(staging area)에 있는 모든 변경사항이 영구적으로 손실됩니다. 한번 손실된 변경사항은 복구할 수 없으므로 매우 신중하게 사용해야 하겠습니다.
예를 들어, 현재 브랜치에서 작업한 내용을 버리고 main 브랜치로 전환하려면 다음 명령어를 날리면 됩니다.
$ git checkout -f main
일반적인 상황에서는 변경사항을 커밋한 하거나 git stash로 임시 보관한 후 브랜치 전환하는 것이 권장됩니다.
# 방법 1: 변경사항 커밋
$ git add .
$ git commit -m "Work in progress"
$ git switch main
# 방법 2: 변경사항 임시 저장
$ git stash
$ git switch main
$ git switch -
$ git stash pop
git checkout와 비교
git checkout은 오랫동안 Git의 핵심 명령어로 사용되어 왔지만 문제점이 있었습니다.
바로 하나의 명령어가 브랜치 전환, 파일 복원, HEAD 분리 등 너무 다양한 용도로 쓰인다는 것이 였는데요.
이러한 문제를 해결하기 위해 Git 2.23 버전(2019년 8월)부터는 git checkout의 기능을 두 개의 명령어로 분리되었습니다.
브랜치 전환은 git switch가, 파일 복원은 git restore가 전담하도록 한 것입니다.
레거시 명령어인 git checkout은 여전히 하위 호환성을 위해서 지원되지만, 가급적 현대적인 방식인 git switch를 사용하는 것이 권장됩니다.
| 작업 | git checkout | git switch |
|---|---|---|
| 브랜치 전환 | git checkout <브랜치> | git switch <브랜치> |
| 브랜치 생성 및 전환 | git checkout -b <브랜치> | git switch -c <브랜치> |
| Detached HEAD | git checkout <커밋> | git switch --detach <커밋> |
| 파일 복원 | git checkout -- <파일> | git restore <파일> |
마치며
git switch를 사용하면 브랜치 작업 시 의도치 않은 실수를 줄이고, 더 직관적인 명령어로 Git을 사용할 수 있습니다.
처음에는 익숙한 git checkout을 계속 사용하고 싶을 수 있지만, 점진적으로 git switch를 사용하는 습관을 들이셨으면 좋겠습니다.
파일 복원 기능은 git restore가 담당하고 있으니 함께 살펴보시면 좋겠습니다. 브랜치 생성, 삭제, 이름 변경 등 브랜치 관리에 대해서는 git branch 사용법을 참고하세요. 만약 브랜치 전환 자체가 번거롭다면 git worktree로 여러 브랜치를 동시에 열어두는 방법도 있습니다.
더 자세한 내용은 Git 공식 문서를 참고하세요.
This work is licensed under
CC BY 4.0