Эти две команды имеют одинаковый эффект ( спасибо ответу Роберта Симера за указание на это ).
Практическая разница возникает при использовании локальной ветки с другим именем :
git checkout -b mybranch origin/abranch
будет создавать mybranch
и отслеживатьorigin/abranch
git checkout --track origin/abranch
создаст только ' abranch
', а не ветку с другим именем.
(То есть, по замечанию от Себастьяна 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
.
Когда локальная ветвь запускается из ветки удаленного отслеживания, Git устанавливает ветку (в частности, записи конфигурации branch.<name>.remote
и branch.<name>.merge
), чтобы git pull
она соответствующим образом сливалась с веткой удаленного отслеживания.
Это поведение может быть изменено с помощью глобального 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 )
Регистрация вышестоящего филиала для местного филиала:
- скажите git, чтобы показать отношения между двумя ветвями в
git status
иgit branch -v
.
- направляет
git pull
без аргументов для извлечения из восходящего потока при извлечении новой ветви .
Смотрите " Как сделать так, чтобы существующая ветка git отслеживала удаленную ветку? "
git pull
, тогда как некоторые ветви попросили бы удалить удаленную ветку. Оказывается, если вы впервые проверяете удаленную ветку, которую создал ваш пир, gitbranch.<BNAME>.remote=origin
запускается и добавляет локальный gitconfig. Который затем позволяет выпускатьgit pull
. Однако, если вы тот, кто создает веткуgit checkout -b BNAME
, то git, конечно, не знает. Поэтому вы должны указать его удаленный.If <branch>
не найден, но существует ветвь отслеживания ровно в одном удаленном (вызовите его<remote>
) с совпадающим именем, рассматривайте как эквивалентное$ git checkout -b <branch> --track <remote>/<branch>
»branch.autoSetupMerge
дляalways
просто выполняет то , что мы говорим. Этот параметр по умолчаниюtrue
равен, что означает, что отслеживание будет выполняться только при извлечении удаленной ветви.true
не настраивает отслеживание для локально созданных филиалов.Там нет никакой разницы вообще!
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
.Как видите: без разницы.
Но это становится еще лучше:
3)
git checkout branch
также эквивалентно тому,
git checkout -b branch --track origin/branch
если «ветвь» еще не существует, но «происхождение / ветвь» существует 1 .Все три команды устанавливают «восходящий поток» «ветви» как «источник / ветвь» (или они терпят неудачу).
Вверх по течению используется в качестве опорной точки аргумент менее
git status
,git push
,git merge
и , таким образом ,git pull
(если он сконфигурирован таким образом (который по умолчанию или почти по умолчанию)).Например
git status
, если вы настроены, вам сообщают , насколько далеко вы находитесь позади или впереди.git push
по умолчанию настроен на передачу текущей ветви вверх по потоку 2, начиная с git 2.0.1 ... и если «origin» является единственным удаленным устройством, имеющим «ответвление»
2, то по умолчанию (называемое «simple») также обеспечивает одинаковое имя обеих ветвей
источник
Книга, кажется, указывает, что эти команды дают тот же эффект:
Это особенно удобно, когда ваши дополнения bash или oh-my-zsh git могут вытянуть
origin/serverfix
имя за вас - просто добавьте--track
(или-t
), и вы уже в пути.источник
Вы не можете создать новую ветку с помощью этой команды
если у вас есть изменения, которые не поставлены.
Вот пример:
Однако вы можете легко создать новую ветку с не поэтапными изменениями с помощью
git checkout -b
команды:источник
origin/branch
)origin/new-branch
вместоorigin/branch
. Вы знаете об этом?