Czy istniejąca gałąź Git będzie śledzić gałąź zdalną?

3534

Wiem, jak utworzyć nową gałąź, która śledzi gałęzie zdalne, ale jak sprawić, aby istniejąca gałąź śledziła gałąź zdalną?

Wiem, że mogę po prostu edytować .git/configplik, ale wydaje się, że powinien istnieć łatwiejszy sposób.

Pat Notz
źródło
26
Jak wspomniano poniżej, możesz skorzystać z istniejącego oddziału git push -u origin branch-name.
Zags
3
Jeśli oddział lokalny jest oddziałem bieżącym, a oddział lokalny nie śledzi już zdalnego, git pullczęsto dostarcza pomocnych komunikatów o odpowiednim poleceniu do ustawienia informacji o śledzeniu
billrichards
57
To denerwujące, gdy uczy się gita, aby wyświetlać link do dokumentacji gita. Ta dokumentacja wydaje się być napisana dla osób, które już wiedzą, co robią z git.
Felipe Alvarez
9
od Git 2.10 powinieneś najpierw przejść do zamierzonego oddziału lokalnego, a następnie zrobić togit branch --set-upstream-to origin/<branch>
Mahdi Javaheri,
2
--set-upstreampowoduje błąd: fatal: the '--set-upstream' option is no longer supported. Please use '--track' or '--set-upstream-to' instead.tak git branch --set-upstream-to origin/<branch name>działa bieżące polecenie.
Super Jade

Odpowiedzi:

4267

Biorąc pod uwagę oddział fooi pilota upstream:

Począwszy od Git 1.8.0:

git branch -u upstream/foo

Lub, jeśli oddział lokalny foonie jest bieżącym oddziałem:

git branch -u upstream/foo foo

Lub, jeśli chcesz wpisać dłuższe polecenia, są one równoważne dwóm powyższym:

git branch --set-upstream-to=upstream/foo

git branch --set-upstream-to=upstream/foo foo

Od wersji Git 1.7.0:

git branch --set-upstream foo upstream/foo

Uwagi:

  • Wszystkie powyższe polecenia powodują, że oddział lokalny foośledzi oddział foozdalny ze zdalnego upstream.
  • Stara składnia (1.7.x) jest przestarzała na rzecz nowej składni (1.8+). Nowa składnia ma być bardziej intuicyjna i łatwiejsza do zapamiętania.
  • Zdefiniowanie odgałęzienia nie powiedzie się, jeśli zostanie uruchomione na nowo utworzonych pilotach, które nie zostały jeszcze pobrane. W takim przypadku biegnij git fetch upstreamwcześniej.

Zobacz także: Dlaczego muszę cały czas robić `--set-upstream`?

Dan Molding
źródło
124
Czy „upstream” to nazwa pilota? tzn. co większość domyślnie nazywa „początkiem”?
Andrew Vit
172
@Andrew: Tak. git branch --set-upstream master origin/masterbyłoby równoważne z tym, co jest automatycznie wykonywane, gdy początkowo klonujesz repozytorium.
Dan Molding
62
W powiązanej notatce dodanie tego do gitconfig jest niesamowite: „[push] default = tracking” sprawi, że
pushy
61
Otrzymuję komunikat „krytyczny: niepoprawna nazwa obiektu:„ origin / master ”.”
joachim
84
git push -u origin foo via
Cotton
235

Możesz wykonać następujące czynności (zakładając, że jesteś wyewidencjonowany w systemie głównym i chcesz przekazać go do zdalnego oddziału głównego):

Ustaw „zdalny”, jeśli jeszcze go nie masz

git remote add origin ssh://...

Teraz skonfiguruj master, aby wiedział, aby śledzić:

git config branch.master.remote origin
git config branch.master.merge refs/heads/master

I naciśnij:

git push origin master
Paul Hedderly
źródło
czy naprawdę potrzebny jest pilot i gałąź w wypychaniu? Chodzi mi o to, że potrzebujesz go tylko wtedy, gdy wypisana gałąź nie jest tą, którą chcesz pchać, prawda?
Doppelganger
5
Tak - ale z pamięci może być konieczne wyraźne określenie pierwszego wypychania. Oczywiście można go łatwo przetestować ... :)
Paul Hedderly
+1 To jest odpowiedź dla użytkowników systemu Windows, którzy utknęli w „podglądzie” msysgit wcześniejszym niż 1.8. Dziękuję za to.
Jan
3
To jedyna odpowiedź, która zadziałała dla mnie. Kiedy próbowałem zaakceptowanej odpowiedzi, aby ustawić upstream pilota do istniejącego oddziału, mam: error: the requested upstream branch 'upstream/master' does not exist.
Steve K
4
@ SteveK to najprawdopodobniej dlatego, że twoja nazwa użytkownika jest wywoływana, origina nie upstream.
umläute
160

