Git: nie można zobaczyć nowej zdalnej gałęzi

118

Kolega wepchnął nowy zdalny oddział do origin / dev / homepage i nie widzę go po uruchomieniu:

$ git branch -r

Nadal widzę istniejące zdalne oddziały.

Zakładam, że dzieje się tak, ponieważ moje lokalne zdalne referencje nie są aktualne, dlatego kiedy uruchomiłem git pull, nic się nie wydarzyło, ponieważ git pull pobiera tylko bieżącą działającą gałąź, prawda? W przeciwieństwie do git push, które wypycha wszystkie gałęzie, które mają zmiany w odpowiedniej gałęzi zdalnej?

hybryda9
źródło
Powiązany problem - Nie widzę oddziału zdalnego
RBT
1
udało się zapomnieć git pull, dzięki
JelenaČuklina
1
W moim przypadku git fetch <name-of-remote>załatwił sprawę . Bez nazwy pilota to NIE działało.
Menno Deij - van Rijswijk

Odpowiedzi:

166

Najpierw sprawdź, czy gałąź została faktycznie przekazana zdalnie, używając polecenia git ls-remote origin. Jeśli nowa gałąź pojawi się w danych wyjściowych, spróbuj wydać polecenie git fetch: powinno pobrać odwołania do gałęzi ze zdalnego repozytorium.

Jeśli zdalna gałąź nadal się nie pojawia, sprawdź dwukrotnie (w danych ls-remotewyjściowych), jaka jest nazwa gałęzi na zdalnym, a konkretnie, czy zaczyna się od refs/heads/. Dzieje się tak, ponieważ domyślnie wartość remote.<name>.fetchto:

