git - 使用 '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 branch -D ...
] 删除了本地和远程分支...
不,它没有。
使用您自己的git branch
命令来删除您自己的(本地)远程跟踪名称通常是不合适的,例如refs/remotes/origin/CPR1793prod
,但要做到这一点,您必须运行第二个git branch -d
或git 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 -r
并git 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
--global
git fetch
git fetch --prune
fetch.prune
false
推荐阅读
- angularjs - 无法将数据发送到另一个控制器AngularJS
- json - XML 表单 - 根据条件类型显示输入
- terraform - 向多个帐户提供 Terraform
- python - 使用python从s3只读取文件名
- python-3.x - 循环仅将最后一个结果添加到列表中
- python - 如何在 gin 和 Python 之间进行通信
- java - 如何使用 JDK11 防止 java.lang.IllegalAccessError?
- django - 如何在 Django 中使用 prefetch_related 从查询集中获取属性?
- sql-server - SQL Server:如何找到最大长度连续范围?
- reactjs - 反应状态 - 无法更新状态