Robię to jako efekt uboczny pchania z -uopcją jak w

$ git push -u origin branch-name

Odpowiednia długa opcja to --set-upstream.

git-branchPolecenie rozumie także --set-upstream, ale jego stosowanie może być mylące. Wersja 1.8.0 modyfikuje interfejs.

git branch --set-upstreamjest przestarzałe i może zostać usunięte w stosunkowo odległej przyszłości. git branch [-u|--set-upstream-to]został wprowadzony z rozsądniejszą kolejnością argumentów.

Kuszące było powiedzenie git branch --set-upstream origin/master, ale to mówi Gitowi, aby lokalna gałąź „origin / master” zintegrowała się z aktualnie sprawdzoną gałęzią, co jest bardzo mało prawdopodobne, co miał na myśli użytkownik. Opcja jest przestarzała; zamiast tego użyj nowej --set-upstream-to(z krótką i słodką -u) opcji.

Załóżmy, że masz foooddział lokalny i chcesz, aby oddział traktował tę samą nazwę, co jego gałąź nadrzędna. Niech to się stanie

$ git branch foo
$ git branch --set-upstream-to=origin/foo

Lub tylko

$ git branch --set-upstream-to=origin/foo foo
Greg Bacon
źródło
1
To jest znacznie lepsze rozwiązanie imo
Nils_e
--set-upstream-to=...właśnie tego szukałem.
Richard
54

git_remote_branchNarzędzie może być przydatne. Oferuje proste polecenia do tworzenia, publikowania, usuwania, śledzenia i zmiany nazw zdalnych oddziałów. Jedną fajną cechą jest to, że możesz poprosić grbpolecenie o wyjaśnienie, jakie polecenia git wykona.

grb explain create my_branch github
# git_remote_branch version 0.3.0

# List of operations to do to create a new remote branch and track it locally:
git push github master:refs/heads/my_branch
git fetch github
git branch --track my_branch github/my_branch
git checkout my_branch
James Mead
źródło
3
grb to rubinowy klejnot, do którego można uzyskać dostęp, jak wyjaśniono na ich
githubie
6
OP zadaje pytanie na temat samego Gita. Więc nie wprowadzaj nowego narzędzia, które prawdopodobnie byłoby lepsze.
zeekvfu
grb to alias dla git-rebase w mojej instalacji macOS. Nie zrobiłem tego :)
Ben Sinclair,
53

Właściwie dla zaakceptowanej odpowiedzi zadziałało:

git remote add upstream <remote-url>
git fetch upstream
git branch -f --track qa upstream/qa
# OR:
git branch --set-upstream qa upstream/qa
Jeż
źródło
Lokalny oddział już śledził gałąź, więc możemy założyć, że zdalne repo zostało już dodane.
Doppelganger
Dopplerganger: patrz komentarz joachima do zaakceptowanej odpowiedzi. W każdym razie założenia łatwo się różnią - to czyni rzeczy tak interesującymi;)
Hedgehog
44

Wierzę, że już w Git 1.5.x można uczynić lokalną gałąź śledzącą gałąź $BRANCHzdalną origin/$BRANCH, taką jak ta.

Biorąc to pod uwagę $BRANCHi origin/$BRANCHistnieje, a obecnie nie wymeldowałeś się $BRANCH(jeśli tak, to zrezygnuj):

git branch -f --track $BRANCH origin/$BRANCH

To odtwarza się $BRANCHjako gałąź śledzenia. W -fWymusza utworzenie mimo $BRANCHjuż istniejących. --trackjest opcjonalny, jeśli obowiązują standardowe wartości domyślne (tzn. parametr git-config branch.autosetupmergema wartość true).

Uwaga: jeśli origin/$BRANCHjeszcze nie istnieje, możesz go utworzyć, wypychając lokalny $BRANCHserwer do zdalnego repozytorium za pomocą:

git push origin $BRANCH

Następuje poprzednie polecenie, aby wypromować oddział lokalny w oddział śledzenia.

Wu-Lee
źródło
1
git push origin $BRANCHtego szukałem.
Użytkownik
Po wypróbowaniu różnego rodzaju rozwiązań, w tym skonfigurowaniu upstream zgodnie z powyższym opisem, nic nie działało. Wszystko, co chciałem zrobić, to pobrać 1 nowy zatwierdzenie do mojego lokalnego oddziału ze zdalnego i początkowo nie konfigurowałem śledzenia. Polecenie git branch -f --track $BRANCH origin/$BRANCHzałatwia sprawę.
DemitryT
38

1- zaktualizuj lokalne metadane, używając: git fetch --all

wprowadź opis zdjęcia tutaj

