我在本地创建了一个存储库,并将所有更改推送到github。 后来我创建了一个名为“v2”的新分支(“git branch v2”)并做了一些修改并将该分支推送到github。 后来当我执行命令“git remote show origin”时,我得到以下输出。
* remote origin
Fetch URL: https://github.com/mayuran19/se24_P03.git
Push URL: https://github.com/mayuran19/se24_P03.git
HEAD branch: master
Remote branches:
master tracked
v2 tracked
Local branch configured for 'git pull':
master merges with remote master
Local refs configured for 'git push':
master pushes to master (local out of date)
v2 pushes to v2 (local out of date)
但是当我执行命令“git branch -vv”时,它显示分支“v2”不是跟踪分支。
master bad4ed9 [origin/master] Correct name
* v2 6ec46b0 Data files
我的问题是,为什么分支v2没有显示为跟踪分支,即使远程分支在github中可用并且我能够执行此分支的拉动和推送?
命令“git branch -a”的输出显示以下输出
master
* v2
remotes/origin/master
remotes/origin/v2
但没有显示本地和远程分支之间的映射。
答案 0 :(得分:4)
首先我们需要一些定义。
local 分支(也称为“分支”,没有修饰符)是全名以refs/heads/
开头的分支。使用git branch
时,默认情况下您会看到本地分支。 git branch
命令会删除refs/heads/
部分,为您留下master
和v2
等名称。
远程跟踪分支的全名以refs/remotes/
开头(之后具有远程名称)。使用git branch -r
时,该命令将显示远程跟踪分支。 git branch -r
命令会删除refs/remotes/
部分,为您留下origin/master
和origin/v2
等名称。
前缀剥离有两种方式:git branch
将其关闭,您也可以将其关闭。这是为了方便起见,只要您不小心提供以origin/
开头的(常规,本地)分支名称,就可以正常工作。 (例如,如果你不小心命名了一个本地分支origin/abc
,你可能会混淆自己,而git有助于剥离前缀变得有害。)
(请注意,所有这些实体都是您自己的存储库的本地实体,尽管名称为“远程跟踪”。还可能存在其他引用,您可以使用git for-each-ref
查看所有这些实体,它将向您显示每个引用使用它的全名。大多数时候你不需要这个,git branch
就足够了。)
可以将(常规,本地)分支设置为 track 另一个分支。让一个分支跟踪另一个分支为您做了一些事情,例如make git status
告诉您何时领先和/或落后,并在git branch -vv
输出中包括另一个分支。 (设置跟踪与远程跟踪分支不同。同样,本地分支的名称以refs/heads/
开头,并且其名称不会更改是否设置为跟踪另一个分支。但是,术语肯定令人困惑。)
要使一个分支跟踪另一个分支,首先检查第一个分支(您要进行跟踪的分支)。然后,运行git branch --set-upstream-to otherbranch
。例如,要v2
跟踪origin/v2
:
git checkout v2
git branch --set-upstream-to origin/v2
要使本地分支跟踪另一个本地分支,只需使用本地分支名称而不是远程跟踪分支名称。要使本地分支停止跟踪任何内容,请使用git branch --unset-upstream
。
所有这一切还有一个技巧, 1 ,当你要求git checkout
检出(但不创建)不存在的本地分支时,{{1将搜索是否存在具有类似名称的远程跟踪分支。如果是这样,它将创建本地分支并将其设置为跟踪远程跟踪分支。也就是说,如果分支git checkout
不存在,例如,如果您重命名或删除现有的本地v2
- 而v2
仍然 < / em>存在,然后:
origin/v2
创建本地分支git checkout v2
,将其设置为一次跟踪v2
。
分支机构不需要跟踪另一个分支来推送和获取/合并/ rebase / pull,但是将其设置为跟踪可以使所有这些操作更方便。
1 与git一样,实际上有更多的方法可以使本地分支跟踪其他内容。您可以通过向推送添加origin/v2
来设置本地分支,以便在成功git push
上跟踪远程跟踪分支。您可以使用(不建议使用的)-u
命令。您可以使用标记git branch --set-upstream
或git checkout
来创建或重新创建具有跟踪集的分支。并且,您可以使用git branch
(使用两个单独的git config
命令)使本地分支跟踪其他分支。
答案 1 :(得分:3)
TL; DR v2
不是跟踪分支 - 没有设置上游。 pull
无法工作(您的想法)。 push
由于默认推送规则而起作用。
我的问题是,为什么分支v2没有显示为跟踪分支
如果您查看.git / config,您会看到包含跟踪信息的branch "master"
节,但您不会看到branch "v2"
节,即{{1 isn&#39; ta跟踪分支。
即使远程分支在github中可用
推送非跟踪分支并不会自动成为跟踪分支。您需要在推送中添加v2
才能执行此操作。您可能是在第一次推送非跟踪分支时执行此操作:
-u
由于我能够拉动和推动这个分支
$ git push -u origin v2
没有跟踪上游, pull
无法达到您的预期。它将更新本地仓库中的远程跟踪分支v2
,但它不会在本地origin/v2
分支中协调(合并或重新定位)本地提交与在远程设备上进行的任何新提交。但是,如果没有其他人对遥控器上的v2
分支进行更新,那么您可能不会注意到问题。
v2
的工作原理是默认的推送规则,它根据分支名称进行匹配。
push
Remote branches:
master tracked
v2 tracked
Local branch configured for 'git pull':
master merges with remote master
Local refs configured for 'git push':
master pushes to master (local out of date)
v2 pushes to v2 (local out of date)
部分显示您本地仓库中的远程跟踪分支Remote branches:
跟踪远程分支origin/v2
。 (远程跟踪分支v2
与您的本地origin/v2
分支不同。)v2
部分仅显示本地分支Local branch configured ...
受master
影响,即pull
跟踪远程master
。 master
未列出 - v2
不会影响它,因为它没有上游设置。pull
部分显示您的Local refs configured ...
分支将推送/更新到远程v2
(并更新v2
) - 这是基于推送命令& #39;默认匹配规则(也取决于您origin/v2
配置的设置方式以及您使用的push.default
版本。请注意git
和push
之间存在一点不一致或违反直觉的行为。传统上,pull
没有完全指定的refspec arg,默认情况下,并不关心上游 - 它只是在远程上推送同名的分支。由于跟踪的远程分支通常与本地分支命名相同,因此事情起作用,push
和push
命令似乎都使用配置的跟踪分支。但是,如果本地分支和远程分支的命名方式不同,pull
可能无法按预期工作。对push
和git
的{{1}}的各种版本的某些更改,即push
,push.default
和tracking
,会尝试协调这些更改差异。
补充阅读: