Разница между git checkout --track origin/branch и git checkout -b branch origin/branch
Кто-нибудь знает разницу между этими двумя командами для переключения и отслеживания удаленной ветви?
git checkout -b branch origin/branch
git checkout --track origin/branch
Я думаю, что оба отслеживают удаленную ветвь, поэтому я могу перенести свои изменения в ветку по месту происхождения, верно?
Есть ли практические отличия??
Спасибо!
3 ответа
Эти две команды имеют одинаковый эффект ( спасибо ответу Роберта Симера за указание на это).
Практическая разница возникает при использовании локальной ветки с другим именем:
git checkout -b mybranch origin/abranch
создастmybranch
и отслеживатьorigin/abranch
git checkout --track origin/abranch
будет только создаватьabranch
', а не ветвь с другим именем.
(То есть, как прокомментировал Sebastian Graf, если местного отделения еще не было.
Если бы это было так, вам понадобится git checkout -B abranch origin/abranch
)
Сначала немного предыстории: отслеживание означает, что локальная ветвь имеет свой восходящий канал, настроенный на удаленную ветвь:
# 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 отслеживающей удаленную ветку? "
Там нет никакой разницы вообще!
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 значение по умолчанию (называемое "простым") также обеспечивает одинаковое имя обеих ветвей
Книга, кажется, указывает, что эти команды дают тот же эффект:
Простой пример - пример, который вы только что видели, запустив 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
) и вы уже в пути.
Вы не можете создать новую ветку с этой командой
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