Poprosiłeś mnie o pociągnięcie, nie mówiąc mi, z którą gałęzią chcesz się połączyć

125

TL; DR: Mam „śledzoną” gałąź, której nie mogę wyciągnąć.

Więc jestem w "wiadrze-4":

$ git branch -v
  bucket-1       410f7b5 * gh-53 * gh-48 * "Share App"
  bucket-2       7ed70a2 * upgrade to SOLR 3.3.0
  bucket-3       400ffe4 * emergency fix prod issue
* bucket-4       64c2414 Merge branch 'bucket-3' into bucket-4
  master         8dc4854 [ahead 1] * gh-73

Chciałbym pobrać zmiany z mojego pilota:

$ git pull

You asked me to pull without telling me which branch you
want to merge with, and 'branch.bucket-4.merge' in
your configuration file does not tell me, either. Please
specify which branch you want to use on the command line and
try again (e.g. 'git pull <repository> <refspec>').
See git-pull(1) for details.

If you often merge with the same branch, you may want to
use something like the following in your configuration file:

    [branch "bucket-4"]
    remote = <nickname>
    merge = <remote-ref>

    [remote "<nickname>"]
    url = <url>
    fetch = <refspec>

See git-config(1) for details.

Hmm, dziwne, pomyślałem, że dodałem już „wiadro-4” jako gałąź śledzącą. Zobaczmy:

$ git remote show origin
* remote origin
  Fetch URL: [email protected]:abcd/main.git
  Push  URL: [email protected]:abcd/main.git
  HEAD branch (remote HEAD is ambiguous, may be one of the following):
    bucket-3
    master
  Remote branches:
    bucket-1       tracked
    bucket-2       tracked
    bucket-3       tracked
    bucket-4       tracked
    master         tracked
  Local branches configured for 'git pull':
    bucket-1       merges with remote bucket-1
    bucket-2       merges with remote bucket-2
    bucket-3       merges with remote bucket-3
    master         merges with remote master
  Local refs configured for 'git push':
    bucket-1       pushes to bucket-1       (up to date)
    bucket-2       pushes to bucket-2       (up to date)
    bucket-3       pushes to bucket-3       (up to date)
    bucket-4       pushes to bucket-4       (local out of date)
    master         pushes to master         (fast-forwardable)

Rzeczywiście, bucket-4 jest oznaczony jako „śledzony”, ale w jakiś sposób jest skonfigurowany do wypychania, ale nie do ściągania.

Patrząc na mój .git/configplik, widzę, że mam wpisy „zdalne” i „scalające” dla większości moich gałęzi, ale nie dla zasobnika-4. Jak to w ogóle jest uważane za „śledzone” bez tego?

[remote "origin"]
    url = [email protected]:abcd/main.git
    fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
    remote = origin
    merge = refs/heads/master
[branch "rel-2011-07-07"]
    remote = origin
    merge = refs/heads/rel-2011-07-07
[branch "bucket-1"]
    remote = origin
    merge = refs/heads/bucket-1
[branch "bucket-2"]
    remote = origin
    merge = refs/heads/bucket-2
[branch]
    autosetupmerge = true
[branch "bucket-3"]
    remote = origin
    merge = refs/heads/bucket-3

Widzę, że prawdopodobnie rozwiązaniem jest tutaj, aby dodać remote/mergewpisy do wiadra-4 w moim pliku konfiguracyjnym. Ale jak to jest uważane za „śledzone” bez tego? bucket-4 został utworzony lokalnie, a następnie wysłany na serwer z tego repozytorium, więc podejrzewam, że jakoś nie skonfigurowałem poprawnie śledzenia dla tej gałęzi.

Czy jest jakaś konfiguracja, którą mogę dodać, aby wszystkie lokalne oddziały prawidłowo śledziły swoje piloty w przyszłości?

George Armhold
źródło
2
To pytanie wskazało mi właściwy kierunek, po prostu musiałem dodać wpis w moim pliku .git / config dla gałęzi, którą próbowałem wyciągnąć, a potem działało dobrze.
Pan Bungle,
Tak, ja też, a sposób na zrobienie tego jest taki, jak opisał to poniżej Mark Longair z git branch --set-upstream bucket-4 origin / bucket-4
Jonathon Horsman

Odpowiedzi:

191

Mówi bucket-4 pushes to bucket-4tylko dlatego, że domyślnym ustawieniem podczas wypychania gałęzi jest umieszczenie jej na pilocie o pasującej nazwie. (Należy pamiętać, że jest to nadal ustawienie domyślne, nawet jeśli lokalna gałąź śledzi gałąź zdalnego śledzenia, a gałąź zdalnego śledzenia odpowiada gałęzi o innej nazwie w zdalnym repozytorium).

Najprostszym sposobem skonfigurowania powiązania między twoim bucket-4a bucket-4in originjest upewnienie się, że następnym razem zrobisz:

git push -u origin bucket-4

Alternatywnie możesz:

git branch --set-upstream-to origin/bucket-4

Aby odpowiedzieć bezpośrednio na kilka pytań:

Jak to w ogóle jest uważane za „śledzone” bez tego?

W tym przypadku tak nie jest - nie śledzi gałęzi zdalnego śledzenia w żadnym sensie, jeśli nie ma jej branch.bucket-4.mergelub branch.bucket-4.remotew konfiguracji git. Dane wyjściowe z git remote show originpo prostu pokazują, gdzie gałąź zostanie domyślnie wypchnięta.

Czy jest jakaś konfiguracja, którą mogę dodać, aby wszystkie lokalne oddziały prawidłowo śledziły swoje piloty w przyszłości?

Myślę, że nie ma. Kiedy tworzyłeś bucket-4lokalnie, jak zakładam, gałąź zdalnego śledzenia nie istniała, więc nie można jej w tym momencie skonfigurować - byłoby to bardzo mylące zachowanie domyślne. Musisz tylko pamiętać, aby dodać -uswoją pierwszą git pushgałąź do jej repozytorium.

Mam nadzieję, że to trochę pomoże.

Mark Longair
źródło
7
git branch --set-upstreamzadziałało idealnie dla mnie przed wykonaniem pull
ohaal
git branch --set-upstream bucket-4 origin / bucket-4 pracował dla mnie :-)
Aliza
A co jeśli nie chcesz naciskać? Mam ten sam problem, ale nie chcę wypychać z repozytorium, na którym ten problem występuje. Właśnie zmieniłem zdalne źródła i chcę ściągnąć najnowszą HEAD dla gałęzi, która najwyraźniej nie jest już śledzona (mimo że była śledzona przed przełączeniem zdalnego źródła). W końcu usunąłem problematyczny klon i ponownie sklonowałem z nowego pochodzenia.
geoidesic
1
W rzeczywistości podczas próby pojawia git --set-upstream <branch> origin/<branch>się błąd, ponieważ flaga jest przestarzała. Zaleca się użycie git branch --track origin/<branch>lub --set-upstream-tozgodnie z drugą odpowiedzią. Myślę, że odpowiedź mogłaby zostać zaktualizowana, @MarkLongair?
AymDev
Dzięki za sugestię, @AymDev - dokonałem tej zmiany.
Mark Longair
6

git branch --set-upstream <branch> origin/<branch> został uznany za przestarzały co najmniej od 1.8.2.3 (moja wersja).

Użyj git branch --set-upstream-to=origin/<branch> <branch>zamiast tego.

d_roge
źródło
2
Czy chodziło Ci o to, aby był to komentarz do odpowiedzi Marka ? Ponadto w rzeczywistości był przestarzały w Git w wersji 1.8.0 .