首页 > 解决方案 > 使用 'git 分支 -D. 重新创建具有相同名称的分支时阻止更新

问题描述

我有一个名为prod的主要分支。之前,正如下面将要解释的,我删除了prod上先前推送的远程分支:

git branch -D CPR1793prod

请注意,这删除了本地和远程分支。然后我开始使用分支prod

git checkout prod
Switched to branch prod
Your branch is up to date with 'origin/prod'.

prod包含我要更新的文件 errors_en.json,因此我创建了一个分支:

git checkout -b CPR1793prod
Switched to a new branch 'CPR1793prod'

我将更新的文件移动到此目录中并进行了添加提交

git add .
git commit .
[CPR1793prod de136b2] Correct spelling as noted in CPR-1699 and -1793
 1 file changed, 5 insertions(+), 5 deletions(-)

然后当然我尝试使用以下结果推送更新:

git push origin CPR1793prod
To https://<pathname obfuscated>/scm/opscfg/errors.git
 ! [rejected]        CPR1793prod -> CPR1793prod (non-fast-forward)
error: failed to push some refs to 'https://p-bitbucket.<obfuscated>.com/scm/opscfg/errors.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details. 

尽管消息说当前分支 (CPR1793prod) 落后于其远程分支,但事实并非如此。我们尝试了很多次查看 fie 内容,在签出prod后立即进行拉取,在完成后查看 bitbucket

git branch -D CPR1793prod

确保远程分支确实被“删除”,并执行

git branch

确保本地分支不存在(被“删除”)。

当我更改分支的名称(从“CPR1793prod”到“1793prod”)时,问题得到了解决。这向我表明的是命令:

git branch -D <branch name>

一定不能正常工作,并且以某种方式留下了一些我无法检测到的碎屑,至少使git push命令无法正常工作。

请注意,我对其他几个存储库执行了这组命令,没有任何问题。

标签: git

解决方案


请注意, [ git branch -D ...] 删除了本地和远程分支...

不,它没有。

使用您自己的git branch命令来删除您自己的(本地)远程跟踪名称通常是不合适的,例如refs/remotes/origin/CPR1793prod,但要做到这一点,您必须运行第二个git branch -dgit branch -D命令:

git branch -D -r origin/CPR1793prod

例如。(它不太合适的原因是你的 Git 正试图跟踪他们的Git 分支。在本地删除它并没有真正的效果:如果他们仍然有CPR1793prod,你的下一个git fetch origin只会带回你的origin/CPR1793prod。)

(要列出您自己的普通分支名称,请使用git branch。要列出您的远程跟踪名称,请使用git branch -r。要同时列出两者,请使用git branch -a。现在尝试git branch -rgit branch -a观察其中一个打印名称 likeorigin/master和另一个的奇怪差异打印名称如remotes/origin/master. 为什么?谁知道。名是refs/remotes/origin/master; 可以去掉refs/orrefs/remotes/部分; 两个命令之一只去掉refs/, 另一个去掉refs/remotes/.)

要让另一个 Git删除它自己的 CPR1793prod,请使用git push,或者与--delete删除 refspec 语法一起使用:

git push origin --delete CPR1793prod

或者:

git push origin :CPR1793prod

两者都应origin以下形式的请求发送到 Git:请删除您自己的CPR1793prod分支。 如果 (a) 这行得通——远程被允许拒绝这个请求,在这种情况下你需要看看它为什么这样做——并且 (b) 你跟进这个:

git fetch origin --prune

您的 Git 将自动删除您的refs/remotes/origin/CPR1793prod远程跟踪名称。

(我喜欢在我的Git配置中设置fetch.prune为应该必须配置为禁用此行为,但这不会向后兼容。)true--globalgit fetchgit fetch --prunefetch.prunefalse


推荐阅读