Разница между git checkout -track origin/branch и git checkout -b origin origin/branch

Кто-нибудь знает разницу между этими двумя командами для переключения и отслеживания удаленной ветки?

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

Я думаю, что оба отслеживают удаленную ветку, поэтому я могу нажимать свои изменения на ветку по происхождению, верно?

Есть ли какие-либо практические различия?

Спасибо!

Ответ 1

Обе команды имеют одинаковый эффект (, благодаря ответу Роберта Симерса за указание на).

Практическая разница возникает при использовании локальной ветки с другим именем:

  • git checkout -b mybranch origin/abranch создаст mybranch и отследит origin/abranch
  • git checkout --track origin/abranch создаст только "abranch", а не ветвь с другим именем.

(То есть , как прокомментировал Себастьян Граф, если локальная ветвь еще не существовала.
Если это так, вам понадобится 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> является неоднозначным, но существует на пульте "origin".

Здесь "-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.

Когда локальная ветвь запускается из ветки удаленного отслеживания, Git устанавливает ветку (в частности, записи конфигурации branch.<name>.remote и branch.<name>.merge) so that git pull will appropriately merge from the remote-tracking branch.
, чтобы git pull соответствующим образом сливался из ветки удаленного отслеживания. DL29] Это поведение может быть изменено с помощью глобального флага конфигурации branch.autosetupmerge. Эта настройка может быть переопределена с помощью опций --track и --no-track, а позже изменена с помощью ветки git --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 status и git branch -v.
  • направляет git pull без аргументов для извлечения из восходящего потока при извлечении новой ветки.

Смотрите "Как сделать так, чтобы существующая ветка git отслеживала удаленную ветку?", чтобы узнать больше.

Ответ 2

Нет никакой разницы!

1) git checkout -b branch origin/branch

Если нет --track и no --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.

Как вы можете видеть: никакой разницы.

Но он становится еще лучше:

3) git checkout branch

также эквивалентен git checkout -b branch --track origin/branch, если "ветвь" еще не существует, но "начало/ветвь" имеет значение 1.


Все три команды устанавливают "восходящий поток" "ветки" как "источник/ветвь" (или они не работают).

Upstream используется как контрольная точка без аргументов git status, git push, git merge и, следовательно, git pull (если она настроена так (по умолчанию или почти по умолчанию)).

например. git status сообщает вам, насколько далеко вы находитесь или находитесь впереди, если вы настроены.

git push настроен на то, чтобы поместить текущую ветку вверх по потоку по умолчанию 2 так как git 2.0.

1... и если "origin" является единственным удаленным, имеющим "ветвь"
2 по умолчанию (с именем "simple" ) также применяется для того, чтобы оба имени ветки были равны

Ответ 3

В книге показано, что эти команды дают тот же эффект:

Простой случай - это пример, который вы только что видели, запуск 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), и вы уже на своем пути.

Ответ 4

Вы не можете создать новую ветку с помощью этой команды

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