2- pokaż swoje zdalne i lokalne oddziały za pomocą: git branch -a , zobacz następujący zrzut ekranu

wprowadź opis zdjęcia tutaj

3 - przejdź do gałęzi docelowej, którą chcesz połączyć ze zdalnym: za pomocą

git checkout branchName

przykład:

wprowadź opis zdjęcia tutaj

4- Połącz swój oddział lokalny ze zdalnym oddziałem, używając:

gałąź git --set-upstream-to nameOfRemoteBranch

NB: nameOfRemoteBranch : aby skopiować dane wyjściowe z kroku 2 „git branch -r”

Przykład zastosowania:

wprowadź opis zdjęcia tutaj

Monsif EL AISSOUSSI
źródło
1
Przeważnie łatwa i prosta odpowiedź.
vibs2006
25

Upewnij się, że biegniesz:

git config push.default tracking

aby móc bezproblemowo przepychać

romanlv
źródło
1
To może być wygodne. Możemy jednak zauważyć, że według git-config(1)strony podręcznika trackingjest to przestarzały synonim upstream.
FooF,
23

Edycja .git/configjest prawdopodobnie najłatwiejszym i najszybszym sposobem. W każdym razie tak robią polecenia Git do obsługi zdalnych gałęzi.

Jeśli nie chcesz ręcznie wycierać pliku (i nie jest to trudne), zawsze możesz git configto zrobić ... ale znowu, i tak będzie to po prostu edycja .git/configpliku.

Istnieją oczywiście sposoby automatycznego śledzenia zdalnej gałęzi podczas używania git checkout( --trackna przykład poprzez przekazanie flagi), ale te polecenia działają z nowymi gałęziami, nieistniejącymi.

mipadi
źródło
18

W skrócie

git branch --set-upstream yourLocalBranchName origin/develop

To sprawi, że twoja yourLocalBranchNameścieżka będzie nazywała się zdalną gałąź develop.

MadNik
źródło
1
@Quincy Sprawdź odpowiedź grega - zamiast tego użyj git push -u origin branch(lub --set-upstream-to)
Tobias Kienzler
@MadNik, jaka jest różnica między --set-upstreami --track? Nie do końca rozumiem, dlaczego powinienem używać jednego nad drugim.
Acumenus
15

W wersji 1.6.x można to zrobić za pomocą narzędzia git_remote_branch :

grb track foo upstream

To spowoduje, że Git zacznie foośledzić upstream/foo.

wik
źródło
12

Używam następującego polecenia (załóżmy, że twoja nazwa oddziału lokalnego to „nazwa oddziału lokalnego”, a nazwa oddziału zdalnego to „nazwa oddziału zdalnego”):

$ git branch --set-upstream-to=origin/branch-name-remote branch-name-local

Jeśli zarówno oddziały lokalne, jak i zdalne mają tę samą nazwę, wykonaj następujące czynności:

$ git branch --set-upstream-to=origin/branch-name branch-name
yrazlik
źródło
Odwrócono „nazwa-gałęzi” i „nazwa-początku / gałęzi” w wierszu poleceń. Upstream jest przed lokalnym.
maharvey67,
@ maharvey67 masz rację, dzięki. Edytowałem odpowiedź.
yrazlik,
To było złote, dziękuję, również dlatego, że żadna z opcji w zaakceptowanej odpowiedzi nie jest odpowiednia, jeśli masz ukośniki w nazwie oddziału
JBoy
8

Tutaj, używając githubi git version 2.1.4po prostu wykonaj:

$ git clone [email protected]:user/repo.git

I piloty pochodzą od itelsef, nawet jeśli nie są powiązane lokalnie:

$ git remote show origin

* remote origin
  Fetch URL: [email protected]:user/repo.git
  Push  URL: [email protected]:user/repo.git
  HEAD branch: master
  Remote branches:
    develop tracked         <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
    master  tracked
  Local branch configured for 'git pull':
    master merges with remote master
  Local ref configured for 'git push':
    master pushes to master (up to date)

Ale oczywiście nadal nie ma lokalnego oddziału:

$ git branch
* master                  <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

Widzieć? Teraz, jeśli tylko wyewidencjonujesz develp, zrobi magię automatycznie:

$ git checkout develop
Branch develop set up to track remote branch develop from origin.
Switched to a new branch 'develop'

Tak łatwo!


Podsumowanie. Wystarczy uruchomić 2 polecenia:

$ git clone [email protected]:user/repo.git
$ git checkout develop
Dr Beco
źródło
1
Doskonały przykład mojego identycznego przypadku użycia. Pomimo braku śladu lokalnej gałęzi „rozwijającej się”, kiedy sprawdziłem gałąź „rozwijającą się”, gałąź ta pojawia się i jest magicznie skonfigurowana do śledzenia odległej gałęzi „rozwijającej się” od początku. Doceniam przykład i wyjaśnienie krok po kroku!
ElliotPsyIT
8

