如何更改 HEAD 指向的远程分支?
How to change which remote branch HEAD points to?
SO 上有很多与此相关的答案,但 none 似乎对我有用。
我正在使用 git 版本。 2.25.1.
git remote show origin
显示:
remote origin Fetch URL: /opt/ideatree Push URL: /opt/ideatree
HEAD branch: dotImport
Remote branches:
dotImport tracked
getProdWorking tracked
master tracked Local branch configured for 'git pull':
master merges with remote master Local ref configured for 'git push':
master pushes to master (up to date)
本地没问题。我试图将“HEAD 分支:dotImport”更改为“HEAD 分支:master”。
因为 'dotImport' 最终不是主分支我想在远程删除它,但只要 HEAD 设置为 dotImport:
就不会发生
git push origin --delete dotImport
remote: error: By default, deleting the current branch is denied, because the next
remote: 'git clone' won't result in any file checked out, causing confusion.
正在尝试重新分配 HEAD:
git symbolic-ref HEAD refs/heads/master
没有效果。
git remote set-head origin --auto
产量:
origin/HEAD set to dotImport
就是不动。
这是它在遥控器上的另一种看法,与 'git remote show origin' 所说的不一致:
git branch -r
origin/HEAD -> origin/master
origin/dotImport
origin/master
也许我遗漏了一个步骤,即使用本地进行的 HEAD 更改来更新遥控器?
我在 SO 上阅读的答案(例如 that question or that question 的答案)似乎表明它无法完成——不能仅通过 git
从遥控器的克隆中完成。
你应该看看你是否可以访问中央仓库(例如,如果你有一个自托管的 gitlab 服务器)并从中央仓库本身更改 HEAD
,或者通过 Web GUI(对于 github.com 例如)为您的项目设置“默认分支”。
origin
的 URL 是 /opt/ideatree
。这没有“方案”部分(前面没有 https://
或 git://
或 ssh://
),所以它只是一个本地文件:您计算机上的 Git 软件将在您自己的机器上调用 Git 软件。它会调用自己!它会询问自己——它自己的另一个实例——到 cd /opt/ideatree
,它应该在哪里找到另一个 Git 存储库。
正是 other Git 存储库,在 /opt/ideatree
中,分支 dotImport
已签出。这会产生这些错误消息(来自“other”Git——第二个 Git 实例,运行ning in /opt/ideatree
):
error: By default, deleting the current branch is denied, because the next
'git clone' won't result in any file checked out, causing confusion.
这些错误消息会转发给您自己的 Git,它会在每行前面加上单词 remote:
,从而导致您看到两行。
Here's another view of what it looks like on the remote, which disagrees with what 'git remote show origin' says:
git branch -r
origin/HEAD -> origin/master
origin/dotImport
origin/master
您是如何获得这种观点的? (如果您通过 运行ning git branch -r
在您自己的克隆中本地获得它,请注意 -r
显示的是您的克隆目前拥有的,而不是远程目前拥有的。 运行 git fetch
更新你的克隆拥有的东西,除了它不更新 origin/HEAD
;要做到这一点,你必须 运行 git remote origin set-head --auto
。)确实如此不同意你的 git remote show origin
所说的内容,也不同意你收到的错误消息。
至少在获得适当权限的情况下,您应该能够:
cd /opt/ideatree
git checkout master
切换/opt/ideatree
到分支master
。但是,如果 /opt/ideatree
本身就是 git push
操作的 target,通常最明智的做法是将其设置为 bare 存储库:一个根本没有工作树的存储库。在这种情况下,没有任何东西被签出,这意味着不能处理任何分支,这意味着任何分支名称都可以被推送到(尽管不能删除 HEAD
分支,这意味着你想使用 git symbolic-ref
命令来调整它,如果你决定使用 main
而不是 master
例如)。不过,所有这一切都发生在 /opt/ideatree
;在那里完成后,您 cd
回到您工作的地方。
(如果你想能够进行推送部署,你需要一些额外的胶水代码。Git 部署系统很差,但我没有任何其他系统推荐。)
SO 上有很多与此相关的答案,但 none 似乎对我有用。
我正在使用 git 版本。 2.25.1.
git remote show origin
显示:
remote origin Fetch URL: /opt/ideatree Push URL: /opt/ideatree
HEAD branch: dotImport
Remote branches:
dotImport tracked
getProdWorking tracked
master tracked Local branch configured for 'git pull':
master merges with remote master Local ref configured for 'git push':
master pushes to master (up to date)
本地没问题。我试图将“HEAD 分支:dotImport”更改为“HEAD 分支:master”。
因为 'dotImport' 最终不是主分支我想在远程删除它,但只要 HEAD 设置为 dotImport:
就不会发生git push origin --delete dotImport
remote: error: By default, deleting the current branch is denied, because the next
remote: 'git clone' won't result in any file checked out, causing confusion.
正在尝试重新分配 HEAD:
git symbolic-ref HEAD refs/heads/master
没有效果。
git remote set-head origin --auto
产量:
origin/HEAD set to dotImport
就是不动。
这是它在遥控器上的另一种看法,与 'git remote show origin' 所说的不一致:
git branch -r
origin/HEAD -> origin/master
origin/dotImport
origin/master
也许我遗漏了一个步骤,即使用本地进行的 HEAD 更改来更新遥控器?
我在 SO 上阅读的答案(例如 that question or that question 的答案)似乎表明它无法完成——不能仅通过 git
从遥控器的克隆中完成。
你应该看看你是否可以访问中央仓库(例如,如果你有一个自托管的 gitlab 服务器)并从中央仓库本身更改 HEAD
,或者通过 Web GUI(对于 github.com 例如)为您的项目设置“默认分支”。
origin
的 URL 是 /opt/ideatree
。这没有“方案”部分(前面没有 https://
或 git://
或 ssh://
),所以它只是一个本地文件:您计算机上的 Git 软件将在您自己的机器上调用 Git 软件。它会调用自己!它会询问自己——它自己的另一个实例——到 cd /opt/ideatree
,它应该在哪里找到另一个 Git 存储库。
正是 other Git 存储库,在 /opt/ideatree
中,分支 dotImport
已签出。这会产生这些错误消息(来自“other”Git——第二个 Git 实例,运行ning in /opt/ideatree
):
error: By default, deleting the current branch is denied, because the next 'git clone' won't result in any file checked out, causing confusion.
这些错误消息会转发给您自己的 Git,它会在每行前面加上单词 remote:
,从而导致您看到两行。
Here's another view of what it looks like on the remote, which disagrees with what 'git remote show origin' says:
git branch -r origin/HEAD -> origin/master origin/dotImport origin/master
您是如何获得这种观点的? (如果您通过 运行ning git branch -r
在您自己的克隆中本地获得它,请注意 -r
显示的是您的克隆目前拥有的,而不是远程目前拥有的。 运行 git fetch
更新你的克隆拥有的东西,除了它不更新 origin/HEAD
;要做到这一点,你必须 运行 git remote origin set-head --auto
。)确实如此不同意你的 git remote show origin
所说的内容,也不同意你收到的错误消息。
至少在获得适当权限的情况下,您应该能够:
cd /opt/ideatree
git checkout master
切换/opt/ideatree
到分支master
。但是,如果 /opt/ideatree
本身就是 git push
操作的 target,通常最明智的做法是将其设置为 bare 存储库:一个根本没有工作树的存储库。在这种情况下,没有任何东西被签出,这意味着不能处理任何分支,这意味着任何分支名称都可以被推送到(尽管不能删除 HEAD
分支,这意味着你想使用 git symbolic-ref
命令来调整它,如果你决定使用 main
而不是 master
例如)。不过,所有这一切都发生在 /opt/ideatree
;在那里完成后,您 cd
回到您工作的地方。
(如果你想能够进行推送部署,你需要一些额外的胶水代码。Git 部署系统很差,但我没有任何其他系统推荐。)