git checkout --track origin / branch와 git checkout -b branch origin / branch의 차이점


209

아무도 원격 지점을 전환하고 추적하기 위해이 두 명령의 차이점을 알고 있습니까?

git checkout -b branch origin/branch
git checkout --track origin/branch

둘 다 원격 지점을 추적하여 변경 사항을 원점에서 지점으로 푸시 할 수 있다고 생각합니까?

실질적인 차이점이 있습니까 ??

감사!

답변:


282

두 명령은 동일한 효과를 갖습니다 ( Robert Siemer의 답변 덕분에 ).

실질적인 차이점은 다른 이름의 로컬 브랜치를 사용할 때 발생합니다 .

  • git checkout -b mybranch origin/abranch만들고 mybranch추적합니다origin/abranch
  • git checkout --track origin/abranchabranch이름이 다른 분기가 아닌 ' ' 만 만듭니다 .

( 세바스찬 그라프 (S Sebastian Graf)의 의견 에 따르면 로컬 지점이 아직 존재 하지 않으면 필요합니다. )
git checkout -B abranch origin/abranch


참고 : Git 2.23 (Q3 2019)에서는 새로운 명령을git switch 사용합니다 .

git switch -c <branch> --track <remote>/<branch>

브랜치가 여러 리모트에 존재하고 그 중 하나가 checkout.defaultRemote구성 변수에 의해 이름이 지정된 경우, <branch>모든 리모트에서 고유하지 않은 경우에도 명확성을 위해 해당 브랜치를 사용합니다 . 모호하지만 '원점'원격에 존재하는 경우 항상 원격 지점을 체크 아웃
하도록 예 checkout.defaultRemote=origin를 설정하십시오 <branch>.

여기서 ' -c'는 새로운 ' -b'입니다.


첫째, 일부 배경 : 추적 은 로컬 지점의 업스트림이 원격 지점으로 설정되었음을 의미합니다.

# git config branch.<branch-name>.remote origin
# git config branch.<branch-name>.merge refs/heads/branch

git checkout -b branch origin/branch 의지:

  • 에서 branch참조하는 지점으로 작성 / 재설정 합니다 origin/branch.
  • 브랜치 생성 branch(을 가진 git branch)와 원격 지점 추적 추적 origin/branch.

로컬 브랜치 원격 추적 분기를 시작하면, 힘내 지점 (특히 설정 branch.<name>.remotebranch.<name>.merge구성 항목)를 그 정도로 git pull적절 원격 추적 지점에서 합류한다.
이 동작은 전역 branch.autosetupmerge구성 플래그 를 통해 변경 될 수 있습니다 . 이 옵션 은 --trackand --no-track옵션 을 사용하여 재정의하고 나중에 git branch를 사용하여 변경할 수 있습니다 --set-upstream-to.


)와 git checkout --track origin/branch동일하게 수행됩니다 git branch --set-upstream-to.

 # or, since 1.7.0
 git branch --set-upstream upstream/branch branch
 # or, since 1.8.0 (October 2012)
 git branch --set-upstream-to upstream/branch branch
 # the short version remains the same:
 git branch -u upstream/branch branch

또한 ' branch' 의 업스트림을 설정했습니다 .

(참고 : git1.8.0은 더 이상 사용되지 않으며 다음 git branch --set-upstream으로 대체됩니다 git branch -u|--set-upstream-to: git1.8.0-rc1 announce 참조 )


로컬 지점에 업스트림 지점을 등록하면 다음과 같은 이점이 있습니다.

  • git에게 에서 두 분기 사이의 관계git statusgit branch -v표시하도록 지시 하십시오 .
  • 새로운 브랜치가 체크 아웃 될 때 git pull 인수없이 업스트림에서 끌어 오도록 지시 합니다 .

자세한 내용은 " 기존 git 브랜치 트랙을 원격 브랜치로 만드는 방법 "을 참조하십시오.


1
@VonC 나는 당신이 추가 정보로 언급 한 작은 세부 사항을 찾고있었습니다. 내 경우에는 왜 내 지점에 내가 허용 할 수있는지가 궁금한 git pull반면 일부 지점은 원격 지점을 가져 오도록 요청할 것입니다. 피어에서 처음으로 만든 원격 분기를 체크 아웃하면 git이 계속 진행되어 branch.<BNAME>.remote=origin로컬 gitconfig에 추가 됩니다. 그런 다음 발행 할 수 있습니다 git pull. 그러나 당신이 브랜치를 만드는 사람 git checkout -b BNAME이라면 git -of-는 알 수 없습니다. 따라서 리모컨을 지정해야합니다.
batilc

