Jak zmienić pilota, który śledzi oddział?

672

centralRepozytorium musiał być ustawiony na nowym serwerze, więc stworzyłem nowy pilot na moim lokalnym repo i popchnął do tego.

Ale teraz, kiedy to robię git pull, twierdzi, że jestem na bieżąco. To nie tak - mówi mi o starej gałęzi zdalnej, a nie nowej, o której wiem, że z pewnością ma nowe zobowiązania do pobrania.

Jak zmienić oddział lokalny, aby śledzić innego pilota?

Widzę to w pliku konfiguracyjnym git, ale nie chcę zepsuć rzeczy.

[branch "master"]
    remote = oldserver
    merge = refs/heads/master
joachim
źródło
1
Poprawiłem twój tytuł - tak naprawdę próbujesz zmienić śledzonego pilota, ale nadal śledzisz w nim tę samą nazwę oddziału.
Cascabel
5
Trudno uznać to za duplikat: Jak sprawić, by istniejąca gałąź Git śledziła gałąź zdalną? . To pytanie nie określa, że ​​gałąź już śledzi gałąź zdalną. Ten robi.
1
Wydaje mi się, że edytowanie pliku konfiguracyjnego jest najłatwiejszym i najbezpieczniejszym sposobem na zrobienie tego
Steven Lu

Odpowiedzi:

1079

Używając git v1.8.0 lub nowszego:

git branch branch_name --set-upstream-to your_new_remote/branch_name

Lub możesz użyć -uprzełącznika:

git branch branch_name -u your_new_remote/branch_name

Korzystając z git 1.7.7 lub wcześniejszej:

git branch --set-upstream branch_name your_new_remote/branch_name

urschrei
źródło
2
Właśnie tego szukałem - zmieniłem gałąź zdalnego śledzenia dla danej gałęzi. Dzięki!
joachim
7
Ach, mój zły. Nadal zrobiłbym to przez config, ponieważ możesz być pewien, że przypadkowo nie zmienisz nazwy oddziału, ale wszystko dobrze. +1.
Cascabel,
Z informacji o wersji 1.8.0 : „Kuszące było powiedzenie„ gałąź git - set-upstream origin / master ”, ale to mówi Gitowi, aby zaaranżował lokalną gałąź„ origin / master ”w celu zintegrowania 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 opcji „--set-upstream-to” (z krótkim i słodkim „-u”). ”
Jared Beck
Tak czyste; _; Mogę łatwo naprawić mały bałagan, który stworzyłem! Dziękuję =))
poseł Aditya
56
Jeśli gałąź zdalnego śledzenia jeszcze nie istnieje, ale istniejąca gałąź zdalnego śledzenia jest obecnie śledzona, nie można jej zmienić na nieistniejącą nową gałąź zdalnego śledzenia. Najpierw musisz wyłączyć bieżącą gałąź zdalnego śledzenia: git branch --unset-upstream- następnie działa ona tak, jak podano w tej odpowiedzi (lub w następnej git push -u / --set-upstream).
hakre
88

Dla mnie poprawka polegała na:

git remote set-url origin https://some_url/some_repo

Następnie:

git push
krytyk
źródło
3
W taki sposób Github mówi, aby to zrobić. help.github.com/articles/changing-a-remote-s-url
fsharp
18
To faktycznie zmienia miejsce, w którym znajduje się pilot, nie zmienia to, którego pilota śledzisz (technicznie) - nadal śledzisz „pochodzenie”, po prostu aktualizuje definicję pochodzenia. W niektórych przypadkach może to być zła rzecz. Załóżmy, że rozwidlasz jQuery i tworzysz nowego pilota. „origin” to twój widelec, „upstream” to jQuery. Załóżmy, że musisz tymczasowo śledzić oryginalne repo zamiast widelca. Jeśli set-urlgit push
używałeś
42

W przypadku aktualnego git (2.5.5) polecenie jest następujące:

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

Spowoduje to zaktualizowanie zdalnie śledzonego oddziału dla bieżącego oddziału lokalnego

Ko2r
źródło
3
Uderzenie git branch --set-upstream-to=origin/developpodniesiony błąd: error: the requested upstream branch 'origin/develop' does not exist. Wcześniej zmieniłem nazwę zdalnej gałęzi na delelop.
belgoros
1
@belgoros git fetch --allmoże?
Gabriel Devillers
25

Inną opcją, aby mieć dużą kontrolę nad tym, co się dzieje, jest ręczna edycja konfiguracji:

git config --edit

lub stenografia

git config -e

Następnie edytuj plik do woli, zapisz, a zmiany zostaną zastosowane.

