git push локальная ветка с тем же именем, что и удаленный тег


111

Я пытаюсь отправить новую локальную ветку product-0.2на удаленный, где уже есть тег с таким же именем (но сама ветка не существует)

git push -v --tags --set-upstream origin product-0.2:product-0.2 
Pushing to https://****@github.com/mycompany/product.git
error: src refspec product-0.2 matches more than one.
error: failed to push some refs to 'https://****@github.com/mycompany/product.git'

То же самое с:

git push origin product-0.2:/refs/heads/product-0.2 

Хотя работает наоборот, например, создать ветку product-0.1, зафиксировать ее, а затем применить тег product-0.1.

Некоторые люди обходят это, удаляя конфликтующий тег локально, затем нажимая ветку, а затем извлекая удаленный тег, но это кажется громоздким и подверженным ошибкам.

Как я могу создать свою ветку с минимальными усилиями?

Спасибо за ваш вклад


1
Попробуйте refs/heads/product-0.2:refs/heads/product-0.2, то есть без косой черты в начале, а также с указанием полной спецификации на локальной стороне.
— Knittl

Можно попробовать git push origin product-0.2: product-0.2
— vpatil

Ответы:


163

Следующая команда должна работать.

git push origin refs/heads/product-0.2:refs/heads/product-0.2 

16
Принял ответ, это способ снять двусмысленность. Тем не менее, проще вообще не иметь тегов и веток с одинаковыми именами. Некоторые инструменты (например, SourceTree) могут наткнуться на него, и вы останетесь наедине с собой, используя командную строку в качестве единственного решения. Спасибо вам, ребята!
— youri

2
+1. Аналогичная вещь работает, когда вам нужно устранить неоднозначность удаленных имен:refs/remotes/remote_name/remote_branch
— Кельвин

1
Неосознанно назвал выпуск с тегами masterи больше не мог нажимать на ветку с тем же именем. git push origin refs/heads/masterсделал трюк (затем я удалил этот тег, чтобы это прекратилось).
— tresf

Помимо лучших практик, вы все равно не сможете отправить ветку, которую вы пытаетесь отправить, является веткой по умолчанию. Как мы можем это обойти?
— Baksteen

1
Если вышеуказанное решение не работает, сделайте это после удаления удаленной головки. git push origin --delete refs / Heads / BRANCHNAME
— alones

42

Проверьте, какие теги связаны с вашей веткой:

git tag

В моем случае у меня был тег с таким же названием ветки. Удаление сработало:

git tag -d [tag-name]

1
Работал нормально, имел тег с тем же именем, что и моя ветка.
— ChanceVI

20

Измените имена.

Независимо от того, делаете ли вы это локально или удаленно, просто измените имена.

Тег и ветка в git по сути одно и то же: они представляют собой указатель на фиксацию. Разница в том, что указатель ветки продвигается по мере того, как вы делаете коммиты, в то время как тег остается статическим.

Однако вы можете выполнить операцию git checkoutлибо для ветки, либо для тега. Зачем тебе драться со всеми этими раздвоенными именами? Измените их.


Должен / мог бы вызвать тег product-0.2.0с последней цифрой для «уровня патча», но все же у нас было соглашение об именах, и мы не сталкивались с проблемами в прошлом, когда ветвь создавалась до тега.
— youri

Если бы команда уже начала использовать ветку, разве не стоило бы ее переименовать?
— svassr

Измените имя объекта, который вы еще не отправили.
— TheBuzzSaw

Ты уверен в этом @TheBuzzSaw? Потому что локально я могу иметь и то, и другое с одинаковым именем, как разные вещи.
— Джон Джон Пихлер

1
Хотя приведенная выше команда (как выбранный ответ), возможно, разрешила вопрос - будучи новичком в git, я не понял ни вопроса, ни ответа. ЭТОТ ответ дает по крайней мере а) совет и б) объяснение - даже рекомендацию на будущее. Я бы подумал о том, чтобы задать свой собственный вопрос, но меня утомляют комментарии, подобные уже заданным ранее - имхо: вопрос, который непонятен, не то же самое, что вопрос для начинающих. Но это жизнь;)
— Майкл Фелт

15

Если вы пытаетесь отправить тег с тем же именем, что и ветка:

git push origin tag myTag

3
молодец, сэр! это должен быть принятый ответ. всегда читайте ответы SO с длинным хвостом
— louis_guitton

Это полезно знать, но совсем не отвечает на вопрос. Я не буду отрицать это, поскольку автор подчеркивает, что это наоборот, но вряд ли приемлем в качестве ответа.
— Питер

12

Сегодня утром я пытался нажать на канонический репозиторий и получил следующую ошибку:

$ git push origin master
error: src refspec master matches more than one.
error: failed to push some refs to 'ssh://user@host/srv/git/repo'

Это произошло потому, что я случайно создал главный тег локально:

$ git tag
master
tag1
tag2
tag3
tag4

Как только я удалил этот тег локально:

git tag -d master

Я снова смог толкнуть.


Хорошее объяснение. Необходимо удалить локальный тег. Спасибо!
— Chef Pharaoh

5

Это не удалось:

git push $origin $branch:$branch 

Хотя это сработало для меня:

git checkout $branch
git push $origin HEAD:$branch

1

Если вы используете дерево исходных текстов, выполните следующие действия.

  1. найдите название тега ветки в разделе тегов
  2. нажмите на название тега удалить тег.
  3. Убедитесь, что вы отметили «удалить теги с пульта» и нажмите «ОК».

Попробуйте еще раз, чтобы внести изменения. теперь это будет работать.

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