При удалении удаленной ветки git «ошибка: невозможно отправить в неквалифицированный пункт назначения»

140

Я пытаюсь удалить удаленную ветку git с помощью

git push origin :my_remote_branch

и получая:

error: unable to push to unqualified destination: my_remote_branch
The destination refspec neither matches an existing ref on the remote nor
begins with refs/, and we are unable to guess a prefix based on the source ref.
error: failed to push some refs to 'git@example.com:/myrepo'

это мои текущие ветки

git branch -a
* develop
  master
  remotes/origin/HEAD -> origin/master
  remotes/origin/develop
  remotes/origin/my_remote_branch

git branch -r --merged
  origin/HEAD -> origin/master
  origin/develop
  origin/master

Приветствуются любые идеи о том, как я могу избавиться от этой ветки.

Хьюго
источник
Вы пытались git fetchпроверить, исправлено ли это несуществующее удаленное имя? Вы пытались зайти в свой .git\refs\remotes\originи удалить my_remote_branchфайл, чтобы посмотреть, достаточно ли этого?
VonC
сделал, git fetchно это не помогло. Мы попытаемся найти более простое решение, прежде чем пытаться удалить файл вручную.
Хьюго
попробуйте удалить или хотя бы переместить этот файл: он содержит только SHA1 кончика этой ветки.
VonC
45
Вы должны сделать это, git fetch -pчтобы избавиться от устаревших веток отслеживания.
Ян Худек

Ответы:

274

Тот факт, что refs/remotes/origin/my_remote_branchсуществует в вашем локальном репозитории, не означает, что он refs/heads/my_remote_branchсуществует в originудаленном репозитории.

Сделайте, git fetch -p originчтобы refs/remotes/origin/my_remote_branchуйти, если он уже удален в источнике. -pОпция говорит выборки, чтобы удалить все ветки отслеживания , которые больше не существует в соответствующих пультах дистанционного управления; по умолчанию они хранятся.

Ян Худек
источник
12
git fetch -p originисправил это для меня. Большое спасибо.
redimp
1
Ваш ответ потрясающий. Коротко и о сути!
1nstinct,
обрезка не помогла! пока git push origin --delete origin/feature/xдал мне ошибку о несуществовании ref git push origin :feature/x, удалил ветку. Поэтому я думаю, git push origin --delete <branchName>что не следует включать происхождение в branchName (?), Но оно завершено bash, что сбивает с толку.
dashesy
@dashesy, вы оказались в другой ситуации, чем исходный спрашивающий. В исходном вопросе проблема в том, что удаленная ветка уже была удалена , предположительно кем-то другим, поэтому нужно было синхронизировать только локальную. Пока вы удаляете пульт. Действительно, команда должна быть git push origin --delete feature/x, потому что вы даете название филиала в нуле , и она не имеет этот префикс там (две формы иначе синонимы в любом случае).
Ян Худек
@JanHudec имеет смысл. При использовании Bash complete разумно :не включать, originно он завершается как, origin/branch_nameа не просто branch_nameпри использовании --deleteварианта.
dashesy
57

Обнаружен вопрос, очищающий старые удаленные ветки git, и это помогло

git branch -r -d origin/my_remote_branch
Хьюго
источник
Я пытаюсь сделать именно это уже около часа, большое спасибо!
sebkkom
Это не удаляет удаленную ветку. Если вы запустите git fetch, вы снова увидите ветку. Он просто удаляет его из вашего локального списка удаленных веток.
Патрик Дежарден,
2
@PatrickDesjardins точно git push origin :my_remote_branchудаляет ветку с пульта дистанционного управления и git branch -r -d origin/my_remote_branchудаляет ее из моего локального списка удаленных ветвей
Хьюго
12

Я столкнулся с этим при попытке удалить удаленную ветку, которая уже была удалена. Все, что было нужно, это чернослив:

git remote prune origin
Мэтью
источник
4

Попробуйте следующие два варианта принудительного удаления удаленной ветки

Опция 1

get push origin --delete <branchName>

Вариант 2

git fetch -p origin
git branch -r -d origin/<branchName>
Паван Махешвари
источник
3
git branch -r -d origin/my_remote_branch

мне было мало. Раньше мне приходилось идти на сервер и напрямую работать с каталогом git (что опасно и некрасиво), чтобы удалить ветку:

ssh mygitserver
su - git
cd /home/git/repositories/my_remote_branch.git/
git  --git-dir=. --work-tree=/tmp/ branch -D my_remote_branch
Певик
источник
Это не только опасно и уродливо, но и неправильно . С одной стороны, этот вопрос об удалении ветви локально , когда он был удален на удаленном. А с другой стороны, удаление ветки с пульта - это всего лишь вопрос git push origin :my_remote_branch. Обратите внимание на толстую кишку.
Ян Худек
Ты прав, Ян, это git push origin :my_remote_branchнормально. Этот уродливый и опасный способ - это когда он не работает (например, из-за неправильно сконфигурированного git).
pevik 08
1

У меня аналогичная проблема. Сначала пошел на это обсуждение, однако я не мог решить проблему, пока не увидел https://stackoverflow.com/a/32147743/4209849 .

которые просто добавляют подсказку о различении origin/my-branch-nameи my-branch-name.

Чтобы быть конкретным, я должен использовать:

git push origin :my_remote_branch

вместо того

git push origin :origin/my_remote_branch

Это, по крайней мере, решило мою проблему, надеюсь, это поможет и другим.

Канцяо Чжао
источник
1

Для меня проблема заключалась в том, что это была моя ветка по умолчанию на github. Я изменил ветку по умолчанию, после чего операция удаления прошла успешно.

Надеюсь, это кому-то поможет

Влад Пуличев
источник
0

При такой же проблеме я вручную отредактировал свой ./.git/configфайл, включив в него:

[branch "branchName"]
remote = origin
merge = refs/heads/branchName

В результате: error: src refspec branchName matches more than one.Это я исправил, запустив $git tag -d branchName. После этого я смог отправить новую ветку в апстрим.

Кавизи Джозеф
источник
0

У меня это сработало: я создал удаленную ветку в пользовательском интерфейсе github, а затем отправил туда свою локальную ветку с таким же именем. Попробуйте, если другие способы не работают. Другой способ - создать новую ветку локально и нажать пустую ветку, а затем выбрать свою фиксацию и снова нажать на свой пульт.

Нутан
источник