git checkout vs git switch

한태동·2024년 9월 1일
post-thumbnail

1. 개요

git Checkoutgit Switch는 Git repository에서 브랜치를 변경할 때 쓰이는 중요한 명령어이다.

git checkout 명령어는 오래된 명령어로, 그 사용 용도 중 하나는 브랜치를 생성하고 전환하는 것다. git switch 명령어는 더 나은 안전 검사와 사용 편의성을 제공하기 위해 나중에 도입되었다.

2. Git Checkout Overview

git checkout 명령어는 Git에서 중요한 명령어이다. 이 명령어는 Git 저장소에서 브랜치나 태그 간 전환을 포함하여 여러 용도로 사용될 수 있다. 또한 작업 트리의 파일을 복원하거나, 새로운 브랜치를 생성하거나, 단일 커밋을 체크아웃하는 데에도 사용할 수 있다.

사용 용도에 따라 git checkout 명령어의 구문은 다음과 같다:

  • 브랜치를 전환할 때 다음 명령어를 사용한다:

    git checkout [branch_name]

    브랜치를 생성하고 그 브랜치로 전환하려면 -b 옵션을 지정하면 된다. 예를 들어, 다음 명령어는 testbranch라는 새 브랜치를 생성하고 그 브랜치로 전환한다:

  • 작업 디렉토리의 파일을 특정 커밋의 상태로 복원하려면, 아래 구문을 사용하면 된다

    git checkout [commit_hash] -- [file_path]
  • 어떤 브랜치에도 영향을 주지 않고 커밋을 탐색하기 위해 해당 커밋을 체크아웃하려면, 아래 구문을 사용하면 된다:

    git checkout [commit_hash]

3. Git Switch Overview

git switch 명령어는 Git 버전 2.23에서 도입되었다. 이 명령어의 목적은 git checkout의 기능을 두 가지로 분리하는 것이다.

즉, 브랜치를 전환하는 데는 git switch를 사용하고, 작업 트리 파일을 복원하는 데는 git restore를 사용하도록 한 것이다.

따라서 git switch 명령어의 주요 목표는 저장소에서 브랜치를 전환하는 과정을 단순하고 명확하게 만드는 것이다. 이 명령어는 새로운 브랜치를 생성하고 해당 브랜치로 전환하거나 이전에 있던 브랜치로 돌아가는 데에도 사용할 수 있다.

  • git switch 명령어의 구문은 다음과 같다:
    git switch [options] [branch_name]

4. Git Checkout과 Git Switch의 차이점

두 명령어 모두 브랜치를 전환할 수 있지만, git switch는 목적이 더 명확하고 단순한 명령어다. git switch 명령어는 브랜치를 전환하기 위해 특별히 설계된 것이며, 개별 파일 작업과 같은 다른 작업은 처리하지 않는다.

반면, git checkout은 기능 범위가 더 넓어 새로운 Git 사용자에게 혼란을 줄 수 있는 명령어다. 이 명령어는 브랜치를 전환할 수 있을 뿐만 아니라, 현재 브랜치로 다른 브랜치의 파일을 복사할 수도 있다. 또한 특정 커밋에서 변경 사항을 복원하는 것도 가능하다.

Git 팀은 이제 사용자가 브랜치 작업에는 git switch를 사용하고, 파일 복원에는 git restore를 사용할 것을 권장하고 있다. 하지만 두 작업 모두 git checkout을 사용해 수행할 수 있다.

아래 섹션에서는 두 명령어의 다양한 옵션에 대한 개요, 두 명령어의 장단점, 그리고 유용한 예시를 제공한다.

5. Git Checkout과 Git Switch의 Options

옵션을 사용하면 git switchgit checkout의 다양한 기능을 활용하고 명령어의 동작을 제어할 수 있다. 아래 섹션에서는 두 명령어에 사용 가능한 옵션과 그 사용 방법에 대해 설명한다.

  • Git chekcout
    옵션전체 이름설명
    -b--branch새로운 브랜치를 생성하고 그 브랜치로 전환합니다.
    -B브랜치를 강제로 생성하거나 재생성하고 그 브랜치로 전환합니다.
    --detach지정된 커밋에서 HEAD를 분리하고, 인덱스 및 작업 트리의 파일을 업데이트합니다.
    -f--force로컬 변경 사항과 방해되는 추적되지 않은 파일이나 디렉토리를 무시하고 강제로 체크아웃합니다.
    -q--quiet피드백 메시지를 억제합니다.
    -t--track새로운 브랜치를 생성하고 원격 업스트림 브랜치를 추적하도록 설정합니다.
    -m--merge현재 브랜치, 작업 트리 내용, 새로운 브랜치 간에 3자 병합을 수행합니다.
    -p--patch브랜치 간의 차이에서 덩어리를 선택적으로 선택하여 현재 작업 트리에서 편집 내용을 선택적으로 버립니다.
    --ours충돌을 현재 브랜치(ours)의 내용으로 해결합니다.
    --theirs충돌을 다른 브랜치(theirs)의 내용으로 해결합니다.
    --orphan커밋 기록이 없는 새로운 고아 브랜치를 생성합니다. 이 브랜치에서 첫 커밋은 부모가 없으며, 다른 브랜치 및 커밋과 연결되지 않은 새로운 기록의 루트가 됩니다.
    --progress브랜치를 체크아웃할 때 진행 상황을 표시합니다. 터미널에 연결되지 않았을 때 진행 상황을 보고하는 데 유용합니다.
  • Git switch
    옵션전체 이름설명
    -c [branch-name]--create새로운 브랜치를 생성하고 그 브랜치로 전환합니다.
    -C [branch-name]--force-create새로운 브랜치를 생성합니다. 기존 브랜치를 덮어쓰더라도 강제로 생성합니다.
    -d--detach지정된 커밋에서 HEAD를 분리합니다.
    -f--force브랜치를 강제로 전환하여 로컬 변경 사항을 무시합니다.
    -q--quiet피드백 메시지를 억제합니다.
    -t--track원격 업스트림 브랜치를 추적하는 새로운 브랜치를 생성합니다. -c 옵션을 사용하지 않으면 원격 추적 브랜치에서 브랜치 이름을 유도합니다.
    -이전 브랜치로 전환합니다.
    --progress브랜치를 전환할 때 진행 상황을 표시합니다. 터미널에 연결되지 않았을 때 진행 상황을 보고하는 데 유용합니다.

