Jak mogę łatwo przekazać lokalną gałąź Git do pilota o innej nazwie?

175

Zastanawiałem się, czy istnieje łatwy sposób na wypchnięcie i ściągnięcie lokalnej gałęzi ze zdalną gałęzią o innej nazwie bez konieczności podawania obu nazw.

Na przykład:

$ git clone myrepo.git
$ git checkout -b newb
$ ...
$ git commit -m "Some change"
$ git push origin newb:remote_branch_name

Teraz, jeśli ktoś zaktualizuje remote_branch_name, mogę:

$ git pull

I wszystko jest scalane / przewijane do przodu. Jeśli jednak wprowadzę zmiany w moim lokalnym „newb”, nie mogę:

$ git push

Zamiast tego muszę:

% git push origin newb:remote_branch_name

Wydaje się trochę głupie. Jeśli git-pullużywa git-config branch.newb.mergedo określenia, skąd należy pobrać, dlaczego nie można git-pushmieć podobnej opcji konfiguracji? Czy jest do tego fajny skrót, czy powinienem po prostu kontynuować długą drogę?

jmacdonagh
źródło

Odpowiedzi:

93

Pewnie. Po prostu ustaw push.defaultna, upstreamaby wypychać gałęzie do ich górnego strumienia (co jest tym samym, co pullbędzie pobierane z, zdefiniowane przez branch.newb.merge), zamiast wypychać gałęzie do tych, które pasują w nazwie (co jest ustawieniem domyślnym dla push.default, matching).

git config push.default upstream

Zauważ, że wcześniej było to wywoływane trackingnie upstreamwcześniej niż Git 1.7.4.2, więc jeśli używasz starszej wersji Git, użyj trackingzamiast tego. Ta push.defaultopcja została dodana w Git 1.6.4, więc jeśli używasz starszej wersji, w ogóle nie będziesz mieć tej opcji i będziesz musiał jawnie określić gałąź do wypchnięcia.

Brian Campbell
źródło
To było to! Dotyczy to wszystkich śledzących gałęzi, ale to jest w porządku. Dzięki!
jmacdonagh,
Chciałbym wiedzieć, czy istnieje skrót nazwy oddziału, który sprawdziłem. Mogę po prostu chcieć, git push buildserver .:test_thisgdzie .będzie nazwa lokalnego oddziału, której niekoniecznie znam. Mógłbym to sprawdzić, jasne, ale gdyby była do tego krótka ręka, taka jak kropka, byłoby fajnie.
Frederick Nord
2
@FrederickNord HEADto skrót, którego szukasz. HEADjest tym, co wskazuje na aktualnie pobraną gałąź lub bezpośrednio na konkretny commit, jeśli masz odłączoną głowę.
Brian Campbell
Dzięki! To naprawiło Updates were rejected because a pushed branch tip is behind its remotebłąd. Moje lokalne repozytorium było aktualne, ale nazwy były po prostu inne.
canhazbits
171

Po wykonaniu początkowego wypychania dodaj parametr -u :

git push -u origin my_branch:remote_branch

Kolejne pchnięcia pójdą tam, gdzie chcesz.

EDYTOWAĆ:

Zgodnie z komentarzem, to tylko ustawia pull.

git branch --set-upstream

powinien to zrobić.

Adam Dymitruk
źródło
7
-upo prostu ustawia upstream, który zgodnie z pytaniem jest już ustawiony. Musi ustawić push.defaultna upstrem, aby uzyskać pushzgodność z ustawieniem nadrzędnym, ponieważ domyślnie pulltak jest.
Brian Campbell,
2
Wydaje się, że to nie działa - przynajmniej nie na nigdy wersjach gita
Thomas Watson
git branch --set-upstream wymaga jedynie ustawienia pull setup "pushRemote".
wheredidthatnamecod
Myślę, że nie git branch --set-upstreamjest to konieczne. Uwaga: my git --versionto 2.17.1.
Gabriel Staples
15

Polecenie Adama jest teraz przestarzałe. Możesz użyć:

git branch --set-upstream-to origin/my_remote_branch my_local_branch

aby ustawić gałąź upstream of my_local_branchto origin/my_remote_branch.

Praca w
źródło
6
Czy możesz podać link do informacji, które udostępniasz na temat wycofywania -u? Dokumentacja najnowszej wersji dotyczącej wypychania na git-scm.com wydaje się sugerować, że jest aktualna. Z góry dziękuję - może być bardzo pomocne dla czytelników, jeśli będą chcieli uzyskać więcej informacji.
Kay V
Zgadzam się z @KayV, zwłaszcza że otrzymałem ten komunikat, gdy próbowałem utworzyć nowy oddział zdalny o nazwie innej niż mój oddział lokalny: `` Jeśli planujesz wypchnąć nowy oddział lokalny, który będzie śledził jego zdalny odpowiednik, możesz chcieć używać "git push -u" do ustawiania konfiguracji nadrzędnej podczas wypychania. '
FBB
0

Oto proces, który zadziałał dla mnie.

git clone original-repo-url
git remote rename origin upstream
git remote add origin new-repo-url

Teraz twoje nowe repozytorium będzie „początkowe”, a oryginalne repozytorium „nadrzędne”. Potwierdź to, uruchamiając git remote -v. (Nota boczna: Upstream jest używany do pobierania z oryginalnego repozytorium - aby zachować synchronizację lokalnej kopii z projektem, do którego chcesz wnieść swój wkład - a źródło jest używane do pobierania i wypychania, ponieważ możesz wnieść wkład do własnego repozytorium).

git push origin master

Teraz master twojego nowego zdalnego repozytorium (na Github) będzie zsynchronizowany z oryginalnym masterem, ale nie będzie miał żadnej z gałęzi funkcji.

git rebase upstream/branch-name
git push origin master

Rebase to inteligentne połączenie. Następnie naciśnij ponownie, aby przejść do mastera, a zobaczysz wybraną gałąź funkcji jako główną w nowym repozytorium.

Opcjonalny:

git remote rm upstream
git remote add upstream new-repo-url
urubuz
źródło
0

Od jakiegoś czasu napotykam ten sam problem. W końcu mam zestaw oświadczeń, więc nie muszę tego robić za git push origin local:remotekażdym razem. Śledziłem te:

git branch --set-upstream-to origin/remote_branch_name
git config push.default upstream
git push

Po ustawieniu upstream do zdalnej gałęzi o innej nazwie (pierwsza linia), a następnie ustawieniu tego upstream jako domyślnego (druga linia), trzecia linia będzie teraz przestrzegać tych reguł i będzie przekazywać do skonfigurowanego upstream.

messmania
źródło