При удалении удаленной ветки 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, а затем отправил туда свою локальную ветку с таким же именем. Попробуйте, если другие способы не работают. Другой способ - создать новую ветку локально и нажать пустую ветку, а затем выбрать свою фиксацию и снова нажать на свой пульт.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.