Użyj opcji „--track”

  • Po git pull:

    git checkout --track <remote-branch-name>

  • Lub:

    git fetch && git checkout <branch-name>

Loukan ElKadi
źródło
7

Do utworzenia nowego oddziału możemy użyć następującego polecenia

 git checkout --track -b example origin / example 
Aby już utworzony oddział utworzyć łącze między zdalnym a tym z tego oddziału, użyj poniższego polecenia

 git branch -u origin / remote-branch-name

Jithu Reddy
źródło
5

To nie jest bezpośrednia odpowiedź na to pytanie, ale chciałem zostawić tutaj notatkę dla każdego, kto może mieć taki sam problem jak ja, próbując skonfigurować odgałęzienie.

Uważaj na push.default .

W starszych wersjach git domyślnie pasowało , co spowodowałoby bardzo niepożądane zachowanie, jeśli masz na przykład:

Śledzenie „głównego” oddziału lokalnego do źródła / wzorca

Zdalne śledzenie gałęzi „upstream” do upstream / master

Jeśli spróbujesz „git push” w gałęzi „upstream”, z dopasowaniem push.default git automatycznie spróbuje połączyć lokalną gałąź „master” w „upstream / master”, powodując cały chaos.

To daje bardziej rozsądne zachowanie:

git config --global push.default w górę

Tom Mettam
źródło
Nie pozostawiłeś tego na próżno. Dzięki.
stefgosselin
4

W nieco pokrewny sposób próbowałem dodać gałąź do zdalnego śledzenia do istniejącej gałęzi, ale nie miałem dostępu do tego zdalnego repozytorium w systemie, w którym chciałem dodać tę gałąź do zdalnego śledzenia (ponieważ często eksportuję kopię tego repo przez sneakernet do innego systemu, który ma dostęp do wypychania tego zdalnego). Odkryłem, że nie było sposobu, aby wymusić dodanie zdalnej gałęzi do lokalnego, który nie został jeszcze pobrany (więc lokalny nie wiedział, że gałąź istnieje na zdalnym, i otrzymam błąd:) the requested upstream branch 'origin/remotebranchname' does not exist.

W końcu udało mi się dodać nową, nieznaną wcześniej gałąź zdalną (bez pobierania), dodając nowy plik head na, .git/refs/remotes/origin/remotebranchnamea następnie kopiując ref (gałka oczna była najszybsza, lamała ;-) z systemu z dostępem do źródła repozytorium na stacji roboczej (z repozytorium lokalnym, na którym dodawałem gałąź zdalną).

Gdy to zrobiono, mogłem użyć git branch --set-upstream-to=origin/remotebranchname

Ville
źródło
3

lub po prostu przez:

przejdź do oddziału, jeśli jeszcze go nie masz:

[za]$ git checkout branch_name

biegać

[za]$ git branch --set-upstream origin branch_name
Branch origin set up to track local branch brnach_name by rebasing.

i jesteś gotowy do:

 [za]$ git push origin branch_name

Możesz zawsze spojrzeć na plik konfiguracyjny, aby zobaczyć, co śledzi, uruchamiając:

 [za]$ git config -e

Miło też to wiedzieć, pokazuje, które gałęzie są śledzone, a które nie. :

  [za]$ git remote show origin 
Zee
źródło
0

Dla każdego, kto podobnie jak ja chce zsynchronizować nazwę oddziału lokalnego ze zdalną nazwą oddziału, oto przydatne polecenie:

git branch -u origin/$(git rev-parse --abbrev-ref HEAD)
Constantinos
źródło
0

Aby uniknąć zapamiętywania, co musisz zrobić za każdym razem, gdy otrzymasz wiadomość:

Podaj gałąź, z którą chcesz się połączyć. Zobacz szczegóły w git-pull (1)
.
.....

Możesz użyć następującego skryptu, który ustawia początek jako nadrzędny dla bieżącej gałęzi, w której się znajdujesz.

W moim przypadku prawie nigdy nie ustawiłem czegoś innego niż pochodzenie jako domyślny upstream . Również prawie zawsze zachowuję tę samą nazwę oddziału dla oddziału lokalnego i zdalnego. Tak więc pasują do mnie:

#!/bin/bash
# scriptname: git-branch-set-originupstream
current_branch="$(git branch | grep -oP '(?<=^\* )(.*)$')"
upstream="origin/$current_branch"
git branch -u "$upstream"
Marinos An
źródło
-1

To też by działało

git branch --set-upstream-to=/< remote>/< branch> < localbranch>
Abhi
źródło