prosource

깃 스위치와 깃 체크아웃의 차이점은 무엇입니까?

probook 2023. 5. 18. 21:08
반응형

깃 스위치와 깃 체크아웃의 차이점은 무엇입니까?

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

"git switch" 및 "git restore"라는 두 가지 새로운 명령어가 도입되어 "지점 체크아웃을 통해 기록을 진전시키는 작업"과 "인덱스에서 경로를 체크아웃하고 현재 기록을 진전시키는 작업을 수행하는 트리 형식"을 구분합니다.

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

  • git switch분기를 하는 데 할 수 .git checkout <branchname> 일다
  • git restore리비전으로 하는 데 할 수 .git checkout -- <path_to_file> 일다

사람들은 이러한 다양한 사용 방법에 대해 혼란스러워 합니다.git checkout에 관한 많은 질문에서 알 수 있듯이git checkout여기 스택 오버플로에 있습니다.Git 개발자들은 이것을 고려한 것 같습니다.

git checkout스위스 군용 나이프의 일종으로 관련이 없는 몇 가지 용도가 있습니다.

을 수정할 수 .git checkout <filename>입니다.지점에 .같은 지점에 남아 있습니다.

git checkout <branchname>(참고한 대로) 분기를 전환합니다.

완전히 다른 두 가지 목적으로, 파일 이름과 분기 이름이 유사할 경우 혼동을 일으킬 수 있습니다.

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

switch명령은 실제로와 같은 일을 합니다.checkout분기를 전환하는 용도로만 사용할 수 있습니다. 와히달과 다르게.checkout파일을 할 수 . " 작트파수없다습니복"를 하여 작업을 합니다. 대신 작업 트리 파일을 사용합니다.restore와함도입명어령된께와 함께 switch.

상세설명

했듯이, 2.23.0 릴리스 노트,switch그리고.restore명령어들이 분할하기 위해 도입되었습니다.checkout명령을 두 부분으로 나눕니다.

  • "역사를 발전시키기 위해 지점을 확인
  • "현재 기록을 진행하기 위해 인덱스 및/또는 트리 형식의 경로 체크아웃"

다른말하면로,하면,checkout두 가지 다른 작업을 수행합니다. 이 릴리스에서는 이러한 각 작업을 자체 집중 명령으로 분할했습니다.

의 이 두 가지 checkout설명서의 요약 설명에서 확인할 수 있습니다.

git-checkout - 분기 전환 또는 작업 트리 파일 복원

추가된 커밋switch새합니다. commit 메시새는명령이어의설유명다니합를령어명서에지▁command.

"git checkout"은 너무 많은 것을 하는 많은 사용자들에게 혼란의 원인입니다. (때로는 오래된 타이머를 물어뜯기도 합니다.)이 문제를 해결하기 위해 명령은 스위치 및 복원이라는 두 가지 새로운 명령으로 분할됩니다.오래된 "git checkout" 명령은 여전히 존재하며 모든(또는 대부분의 사용자)이 질릴 때까지 계속됩니다.

이를 통해 새로운 명령어가 도입된 것은 하나의 다목적 명령어가 아닌 두 개의 초점 명령어를 사용하여 혼란을 줄이기 위한 것임이 분명합니다.

2021년 12월 현재에도 새로운 명령어는 실험 switch명령어(, )로 나열되어 있습니다.

이 명령은 실험적입니다.행동이 바뀔 수 있습니다.

명령 비교

어디에서도 명령어를 완전히 비교할 수 있는 방법을 수 없습니다.문서를 읽어보니, 이것은 상당히 완전한 비교가 되어야 한다고 생각합니다.

이전 명령 새 명령
git checkout <branch> git switch <branch>
git checkout 없음(사용)git status)
git checkout -b <new_branch> [<start_point>] git switch -c <new-branch> [<start-point>]
git checkout -B <new_branch> [<start_point>] git switch -C <new-branch> [<start-point>]
git checkout --orphan <new_branch> git switch --orphan <new-branch>
git checkout --orphan <new_branch> <start_point> 없음(사용)git switch <start-point>그리고나서git switch --orphan <new-branch>)
git checkout [--detach] <commit> git switch --detach <commit>
git checkout --detach [<branch>] git switch --detach [<branch>]
git checkout [--] <pathspec>… git restore [--] <pathspec>…
git checkout --pathspec-from-file=<file> git restore --pathspec-from-file=<file>
git checkout <tree-ish> [--] <pathspec>… git restore -s <tree> [--] <pathspec>…
git checkout <tree-ish> --pathspec-from-file=<file> git restore -s <tree> --pathspec-from-file=<file>
git checkout -p [<tree-ish>] [--] [<pathspec>…] git restore -p [-s <tree>] [--] [<pathspec>…]