6. 차이에 대한 예시

  • git chekcout

    1. 특정 커맨드 해쉬로 Checkout 수행

      git checkout [commit_hash]

    2. 특정 브랜치로 Checkout 수행

      git checkout [branch_name]
    3. 특정 원격 브랜치로 Checkout 수행

      git checkout -b [local_branch_name] [remote_branch_name]
      • 이 명령어를 통해 특정 원격 브랜치 [remote_branch_name]에서 새로운 로컬 브랜치인 [local_branch_name]를 생성하고 현재 작업 트리를 변경해 HEAD가 새로운 로컬 브랜치로 향하도록 한다.
    4. 특정 태그로 Checkout 수행

      git checkout [tag_name]
    5. 특정 파일이나 디렉토리로 Checkout 수행

      git checkout [file_or_directory_path]
  • git switch

    1. 특정 브랜치로 Switch:

      git switch [branch_name]

      git checkout [branch_name]이랑 동일 기능을 수행한다.

    2. 특정 원격 브랜치로 Switch:

      git switch -c [local_branch_name] [remote_branch_name]

      git checkout -b [local_branch_name] [remote_branch_name]와 동일한 역할 수행함.

    3. 특정 커밋으로 Switch:

      git switch --detach [commit_hash]

      git switch 명령어의 --detach 옵션은 특정 커밋으로 이동하면서 어떤 브랜치에도 속하지 않게 하여 분리된 HEAD 상태가 되도록 한다. 이 상태에서는 변경 사항을 확인하고 수정하며 커밋할 수 있지만, 변경 사항을 추적하는 브랜치는 존재하지 않는다.

4. 이전 브랜치로 Switch:
    
    ```bash
    git switch -
    ```
    
    ![image.png](git%20Checkout%20vs%20git%20Switch%20d13f2e77d9474baea16be8453ad15115/image%206.png)
    

7. 각 커맨드의 장점

  1. Git Checkout
    • 다양성(varsatality): git checkoutgit switch보다 더 다양한 작업을 처리할 수 있어 더 유연하다. 여기에는 브랜치 전환, 파일 체크아웃, 커밋 체크아웃 등이 포함된다.
    • 친숙성: checkout 명령어는 오랫동안 Git 도구 세트의 일부였기 때문에, Git을 오래 사용해온 사용자에게 더 친숙하다.
  2. Git Switch
    • 안전성: git switch는 브랜치 작업을 위해 특별히 설계되었다. 이 기능은 실수로 커밋으로 전환하거나 브랜치에서 분리되는 위험을 줄여준다.
    • 명확한 목적: git switch 명령어는 목적이 명확하여 팀 워크플로우에서 가독성과 이해도를 높여준다.
    • 향상된 오류 처리: git switch는 데이터 손실로 이어질 수 있는 특정 작업을 방지하여, 브랜치 관련 작업에 있어 더 안전한 선택이 된다.

