git push lokalny oddział o tej samej nazwie co zdalny tag


110

Próbuję wypchnąć nową lokalną gałąź product-0.2do zdalnego, gdzie jest już tag o tej samej nazwie (ale sama gałąź nie istnieje)

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'

Tak samo z:

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

Chociaż działa na odwrót, np. Utwórz gałąź product-0.1, zatwierdź na niej, a następnie zastosuj tag product-0.1.

Niektórzy ludzie omijają ten problem, usuwając lokalnie kolidujący tag, a następnie wypychając gałąź, a następnie pobierając zdalny tag, ale wydaje się to kłopotliwe i podatne na błędy.

Jak mogę utworzyć oddział przy minimalnym wysiłku?

Dzięki za wkład


1
Spróbuj refs/heads/product-0.2:refs/heads/product-0.2, tj. Bez wiodącego ukośnika, a także podaj pełne refspec po stronie lokalnej.
knittl

Można wypróbować produkt git push origin-0.2: produkt-0.2
vpatil

Odpowiedzi:


162

Następujące polecenie powinno działać.

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

16
Zaakceptowana odpowiedź, to jest sposób na ujednoznacznienie. Mimo to znacznie łatwiej jest nie mieć tagów i gałęzi o tej samej nazwie. Niektóre narzędzia (np. SourceTree) natkną się na niego i zostaniesz pozostawiony własnym urządzeniom, z linią poleceń jako jedynym rozwiązaniem. Dzięki chłopaki!
twój

2
+1. Podobnie działa, gdy trzeba ujednoznacznić nazwy zdalne:refs/remotes/remote_name/remote_branch
Kelvin,

1
Nieświadomie nazwał oznaczoną wersję wydania masteri nie mógł już wypychać do gałęzi o tej samej nazwie. git push origin refs/heads/masterzałatwił sprawę (potem usunąłem ten tag, żeby przestał się dziać).
tresf

Poza najlepszymi praktykami nadal nie byłbyś w stanie wypchnąć gałęzi, do której próbujesz pushować, jest gałęzią domyślną. Jak możemy to obejść?
Baksteen

Jeśli powyższe rozwiązanie nie działa, zrób to po zdjęciu pilota. git push origin --delete refs / heads / BRANCHNAME
alones

42

Sprawdź, jakie tagi są powiązane z Twoim oddziałem:

git tag

W moim przypadku miałem tag z tą samą nazwą oddziału. Usunięcie zadziałało:

git tag -d [tag-name]

1
Działało dobrze, miał tag z taką samą nazwą jak moja gałąź.
ChanceVI

20

Zmień nazwy.

Niezależnie od tego, czy robisz to lokalnie, czy zdalnie, po prostu zmień nazwy.

Znacznik i gałąź są zasadniczo tym samym w git: reprezentują wskaźnik do zatwierdzenia. Różnica polega na tym, że wskaźnik gałęzi przesuwa się do przodu w miarę wykonywania zatwierdzeń, podczas gdy znacznik pozostaje statyczny.

Jednakże , można wykonać git checkoutna każdej gałęzi lub etykiety. Dlaczego miałbyś walczyć z tymi wszystkimi podwójnymi imionami? Zmienić je.


Powinniśmy / mogli nazwać tag product-0.2.0z ostatnią cyfrą dla „poziomu poprawki”, ale mimo to mieliśmy konwencję nazewnictwa i nie mieliśmy w przeszłości problemów, kiedy gałąź została utworzona przed znacznikiem.
twój

Gdyby zespół już zaczął korzystać z oddziału, czy nie byłoby rozsądnie zmienić jego nazwę?
svassr

Zmień nazwę podmiotu, którego jeszcze nie wysłałeś.
TheBuzzSaw

Czy jesteś tego pewien @TheBuzzSaw? Ponieważ lokalnie mogę mieć jedno i drugie o tej samej nazwie, jako różne rzeczy.
John John Pichler,

1
Chociaż polecenie (jak wybrana odpowiedź) powyżej mogło rozwiązać pytanie - będąc nowym w git, nie rozumiałem ani pytania, ani odpowiedzi. TA odpowiedź przynajmniej daje a) radę ib) wyjaśnienie - nawet zalecenie na przyszłość. Zastanawiałbym się nad zadaniem własnego pytania, ale mam dość komentarzy, które już wcześniej zadawano - imho: pytanie, które nie jest zrozumiałe, nie jest tym samym, co pytanie dla początkujących. Ale takie jest życie;)
Michael Felt

15

Jeśli próbujesz przekazać tag, który ma taką samą nazwę gałęzi:

git push origin tag myTag

3
dobra robota! powinna to być akceptowana odpowiedź. zawsze czytaj odpowiedzi SO z długiego ogona
louis_guitton

Warto wiedzieć, ale w ogóle nie odpowiada na pytanie. Nie będę tego negatywnie głosował, ponieważ autorka podkreśla, że ​​jest odwrotnie, ale jako odpowiedź jest trudna do zaakceptowania.
Peter Halverson

12

Próbowałem dziś rano wypchnąć do repozytorium kanonicznego i otrzymałem następujący błąd:

$ 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'

Stało się tak, ponieważ przypadkowo utworzyłem lokalnie tag główny:

$ git tag
master
tag1
tag2
tag3
tag4

Po usunięciu tego tagu lokalnie:

git tag -d master

Znowu mogłem pchać.


Dobre wytłumaczenie. Musisz usunąć lokalny tag. Dzięki!
Chef Pharaoh

5

To się nie udało:

git push $origin $branch:$branch 

Podczas gdy to działało dla mnie:

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

1

Jeśli używasz drzewa źródłowego, wykonaj następujące kroki.

  1. znajdź nazwę tagu gałęzi w sekcji tagi
  2. kliknij Tag name delete tag.
  3. Upewnij się, że zaznaczyłeś „usuń tagi ze zdalnego” i kliknij OK

Spróbuj ponownie wprowadzić zmiany. teraz to zadziała.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.