Git에서 브랜치를 이동할 때 다음 두 명령어를 모두 사용할 수 있다.
git checkout main
git switch main
결과는 비슷해 보이는데, 왜 switch라는 명령어가 따로 존재하는 걸까?
이번 글에서는 checkout과 switch의 차이를 알아보고, AI 코딩 도구의 병렬 작업에서 자주 등장하는 git worktree까지 정리해 본다.
checkout은 오래전부터 사용된 명령어로, 크게 두 가지 역할을 담당한다.
git checkout main
git checkout -b feature/login
git checkout -- src/App.tsx
문제는 checkout 하나가 서로 다른 역할을 동시에 담당한다는 것이다.
git checkout feature/login
위 명령어는 feature/login 브랜치로 이동한다.
git checkout -- feature/login
하지만 --가 들어가면 feature/login이라는 경로의 파일을 복구한다는 의미가 된다.
Git은 전달받은 값이 브랜치인지, 커밋인지, 파일 경로인지 판단해야 한다. 이 때문에 처음 Git을 배우는 입장에서는 명령어의 의도를 파악하기 어렵고, 실수로 파일의 변경 사항을 제거할 수도 있다.
Git 공식 문서에서도 checkout의 주요 역할을 다음 두 가지로 설명한다.
switch는 checkout이 담당하던 역할 중 브랜치 이동만 분리한 명령어다.
그래서 가끔 switch 만 되고, checkout 이 안되었던거다....
git switch main
git switch -c feature/login
checkout에서는 -b를 사용하지만 switch에서는 -c, 즉 --create를 사용한다.
# checkout
git checkout -b feature/login
# switch
git switch -c feature/login
git switch -
main에서 feature/login으로 이동한 상태였다면 다시 main으로 돌아간다.
브랜치가 아닌 특정 커밋을 확인하고 싶다면 --detach 옵션을 사용한다.
git switch --detach <커밋 해시>
이 상태에서는 HEAD가 브랜치가 아닌 특정 커밋을 직접 가리키는 Detached HEAD 상태가 된다.
작업 내용을 보관하고 싶다면 새로운 브랜치를 생성해야 한다.
git switch -c feature/new-branch
자세한 동작은 git switch 공식 문서에서 확인할 수 있다.
| 목적 | checkout | switch |
|---|---|---|
| 브랜치 이동 | git checkout main | git switch main |
| 브랜치 생성 및 이동 | git checkout -b feature | git switch -c feature |
| 이전 브랜치로 이동 | git checkout - | git switch - |
| 특정 커밋 확인 | git checkout <commit> | git switch --detach <commit> |
| 파일 복구 | 가능 | 불가능 |
checkout이 사라진 것은 아니므로 기존 명령어를 계속 사용해도 된다.
다만 명령어의 목적을 명확히 표현하려면 다음처럼 구분하는 편이 좋다.
# 브랜치 이동
git switch <브랜치명>
# 파일 복구
git restore <파일명>
restore는 checkout이 담당하던 역할 중 파일 복구 기능을 분리한 명령어다.
수정한 파일을 마지막으로 저장된 상태로 되돌릴 때 사용한다.
git restore src/App.tsx
현재 디렉터리의 모든 변경 사항을 되돌릴 수도 있다.
git restore .
스테이징한 파일을 스테이징 영역에서 내릴 때는 다음 명령어를 사용한다.
git restore --staged src/App.tsx
git restore로 되돌린 커밋되지 않은 변경 사항은 복구하기 어려우므로 실행 전에git diff와git status를 확인하는 것이 좋다.
정리하면 기존의 checkout 역할이 다음과 같이 분리된 것이다.
git checkout
├── 브랜치 이동 → git switch
└── 파일 복구 → git restore
항상 원인을 몰라 상황에 따라 먹히는 명령어를 사용했는데, 이 기회에 싹 정리를 하니 뭔가 후련하다. 앞으로 이렇게 기본적인 것도 놓친게 있는지 꼼꼼히 확인하며 넘어가야겠다.
다음 포스팅은 워크트리 관련을 할 예정이다.