+refs/heads/*:refs/remotes/origin/*

tak, że tylko zdalne odniesienia, których nazwa zaczyna się od, refs/heads/będą mapowane lokalnie jako odwołania do zdalnego śledzenia w ramach refs/remotes/origin/(tj. staną się gałęziami zdalnego śledzenia)

Marco Leogrande
źródło
4
Udało mi się zobaczyć nową gałąź zdalną po wykonaniu pochodzenia git fetch, ale nie jestem pewien, jaka jest różnica, jeśli właśnie wykonałem git fetch? Czytałem o zdalnej aktualizacji git, ale nie byłem pewien, co by to spowodowało. Czy będę musiał uruchamiać pobieranie git dla nowych zdalnych oddziałów od teraz?
hybryda9
1
@ hybrid9 Jeśli używasz git fetch, git pobierze referencje z domyślnego repozytorium zdalnego, które zostało określone w .git/config: zwykle zostanie wywołane origin, więc oba polecenia są równoważne, ale twoja specyficzna konfiguracja może być inna z jakiegoś powodu. Nie, nie musisz podawać git fetchdla każdej gałęzi, ponieważ (domyślnie) pobiera wszystkie gałęzie.
Marco Leogrande
1
@ hybrid9 git pulljest równoważne z git fetch+ git merge(lub git rebasejeśli zmieniłeś wartości domyślne), więc możesz nadal używać go git pulljak zwykle, a nowe zdalne gałęzie pojawią się same.
Marco Leogrande
1
Początkowo korzystałem z git pull, ale nigdy nie widziałem tej nowej zdalnej gałęzi, która naprawdę mnie zdezorientowała. Tylko do momentu uruchomienia git fetch origin. Doceniam czas poświęcony na odpowiadanie na moje pytania.
hybryda
2
@hybrid Mam ten sam problem. git ls-remote gerritrepo:projectpokazuje nowy oddział zdalny ale git branch -anie ... Muszę zrobić kolejnego klona i dopiero wtedy pojawi się nowy oddział
Vikram
79

Sprawdź, czy .git/configzawiera

[remote "origin"]
    url = …
    fetch = +refs/heads/master:refs/remotes/origin/master

Jeśli tak, zmień to na

[remote "origin"]
    url = …
    fetch = +refs/heads/*:refs/remotes/origin/*

Wtedy powinieneś móc go używać:

$ git fetch
remote: Counting objects: …
remote: Compressing objects: ..
Unpacking objects: …
remote: …
From …
 * [new branch]            branchname -> origin/branchname
$ git checkout branchname
Branch branchname set up to track remote branch branchname from origin.
Switched to a new branch 'branchname'
Jesse Glick
źródło
12
Zdarzyło mi się to po pierwszym płytkim klonie.
ArkTekniK
Idealny!!! Wielkie dzięki! Zdarzyło mi się to podczas instalowania niestandardowego kranu Homebrew za pomocą polecenia brew tap user/repo: lokalna kopia sklonowanego repozytorium brewmiała ustawienia, o których wspomniałeś, i nie można było zobaczyć i użyć innych gałęzi, które miałem w moim repozytorium. Dzięki jeszcze raz! :) +1!
rmbianchi
3
Następujące polecenie może być użyte zamiast ręcznej edycji pliku .git / config . git config remote.origin.fetch "+refs/heads/*:refs/remotes/origin/*"a następnie, git fetch originaby uzyskać wszystkie gałęzie na początku .
dotnetCarpenter
to jest fajne!
madz
47

Najprostsza odpowiedź brzmi:

git fetch origin <branch_name>

Jacek Dziurdzikowski
źródło
2
To była dosłownie JEDYNA rzecz, która działała dla mnie.
Theodore R. Smith
3
Na mnie to nie działa. Otrzymuję ten błąd:fatal: Couldn't find remote ref <branch_name>
Parisa Khateri
3
tak, to zadziałało również dla mnie, po tym git checkout działało dobrze !!
whoami
30

Wykonanie zdalnej aktualizacji git zaktualizuje również listę gałęzi dostępnych w zdalnym repozytorium.

Jeśli używasz TortoiseGit, od wersji 1.8.3.0 możesz zrobić "Git -> Synchronizuj", a pojawi się przycisk "Zdalna aktualizacja" w lewym dolnym rogu okna, które się pojawi. Kliknij to. Następnie powinieneś być w stanie wykonać "Git -> Switch / Checkout" i wyświetlić nową gałąź zdalną w rozwijanym menu gałęzi, które możesz wybrać.

metaforge
źródło
18
git remote updatejest starym sposobem na zrobienie tego, nowszym preferowanym poleceniem jest git fetch.
W mojej wersji TortoiseGit (2.8.0.0) przycisk w lewym dolnym rogu ma wiele opcji pod strzałką i zapamiętuje to, co wybrałeś wcześniej. Oznacza to, że na przycisku może nie być napisane „Zdalna aktualizacja”. Jeśli nie użyłeś go wcześniej, powie „Pull”. Kliknij strzałkę, a na liście opcji zobaczysz „Zdalna aktualizacja”.
Michael Hinds
14

Powiedzmy, że szukamy wydania / 1.0.5

Kiedy git fetch -alljest nie działa i że nie można zobaczyć zdalną gałąź i git branch -rnie pokazuj tego konkretnego oddziału.

1. Wydrukuj wszystkie referencje ze zdalnego (gałęzie, tagi, ...):

git ls-remote origin Powinien pokazać ci zdalny oddział, którego szukasz.

e51c80fc0e03abeb2379327d85ceca3ca7bc3ee5        refs/heads/fix/PROJECT-352
179b545ac9dab49f85cecb5aca0d85cec8fb152d        refs/heads/fix/PROJECT-5
e850a29846ee1ecc9561f7717205c5f2d78a992b        refs/heads/master
ab4539faa42777bf98fb8785cec654f46f858d2a        refs/heads/release/1.0.5
dee135fb65685cec287c99b9d195d92441a60c2d        refs/heads/release/1.0.4
36e385cec9b639560d1d8b093034ed16a402c855        refs/heads/release/1.0
d80c1a52012985cec2f191a660341d8b7dd91deb        refs/tags/v1.0

W wynikach pojawi się nowa gałąź „release / 1.0.5”.

2. Wymuś pobranie zdalnego oddziału:

git fetch origin <name_branch>:<name_branch>

$ git fetch origin release/1.0.5:release/1.0.5

remote: Enumerating objects: 385, done.
remote: Counting objects: 100% (313/313), done.
remote: Compressing objects: 100% (160/160), done.

Receiving objects: 100% (231/231), 21.02 KiB | 1.05 MiB/s, done.
Resolving deltas: 100% (98/98), completed with 42 local objects.
From http://git.repo:8080/projects/projectX
 * [new branch]        release/1.0.5 -> release/1.0.5

Teraz masz również referencje lokalnie, kupujesz (lub cokolwiek) ten oddział.

Zadanie wykonane!

jpmottin
źródło
1
Jesteś ratownikiem życia :)
Chakri
# 2 był tym, czego szukałem. Dzięki!
Matthew
4

Brzmi banalnie, ale moim problemem było to, że nie byłem w odpowiednim projekcie. Upewnij się, że jesteś w projekcie, w którym spodziewasz się być; w przeciwnym razie nie będziesz w stanie ściągnąć odpowiednich gałęzi.

BlackHatSamurai
źródło
Ups! Dobry!
Marc
2

Użyłem brutalnej siły i wyjąłem pilota, a następnie go dodałem

git remote rm <remote>
git remote add <url or ssh>
Gumowa kaczuszka
źródło
1

W końcu zadziałało dla mnie dodanie nazwy zdalnego repozytorium do git fetchpolecenia, na przykład:

git fetch core

Teraz możesz zobaczyć je wszystkie w ten sposób:

git branch --all
Serj Sagan
źródło
0

Możesz zapłacić zdalny oddział / n git fetch && git checkout remotebranch

thao vu
źródło