wranvaud
źródło
1
To uratowało mi dzień. Dzięki!
Martyn Chamberlin,
Mój problem polegał na tym, że były dwa źródła. (pochodzenie i pochodzenie-algo). Ale lokalny mistrz śledził „origin-algo”. Ale chciałem, żeby śledziło „pochodzenie”. Jedynym sposobem, który mogłem to zmienić, było edytowanie konfiguracji git.
Aswin Prasad
19

Jeśli jesteś na tym punkcie zdrowo, edycja pliku konfiguracyjnego jest wystarczająco bezpieczna. Jeśli chcesz być trochę bardziej paranoikiem, możesz użyć polecenia porcelany, aby go zmodyfikować:

git config branch.master.remote newserver

Oczywiście, jeśli spojrzysz na konfigurację przed i po, zobaczysz, że zrobił dokładnie to, co zamierzałeś zrobić.

Ale w twoim indywidualnym przypadku chciałbym:

git remote rename origin old-origin
git remote rename new-origin origin

To znaczy, jeśli nowy serwer ma być kanonicznym pilotem, dlaczego nie nazwać go początkiem tak, jakbyś go sklonował?

Cascabel
źródło
3
Zrobiłem to przed zaszyfrowaniem tego problemu - git był sprytny i przeniósł zdalną nazwę do pliku konfiguracyjnego, więc w twoim przykładzie mój plik konfiguracyjny powiedział „stare pochodzenie”.
joachim
Osobiście uważam, że ten sposób ma więcej sensu koncepcyjnego niż sposób akceptowany, ale wydaje mi się, że są funkcjonalnie równoważne, prawda?
Evan Donovan,
1
@Jefromi: A remote renamenie zrobiłby tego, o co jest poproszony, ponieważ zmienia on nazwę pilota zarówno w [remote]configs, jak i [branch]configs. Dlatego w tym przypadku należy edytować plik konfiguracyjny i robić to, co mówisz (zmiana nazw pilotów) tylko w [remote]wierszach konfiguracji.
Sumeet Pareek
7
git fetch origin
git checkout --track -b local_branch_name origin/branch_name

lub

git fetch
git checkout -b local_branch_name origin/branch_name
uma
źródło
W moim przypadku potrzebowałem git fetch. Utworzyłem nowy oddział w bitbucket i chciałem się do niego przełączyć. git nie wie o zdalnych zmianach, więc musiałem to zrobić git fetchwcześniej git checkout feature/new-feature-branch. Mam nadzieję, że to pomaga komuś innemu.
TelamonAegisthus
6

To najłatwiejsze polecenie:

git push --set-upstream <new-origin> <branch-to-track>

Na przykład, biorąc pod uwagę, że polecenie git remote -vtworzy coś takiego:

origin  ssh://[email protected]/~myself/projectr.git (fetch)
origin  ssh://[email protected]/~myself/projectr.git (push)
team    ssh://[email protected]/vbs/projectr.git (fetch)
team    ssh://[email protected]/vbs/projectr.git (push)

Aby zamiast tego przejść do śledzenia zespołu:

git push --set-upstream team master
Andries
źródło
Gałąź do śledzenia jest opcjonalna, gdy nie ma nic dwuznacznego. Skorzystałem z twojej sugestii, kiedy odsuwałem się od Github;) Dziękuję.
gouessej
4

Możesz usunąć swój obecny oddział i wykonać:

git branch --track local_branch remote_branch

Lub zmień zmień serwer zdalny na bieżący w konfiguracji

RDL
źródło
nie działało dla mnie, tylko działające polecenie było z @uma: git checkout --track -b local_branch_name origin/branch_name
Saad Benbouzid
2

W oparciu o to, co rozumiem z najnowszej dokumentacji git , streszczenie jest następujące:

git branch -u upstream-branch local-branch
git branch --set-upstream-to=upstream-branch local-branch

To użycie wydaje się nieco inne niż odpowiedź urschrei, ponieważ w jego streszczeniu jest:

git branch local-branch -u upstream-branch 
git branch local-branch --set-upstream-to=upstream-branch 

Zgaduję, że ponownie zmienili dokumentację?

Arshan Khanifar
źródło
1

W najnowszej wersji git, takiej jak 2.7.4 ,

git checkout branch_name # nazwa oddziału, którą chcesz zmienić gałąź śledzenia

git branch --set-upstream-to=upstream/tracking_branch_name #upstream - nazwa zdalna

Mohideen bin Mohammed
źródło
1

Uważam, że post @critikaster jest pomocny, z wyjątkiem tego, że musiałem wykonać te polecenia za pomocą GIT 2.21:

$ git remote set-url origin https://some_url/some_repo
$ git push --set-upstream origin master
użytkownik8128167
źródło
0

najprostszym sposobem jest po prostu przejście do nowej gałęzi:

git push -u origin gałąź / nazwa

ArthNRick
źródło