使用 update-refs 重命名和修复错误后无法推送分支

Cannot push branch after renaming and fixing error with update-refs

我想将我的本地分支从 sort-rows-of-common-tables 重命名为 develop/sort-rows-of-common-tables,然后将其作为新分支推送到远程。我已经有一个名为 develop.

的本地和远程分支

所以我尝试了

git branch -m develop/sort-rows-of-common-tables

但我得到了

error: 'refs/heads/develop' exists; cannot create 'refs/heads/develop/sort-rows-of-common-tables'

所以我读了这个SO answer并通过运行ning

成功解决了问题
git update-ref -d refs/heads/develop
git branch -m develop/sort-rows-of-common-tables

现在我想在远程推送 develop/sort-rows-of-common-tables 分支,这个分支还不存在,而 develop 分支已经存在。

所以我尝试运行

git push origin develop/sort-rows-of-common-tables

但我明白了

Enumerating objects: 7, done.    
Counting objects: 100% (7/7), done.    
Delta compression using up to 4 threads    
Compressing objects: 100% (4/4), done.    
Writing objects: 100% (4/4), 607 bytes | 607.00 KiB/s, done.    
Total 4 (delta 3), reused 0 (delta 0), pack-reused 0    
remote: error: cannot lock ref 'refs/heads/develop/sort-rows-of-common-tables': 'refs/heads/develop' exists; cannot create 'refs/heads/develop/sort-rows-of-common-tables'    
To my_git_repo.git    
 ! [remote rejected] develop/sort-rows-of-common-tables -> develop/sort-rows-of-common-tables (failed to update ref)    
error: failed to push some refs to 'my_git_repo.git'

看起来我在本地遇到了同样的错误,所以我敢打赌,为了在远程修复它,我必须 运行 一个类似于我 运行 的命令before (git update-ref -d refs/heads/develop) 以远程引用为目标。

是否正确?如果是,我该如何更新远程引用?

我已搜索 git documentation 相关问题,但没有成功。

It looks like I get the same error I was getting on local,

是的,完全正确。

so I bet that in order to fix it on remote I have to run a command similar to the one I run before (git update-ref -d refs/heads/develop) which targets the remote refs.

差不多。您不能 运行 在远程端完全执行此命令。但是您可以通过推送删除远程分支:

git push origin :develop

git push origin --delete develop

请参阅 :dst and --delete 上的文档。

已解决

我遇到的问题不是技术问题,而是 logical/practical 问题:

如果您在一个分支上工作,在这种情况下 develop,包含对您的原样/“标准”代码的一些更改(假设原样代码位于 master 分支)开发名为 develop/added-somethingdevelop/added-something else 等的其他分支是没有意义的,因为那样的话 develop 中的更改将没有任何描述它们的“规范”(类似于 /specification-of-the-changes)。

这被 git 正确地禁止了,即,有一个现有的分支 changes,不允许有像 changes/specification.

这样命名的分支

Not functional (and forbidden by git):

develop/added-element1
develop/added-element2
develop/added-element3
develop # so what characterize this branch?

相反,应该有一个存放 AS IS 代码的存储库(比方说 master),然后是许多分支,存放正在进行更改的代码,并且这些分支应遵循类似 develop/added-something, develop/added-something-else, 其中在分支名称中清楚地恢复了表征它们的特征。

Functional (and allowed by git):

develop/added-element1
develop/added-element2
develop/added-element3