이볼 수 이전의 은 이전 이름 비볼수있서이듯이다이을이명변있름니, " 이사일은전령용수습부로환할", "새전의령으명대여체")을하여 새 할 수 .checkout으로 ( ) 새것으로▁(로것 ( )switch,restore), 반면에 다른 것들은 추가적인 조정이 필요합니다.주목할 만한 변경 사항은 다음과 같습니다.

  • -b/-B새이 전하기환분새옵생성으로 됩니다.-c/-C은 또한 긴 변형을 .--create/--force-create이전에는 단일 문자 옵션 버전만 있었습니다.
  • --detach(또는)-d이전에는 커밋에 대해 선택 사항이었지만 분기에 대해서는 필수였던 분리된 헤드로 전환할 때 )이 이제 항상 필요합니다.
  • 복을위소이에제다공니됩에 됩니다.-s(또는)--source인라인 인수가 아닌 옵션입니다.
  • 을 사용한 --force병합되지 않은 항목이 있는 경우 무시하지 않고 실패합니다. --force이 이도로변습니다었경되름다니로 변경되었습니다.--discard-changes,와 함께--force가명으로 보관됨

switch몇 가지 제한 사항이 있습니다. 현재는 모든 커밋에서 로 전환할 수 있습니다.<branch name>그러나 에서 전환하는 것은 불가능합니다. <branch name>분리된 HEAD 상태의 특정 커밋에 대해 설명합니다.그래서 당신은 사용해야 합니다.git checkout 5efb커밋에 입니다). (5efb는 임의의 커밋에 대한 해시 참조의 예입니다.)

tl;dr: 사용 시checkout와 함께--force병합 중에 분기를 전환할 수 있습니다.당신은 이것을 할 수 없습니다.switch.

세부사항:

다른 대답들은 이미 분열의 동기를 다루었습니다.checkout안으로switch그리고.restore구문적인 사용법 차이가 존재한다는 사실뿐만 아니라. (예를 들어, 를 사용할 수 있습니다.)checkout예:origin/main 접적으와 함께, 그나함께.switch 또한명로지합니다야정해으를 .--detach옵션).하지만 적어도 한 가지 중요한 기능적 차이를 발견했습니다.

git switch -f다음과 같이 문서화되어 있습니다.

인덱스 또는 작업 트리가 다음과 다른 경우에도 계속 진행합니다.HEAD인덱스와 작업 트리가 모두 전환 대상과 일치하도록 복원됩니다.한다면--recurse-submodules를 지정하면 전환 대상과 일치하도록 하위 모듈 컨텐츠도 복원됩니다.이것은 로컬 변경사항을 버리는 데 사용됩니다.

마찬가지로 그고비슷게하리,게,git checkout -f는 다음과 같이 문서화되어 있습니다(마지막 문장에 따라 다름).

시합니다.HEAD추적되지 않은 파일이 있더라도 말입니다.로컬 변경사항과 추적되지 않은 파일 또는 디렉토리를 삭제하는 데 사용됩니다.

인덱스에서 경로를 체크아웃할 때 병합되지 않은 항목에 대해 실패하지 마십시오. 대신 병합되지 않은 항목은 무시됩니다.

마지막 문장이 다른 뜻에 적용되는 것 같습니다.checkout 즉, 그restore하지만할 때는 다음과 같습니다.git checkout -f그 순간 해결되지 않은 충돌이 있더라도 성공할 수 있습니다. git switch -f충돌 없이 현재 병합 중인 경우에는 다음 오류 메시지가 표시되므로 에서는 전혀 작동하지 않습니다.

치명적: 병합하는 동안 분기를 전환할 수 없습니다.

참고: 이 차이는 Git 버전 2.37.1을 사용하여 테스트되었습니다.

git switch~=git checkout -b [branch].git checkout [branch]분리된 HEAD를 제공합니다.

여기 깃 설명서의 발췌본이 있습니다.man git-switch.

시놉시스

git switch [<options>] [--no-guess] <branch>
git switch [<options>] --detach [<start-point>]
git switch [<options>] (-c|-C) <new-branch> [<start-point>]
git switch [<options>] --orphan <new-branch>

묘사

지정된 분기로 전환합니다.작업 트리와 인덱스가 분기와 일치하도록 업데이트됩니다.모든 새 커밋이 이 분기 끝에 추가됩니다.

선택적으로 동일한 이름의 원격 분기에서 자동으로 , 를 사용하여 분기를 만들있습니다( 참조).--guess )로 작업 에서 분리합니다.--detach전환과 함께.

가 필요하지 않습니다(즉, ▁(▁to▁diffe▁comparedrences▁switching▁tree).HEAD)에서 한 로컬 변경 이 손실되는 이 중단됩니다 그러나 작업이 로컬 변경 사항의 손실로 이어질 경우 작업이 중단됩니다. 단, 다음과 같이 달리 지시되지 않는 한--discard-changes또는--merge.

이 명령은 실험적입니다.행동이 바뀔 수 있습니다.

언급URL : https://stackoverflow.com/questions/57265785/whats-the-difference-between-git-switch-and-git-checkout-branch

반응형