Вопрос по git-branch, branch, git, git-checkout – Разница между git checkout --track origin / branch и git checkout -b branch origin / branch

154

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

<code>git checkout -b branch origin/branch
git checkout --track origin/branch
</code>

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

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

Спасибо!

Ваш Ответ

3   ответа
213

спасибо ответу Роберта Симера за указание на это).

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

git checkout -b mybranch origin/abranch will create mybranch and track origin/abranch git checkout --track origin/abranch will only create 'abranch', not a branch with a different name.

(То есть,как прокомментировано отСебастьян Граф, если местный филиал сделалnot уже существует
Если бы это было так, вам понадобитсяgit checkout -B abranch origin/abranch)

Сначала немного предыстории:Tracking означает, что локальная ветвь имеет свой восходящий канал, настроенный на удаленную ветвь:

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

git checkout -b branch origin/branch будут:

create/reset branch to the point referenced by origin/branch. create the branch branch (with git branch) and track the remote tracking branch origin/branch.

When a local branch is started off a remote-tracking branch, Git sets up the branch (specifically the branch.<name>.remote and branch.<name>.merge configuration entries) so that git pull will appropriately merge from the remote-tracking branch.
This behavior may be changed via the global branch.autosetupmerge configuration flag. That setting can be overridden by using the --track and --no-track options, and changed later using 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

Это также установило бы восходящий поток для & apos;branch& APOS ;.

(Примечание: git1.8.0 устареетgit branch --set-upstream и заменить его наgit branch -u|--set-upstream-to: увидетьgit1.8.0-rc1 анонс)

Регистрация вышестоящего филиала для местного филиала:

tell git to show the relationship between the two branches in git status and git branch -v. directs git pull without arguments to pull from the upstream when the new branch is checked out.

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

@VonC Я уважаю это и согласен с тем, что вам нужно знать, что вы собираетесь отказаться при выполнении этих конфигураций. Но я хотел бы спросить: что произойдет, если вы оформите ветку с--track вариант, имея этоautosetupmerge установка на? Я думаю, что ваша явная конфигурация должна переопределятьautosetupmerge вариант. Просто спрашиваю, пробовал ли ты это уже
@VonC Я нашел лучшую конфигурацию для этого. установкаbranch.autoSetupMerge вalways просто выполняет то, о чем мы говорим. Этот параметр по умолчаниюtrue, что означает, что отслеживание будет выполняться только при проверке удаленной ветви.true не настраивает отслеживание для локально созданных филиалов.
@batilc Я согласен. Я склонен не использовать всегда, так как я предпочитаю явно устанавливать отслеживание, но в вашем случае это должно быть правильным параметром.
@batilc & quot; Оказывается, если вы в первый раз проверяете удаленную ветку, созданную вашим партнером, & quot ;; да, читаюgit-scm.com/docs/git-checkoutВижу: & quot;If <branch> не найден, но существует ветвь отслеживания ровно в одном удаленном<remote>) с совпадающим именем, рассматривать как эквивалент$ git checkout -b <branch> --track <remote>/<branch>& Quot;
@VonC Я искал ту маленькую деталь, которую ты упомянул в качестве дополнительной информации. В моем случае мне было любопытно, почему у меня есть некоторые мои ветви позволяют мнеgit pullв то время как некоторые ветви будут запрашивать удаленную ветку для извлечения. Оказывается, если вы в первый раз проверяете удаленную ветку, которую создал ваш пир, git продолжает и добавляетbranch.<BNAME>.remote=origin в местном gitconfig. Который затем позволяет выпускатьgit pull, Тем не менее, если вы тот, кто создает веткуgit checkout -b BNAMEтогда мерзавец конечно не знает. Поэтому вы должны указать его удаленный.
25

There is no difference at all!

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

& # x201C; Для удобства & # x201D ;,--track без-b подразумевает-b и аргумент-b предполагается, что это & # x201C; branch & # x201D ;. Догадка определяется переменной конфигурацииremote.origin.fetch.

В сущности, 2) ведет себя какgit checkout -b branch --track origin/branch.

As you can see: no difference.

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

3) git checkout branch

также эквивалентноgit checkout -b branch --track origin/branch if & # x201C; branch & # x201D; еще не существует, но & # x201C; origin / branch & # x201D; делает1.

Все три команды устанавливают & # x201C; upstream & # x201D; из & # x201C; branch & # x201D; быть & # x201C; происхождением / ветвью & # x201D; (или они терпят неудачу).

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

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

git push по умолчанию настроен на передачу текущей ветви вверх по течению2 начиная с мерзавца 2.0.

1 ...and if “origin” is the only remote having “branch”
2 the default (named “simple”) also enforces for both branch names to be equal

5

Книга кажется, указывает, что эти команды дают тот же эффект:

The simple case is the example you just saw, running git checkout -b [branch] [remotename]/[branch]. If you have Git version 1.6.2 or later, you can also use the --track shorthand:

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

To set up a local branch with a different name than the remote branch, you can easily use the first version with a different local branch name:

$ git checkout -b sf origin/serverfix

Это особенно удобно, когда ваши завершающие команды bash или oh-my-zsh git способны вытянутьorigin/serverfix имя для вас - просто добавить--track (или же-t) и вы уже в пути.

Похожие вопросы