Какая разница между git "--track" и "--set-upstream-to"?

Как я вижу, оба git --track и --set-upstream-to изменяют ветвь, поэтому она становится ветвью отслеживания (или восходящего потока). Но где тонкая разница, которую я не могу понять. --track записывает "удаленные ветки локализации":

$ git checkout foo -b
$ git branch --track origin/retarget

Branch origin/retarget set up to track local branch foo.

$ cat .git/config
[branch "origin/retarget"]
        remote = .
        merge = refs/heads/foo

Пока --set-upstream-to записывает "локальная ветвь отслеживает удаленную ветку":

$ git checkout foo -b
$ git branch --set-upstream-to origin/retarget

Branch foo set up to track remote branch retarget from origin.

$ cat .git/config
[branch "foo"]
        remote = origin
        merge = refs/heads/retarget

Какая разница между этими двумя? Я был уверен, что "ветвь отслеживания" представляет собой простую концепцию с дополнительным указателем upstream внутри ветки, который отслеживает позицию head указанной ветки в репозитории remote. Но кажется ли это намного сложнее?

Ответ 1

$ git checkout foo -b
$ git branch --track origin/retarget

Первые две команды инструктируют git:

  • создайте локальную ветвь с именем "origin/retarget" (очень плохая идея, так как она называется удаленной ветвью отслеживания), в то время как на самом деле это простая локальная ветвь с "/" в ее имени)
  • начиная с текущей ветки ( "foo", другой локальной ветки)
  • чтобы эта новая локальная ветвь отслеживала начальную точку.

См. git branch

--track

При создании новой ветки настройте записи конфигурации branch.<name>.remote и branch.<name>.merge, чтобы отметить ветвь начальной точки как "вверх по течению" от новой ветки.

Вы должны использовать дорожку при создании ветки, начиная с удаленного отслеживания.

Другими словами, ваш первый пример - это не то, как вы бы использовали --track.
Это будет работать лучше:

git checkout -b foo --track origin/retarget

Что касается разницы между --track и --set-upstream-to:

--set-upstream-to

Если указанная ветвь еще не существует или если задана --force, она действует точно так же, как --track.
В противном случае настройка конфигурации типа --track будет при создании ветки, , за исключением того, что точки ветвления не изменены.

Ответ 2

Предположим, что у вас есть одна ветвь master, которая вычеркнута. Теперь, когда вы делаете

$ git branch --track someBranch

вы создадите новую ветвь с именем someBranch, изменения которой будут отслежены в соответствии с ветвью master. Но эта ветвь не имеет удаленного набора ветвей. Таким образом, вы видите remote = . в конфигурации git.

Теперь, когда отслеживается someBranch, это означает, что изменения появятся в git status и git branch -v, как если бы существовал удаленный файл.

Например, если вы сделаете фиксацию на someBranch git, вы скажете, что вы 1 ahead, когда вы выполняете git branch -v или когда вы делаете git status, он показывает вам

Your branch is ahead of 'master' by 1 commit.

И это интересная часть. Отслеживается ветвь, а git показывает, что она 1 совершает перед master (ветвь, которая была проверена при создании someBranch)