8. 각 커맨드 단점

  1. git checkout
  • 잠재적인 데이터 손실: git checkout은 특히 커밋을 체크아웃하거나 의도치 않게 브랜치에서 분리될 때 잘못 사용되면 데이터 손실을 초래할 수 있다.
  • 모호성: 이 명령어는 다목적으로 사용되기 때문에 혼란이나 실수를 초래할 수 있다. 다재다능함에도 불구하고, 그 의도가 git switch보다 명확하지 않다.
  1. git switch
  • 직접적인 커밋 체크아웃 불가: git switch 명령어는 git checkout처럼 특정 커밋으로 직접 이동할 수 없다. 💡 `git switch` 명령어로 특정 커밋으로 이동하려면 `--detach` 옵션을 사용해야 한다. `git switch`는 기본적으로 브랜치 전환에 초점을 맞춘 명령어이므로, 특정 커밋으로 이동할 때는 의도적으로 분리된 HEAD 상태로 진입한다는 것을 명시적으로 표현해야 한다. ```bash git switch --detach 123abc ``` 위 명령어는 `123abc`라는 커밋으로 HEAD를 분리(detached HEAD)하여 이동한다. 이 상태에서 작업을 하고 커밋할 수 있지만, 해당 커밋은 현재 어떤 브랜치에도 연결되지 않게 됩니다. 나중에 이 변경 사항을 유지하려면 새로운 브랜치를 생성하거나, 기존 브랜치에 변경 사항을 병합해야 한다. 이 방식은 특정 커밋의 상태를 확인하거나 임시로 무언가를 실험하고자 할 때 유용하며, `git switch` 명령어의 설계 철학에 따라 보다 명시적이고 안전한 방법으로 커밋 이동을 처리할 수 있도록 해준다.
  • 호환성: 이 명령어는 Git 버전 2.23에서 도입되었기 때문에 이전 Git 버전에서는 사용할 수 없다. 이는 구 버전의 Git 설치와의 호환성을 감소시킨다.

결론

Git 워크플로우에서 git switchgit checkout 중 어느 것을 선택할지는 필요한 안전성과 명확성 수준 등 여러 요인에 따라 달라진다. 각 명령어는 고유한 강점과 선호되는 사례가 있기 때문이다.

  • git checkout은 매우 다재다능하며 Git 워크플로우에서 다양한 작업을 처리할 수 있다. 저장소 내에서 여러 작업을 수행할 때 그 유연성은 매우 가치가 있다. 그러나 잘못 사용될 경우 모호성 및 잠재적인 데이터 손실의 위험도 있다.
  • 반면, git switch는 브랜치 작업을 위해 명시적으로 설계되었다. 이 명령어의 우선순위는 안전성으로, 브랜치 전환 중 실수로 인한 데이터 손실의 위험을 줄임으로써 위험성을 줄인다. 그러나 git switch의 한계는 커밋 체크아웃을 직접 처리할 수 없다는 점이다. 특정 커밋으로 직접 전환해야 하는 경우, 더 나은 선택은 git checkout이다.

결국, 각 명령어의 강점과 약점을 이해함으로써 특정 사용 사례와 워크플로우 요구사항에 따라 가장 적합한 명령어를 선택할 수 있게 됩니다.

💡

두 명령어는 상호 교환하여 사용할 수도 있다.

git switch는 개선된 안전 검사 덕분에 브랜치 작업에 권장되며, git checkout은 파일 및 커밋 작업에 더 강력하고 다재다능한 도구이다.

그럼에도 불구하고, 같은 워크플로우에서 이 두 명령어를 함께 사용할 수 있지만, 그 목적을 명확히 해야 한다. 예를 들어, 팀에서 브랜치 전환에는 git switch를 사용하고, 파일, 태그 또는 커밋 체크아웃이나 서브모듈 업데이트와 같은 다른 작업에는 git checkout을 사용하기로 결정할 수 있다.

출처: https://phoenixnap.com/kb/git-switch-vs-checkout

안전하게 작업하기 위한 워크플로우

1. 새로운 브랜치를 생성하고 작업하기

  • 새로운 기능을 개발하거나 실험적인 변경을 하고 싶다면, 새로운 브랜치를 생성한 후 그 브랜치에서 작업하는 것이 좋다. 이렇게 하면 현재의 안정된 코드에 영향을 주지 않고 독립적으로 작업할 수 있기 때문이다.
    git switch -c my-feature-branch

2. 이전 브랜치나 특정 커밋을 확인하고 싶을 때

  • 만약 이전 브랜치로 돌아가서 코드 상태를 확인하거나, 특정 커밋의 상태를 일시적으로 보고 싶다면, git switch --detach를 사용할 수 있다. 이렇게 하면 현재 작업 중인 브랜치를 변경하지 않고도 다른 브랜치나 커밋의 상태를 확인할 수 있다.
    git switch --detach [commit-hash]
    또는, 예전 브랜치로 돌아가서 그 상태를 확인하고 싶은 경우:
    git switch --detach previous-branch
    이렇게 하면 previous-branch로의 변경이 분리된 상태에서 이루어지기 때문에, 실수로 이 상태에서 커밋을 하더라도 현재 활성화된 브랜치에 영향을 주지 않습니다.

3. 작업을 마친 후 원래 브랜치로 돌아가기

  • 특정 커밋을 확인하고 변경 사항을 적용할 필요가 없으면, 원래 브랜치로 안전하게 돌아갈 수 있다. 새로운 브랜치에서 작업한 내용을 기존 브랜치에 병합할 준비가 되었다면, 다음과 같이 병합할 수 있다:
    git switch main-branch
    git merge my-feature-branch
    이 접근 방식은 작업의 안전성을 유지하면서도 다양한 상태를 점검하고 관리할 수 있는 방법을 제공한다. 또한, 필요에 따라 변경 사항을 적절히 병합하거나 폐기할 수 있어 효율적인 개발 워크플로우를 유지할 수 있다.

0개의 댓글