git switch와 git checkout <branch>의 차이점은 무엇입니까?


166

Git 2.23 은 새로운 명령을 도입 했습니다 git switch. 문서를 읽은 후 git checkout <branchname>누군가가 차이점이나 사용 사례를 설명 할 수 있는 것과 거의 똑같은 것 같습니다 .

두 개의 새로운 명령 인 "git switch"와 "git restore"가 도입되어 "기록을 발전시키기 위해 브랜치 체크 아웃"과 "현재를 발전시키기 위해 인덱스 및 / 또는 트리에서 경로 체크 아웃"을 분리합니다. 단일 "git checkout"명령에서


2
이 주제에 대한 InfoQ의 좋은 기사가 있습니다 : infoq.com/news/2019/08/git-2-23-switch-restore
rsenna

답변:


181

글쎄, 당신이 연결하는 문서에 따르면, 그것의 유일한 목적은 다음의 두 가지 다른 용도를 나누고 명확히하는 것입니다 git checkout.

  • git switch지금처럼 가지를 변경하는 데 사용할 수 있습니다 git checkout <branchname>않습니다
  • git restore등의 특정 버전과 파일을 다시 사용할 수 있습니다 git checkout --<path_to_file>않습니다

Stackoverflow의 여기에 git checkout관한 많은 질문에서 볼 수 있듯이 사람들은 이러한 다양한 사용 방법으로 혼란스러워합니다 git checkout. Git 개발자는 이것을 고려한 것 같습니다.


32
이것은 좋은 변화 인 것 같습니다. 지점을 만드시겠습니까? git checkout지점을 전환 하시겠습니까? git checkout특정 버전의 파일을 받으시겠습니까? git checkout하나의 파일에 대한 변경 사항을 제거 하시겠습니까? git checkout솔직히 다양한 플래그를 사용하여 정상적인 git 워크 플로를 얼마나 많이 수행 할 수 있는지 궁금합니다 git checkout.
Captain Man

5
이제 git checkout더 이상 기술적으로 필요하지 않은 아이디어 입니까? 아니면 브랜치 헤드가 아닌 커밋 체크 아웃 ( "분리 헤드"모드로 이동)과 같은 특정 작업에 여전히 사용 중입니까?
PieterNuyts

5
@Mike 체크 아웃이 브랜치를 만든다고 말한 후 체크 아웃이 브랜치를 한 문장으로 만들지 않는다고 어떻게 말할 수 있습니까? -b깃발 의 내부 동작은 중요하지 않습니다 . 여전히 가지를 만듭니다.
선장 남자

5
@CaptainMan, checkout 작업 은 분기를 생성하지 않으며 이미 존재하는 분기로만 전환 할 수 있습니다. 명령에 대한 -b옵션은 실제로 체크 아웃을 수행하기 전에 내부적으로 a 를 수행합니다 . 이것은 + 의 단축키 와 같습니다 . checkout git branchgit pullgit fetchgit merge
마이크

7
유용한 정보 : 익숙한 git checkout -b <branch name>사용자 git switch -c <branch name>를 위해 동일한 효과를 얻을 수 있습니다.
Xeuron

73

git checkout 몇 가지 관련되지 않은 용도로 사용되는 스위스 군용 칼입니다.

파일을 수정했지만 변경 사항을 준비하지 않은 git checkout <filename>경우 수정 사항을 되돌릴 수 있습니다. 파일 변경 사항을 빠르고 쉽게 취소 할 수있는 방법입니다. 당신은 같은 지점에 남아 있습니다.

git checkout <branchname> (당신이 언급했듯이) 분기를 전환합니다.

완전히 다른 두 가지 목적으로 파일 이름과 브랜치 이름이 유사한 경우 혼동을 일으킬 수 있습니다.

두 개의 명령으로하는 것이 더 명확합니다.


당신이 언급했듯이 같은 이름을 가진 브랜치와 파일을 갖는 것은 혼란 스럽습니다. 종종 더 바람직하기 때문에 분기가 파일보다 우선 순위를 차지한다고 가정합니다. 아니면 어떻게 작동합니까?
AgentM

@AgentM 네, 맞습니다. 브랜치와 파일의 이름이 같으면 git checkout <name>파일 대신 브랜치를 선호합니다.
Kartik Soneji

3

switch몇 가지 제한 사항이 있습니다. 현재 어떤 커밋 에서으로 전환 할 수 <branch name>있지만 상태가 분리 된 HEAD 인 특정 커밋으로 전환 하는 것은 불가능합니다 . 따라서 사용해야합니다 (여기서 5efb는 임의 커밋에 대한 해시 참조의 예입니다).<branch name>git checkout 5efb


3
나는 이것이 버그 (제한)가 아닌 기능이라고 주장하고 싶다. switch분기를 변경하는 단일 목적을 위해 만들어지며, 그렇게 할 때 해당 분기의 HEAD에 있기를 원합니다. checkout히스토리 (= 커밋)에서 주어진 상태와 일치하도록 작업 복사본을 가져 오는보다 일반적인 작업입니다. 브랜치 이름은 해당 브랜치의 HEAD 커밋에 대한 별칭이므로 브랜치를 체크 아웃하는 것은 다른 커밋을 체크 아웃하는 것과 기술적으로 다르지 않습니다.
Mike

16
으로 -d수행 할 수 있습니다git switch -d 6c13
멘디 씨 Barel
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.