@batilc "처음으로 동료가 만든 원격 지점을 체크 아웃하는 경우"; 예, git-scm.com/docs/git-checkout을 읽고 다음을 참조하십시오 : " If <branch>를 찾을 수 없지만 <remote>이름이 일치하는 정확히 하나의 원격 (추적)에 추적 분기가 있으며 $ git checkout -b <branch> --track <remote>/<branch>"
VonC

@VonC 나는 이것에 대한 더 나은 구성을 발견했다. 우리가 말하는 것을 단순히 수행 branch.autoSetupMerge하도록 설정합니다 always. 이 설정의 기본값은 true입니다. 즉, 원격 지사를 체크 아웃 할 때만 추적이 수행됩니다. true로컬로 생성 된 분기에 대한 추적을 설정하지 않습니다.
batilc

@batilc 동의합니다. 추적을 명시 적으로 설정하는 것을 선호하므로 항상 사용하지 않는 경향이 있지만 귀하의 경우에는 이것이 올바른 설정이어야합니다.
VonC

1
"git branch --set-upstream-to branch upstream / branch"는 올바른 구문이 아닙니다. "git branch --set-upstream-to-upstream / branch branch"
maharvey67

33

전혀 차이가 없습니다!

1) git checkout -b branch origin/branch

어떤이없는 경우 --track--no-track, --track기본값으로지지 않습니다. 설정으로 기본값을 변경할 수 있습니다 branch.autosetupmerge.

실제로 1)은 다음과 같이 동작 git checkout -b branch --track origin/branch합니다.

2) git checkout --track origin/branch

"편의상" --track없이 -b의미 -b와의 인수 -b추측된다 "지점"이 될 수 있습니다. 추측은 구성 변수에 의해 결정 remote.origin.fetch됩니다.

실제로 2)는 다음과 같이 동작 git checkout -b branch --track origin/branch합니다.

보다시피 차이가 없습니다.

그러나 더 좋아집니다.

삼) git checkout branch

또한 동일하다 git checkout -b branch --track origin/branch"분기"아직 존재하지 않지만 "원산지 / 지사는"않는 경우 1 .


세 명령 모두“branch”의“upstream”을“origin / branch”(또는 실패)로 설정합니다.

업스트림의 기준점으로 사용되는 인수리스 git status, git push, git merge따라서 git pull(디폴트 또는 거의 기본값 인 (즉, 같은 구성된 경우)).

예를 들어 git status업스트림에서 어느 정도 앞뒤로 구성되어 있는지 알려줍니다.

git pushgit 2.0 이후 기본적으로 현재 분기를 2 업스트림으로 푸시하도록 구성되어 있습니다.

1 ...“origin”이“branch”를 가진 유일한 리모컨 인 경우
2 기본 이름 (“simple”) 두 분기 이름이 동일하도록 강제합니다.


5

이 책 은 그 명령들이 같은 효과를 낸다고 지적하는 것 같습니다.

간단한 사례는 git checkout -b [branch] [remotename] / [branch]를 실행 한 예입니다. Git 버전 1.6.2 이상을 사용하는 경우 --track 속기를 사용할 수도 있습니다.

$ git checkout --track origin/serverfix 
Branch serverfix set up to track remote branch serverfix from origin. 
Switched to a new branch 'serverfix' 

원격 브랜치와 다른 이름으로 로컬 브랜치를 설정하려면 다른 로컬 브랜치 이름을 가진 첫 번째 버전을 쉽게 사용할 수 있습니다.

$ git checkout -b sf origin/serverfix

이것은 bash 또는 oh-my-zsh git 완료가 origin/serverfix이름 을 가져올 수있을 때 특히 유용합니다. 첨부 --track(또는 -t)하고 길을 가고 있습니다.


-1

이 명령으로 새 브랜치를 만들 수 없습니다

git checkout --track origin/branch

준비되지 않은 변경 사항이있는 경우

예를 들면 다음과 같습니다.

$ git status
On branch master
Your branch is up to date with 'origin/master'.

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   src/App.js

no changes added to commit (use "git add" and/or "git commit -a")

// TRY TO CREATE:

$ git checkout --track origin/new-branch
fatal: 'origin/new-branch' is not a commit and a branch 'new-branch' cannot be created from it

그러나 git checkout -b명령을 사용 하여 비 단계적 변경으로 새 분기를 쉽게 만들 수 있습니다 .

$ git checkout -b new-branch
Switched to a new branch 'new-branch'
M       src/App.js

질문의 두 명령 모두 기존 원격 지점 ( origin/branch) 을 추적하기위한 것입니다.
yorch

@Green origin/new-branch대신 테스트를합니다 origin/branch. 알고 계십니까?
Robert Siemer
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.