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.