Jak utworzyć zdalny oddział Git?

3128

Utworzyłem lokalny oddział, który chcę „przepchnąć” w górę. Podobne pytanie dotyczy przepełnienia stosu, jak śledzić nowo utworzoną gałąź zdalną.

Jednak mój przepływ pracy jest nieco inny. Najpierw chcę utworzyć lokalny oddział i zepchnę go wcześniej, gdy będę zadowolony i chcę udostępnić mój oddział.

  • Jak mam to zrobić? (moje wyszukiwania w Google nic nie wymyśliły).
  • Jak mam powiedzieć moim kolegom, aby wyciągnęli go z repozytorium nadrzędnego?

AKTUALIZACJA W Git 2.0 istnieje prostsza odpowiedź, którą napisałem poniżej: https://stackoverflow.com/a/27185855/109305

Jesper Rønn-Jensen
źródło
14
czy ktoś kiedykolwiek odpowiedział na twoje drugie pytanie? >> I jak mam powiedzieć moim kolegom, aby wyciągnęli go z repozytorium nadrzędnego?
milkplus
1
@milkplus get fetch --allpobiera nowe gałęzie po stronie zdalnej (ale tylko get fetch --prunelokalnie usuwa odniesienia do usuniętych gałęzi zdalnych). Myślę, że albo to powinno być ustawione przez nich automatycznie, albo musisz z nimi porozmawiać ustnie.
peterh - Przywróć Monikę

Odpowiedzi:

3732

Najpierw tworzysz swój oddział lokalnie:

git checkout -b <branch-name> # Create a new branch and check it out

Oddział zdalny jest tworzony automatycznie po przekazaniu go do zdalnego serwera. Więc kiedy czujesz się na to gotowy, możesz po prostu:

git push <remote-name> <branch-name> 

Gdzie <remote-name>zwykle jest originnazwa, którą git nadaje pilotowi, z którego sklonowałeś. Twoi koledzy po prostu ściągną tę gałąź i zostanie ona automatycznie utworzona lokalnie.

Należy jednak pamiętać, że formalnie format jest następujący:

git push <remote-name> <local-branch-name>:<remote-branch-name>

Ale jeśli pominiesz jeden, zakłada się, że obie nazwy gałęzi są takie same. Powiedziawszy to, jako ostrzeżenie , nie popełniaj krytycznego błędu, określając tylko :<remote-branch-name>(z dwukropkiem), w przeciwnym razie gałąź zdalna zostanie usunięta!

Aby kolejny git pullwiedział, co robić, możesz zamiast tego użyć:

git push --set-upstream <remote-name> <local-branch-name> 

Jak opisano poniżej, --set-upstreamopcja ustanawia odgałęzienie:

Do każdej gałęzi, która jest aktualna lub została pomyślnie wysłana, dodaj referencję upstream (śledzenia), używaną przez bez argumentów git-pull (1) i inne polecenia.

Ikke
źródło
85
Zauważ, że domyślnym zachowaniem git jest wypychanie pasujących odnośników, więc git push <remote>nie wypychałoby gałęzi, jeśli nie jest obecne <remote>.
Jakub Narębski
222
Możesz użyć git push -u <remote-name> <branch-name>zamiast tego, aby kolejny git pullwiedział, co robić.
Bart Schuller,
87
Zamiast jawnego podawania nazwy serwera, możesz po prostu użyć origin, co oznacza „serwer, z którego mam resztę repozytorium”: w ten sposób git push origin <branch-name>.
lambshaanxy
68
Jeśli zapomnisz użyć tej -uopcji, możesz po prostu wpisać git push -upóźniej w oddziale, a następnie git pullzadziała.
Jan
89
Wszystko git push -u origin <local-branch-name>to działało dla mnie.
Samo
880

Najpierw musisz utworzyć swój oddział lokalnie

git checkout -b your_branch

Następnie możesz pracować lokalnie w swoim oddziale, gdy będziesz gotowy, aby udostępnić gałąź, popchnij ją. Następne polecenie wypycha gałąź do źródła zdalnego repozytorium i śledzi ją

git push -u origin your_branch

Członkowie drużyny mogą dotrzeć do twojego oddziału, wykonując:

git fetch
git checkout origin/your_branch

Możesz kontynuować pracę w gałęzi i pchanie, kiedy chcesz, bez przekazywania argumentów do git push (bez argumentów git push popchnie master do zdalnego master, twoja gałąź lokalna do zdalnej twojej gałęzi itp.)

git push

Koledzy z drużyny mogą naciskać na twój oddział, wykonując zatwierdzenia, a następnie pchać jawnie

... work ...
git commit
... work ...
git commit
git push origin HEAD:refs/heads/your_branch

Lub śledzenie gałęzi, aby uniknąć argumentów git push

git checkout --track -b your_branch origin/your_branch
... work ...
git commit
... work ...
git commit
git push
dseminara
źródło
Czy istnieje sposób utworzenia zdalnego oddziału bez tworzenia lokalnego oddziału o tej samej nazwie?
Ariel Gabizon
330

Proste rozwiązanie Git 2.0+:

Od wersji Git 2.0 zachowanie stało się prostsze :

Możesz skonfigurować git za pomocą, push.default = currentaby ułatwić życie:

Dodałem to, więc teraz mogę po prostu przesunąć nową gałąź w górę

$ git push -u

-ubędzie śledzić zdalną gałąź o tej samej nazwie. Teraz w tej konfiguracji automatycznie zgadniesz zdalne odniesienie do git push. Z dokumentacji git.config :

push.default

Określa akcję, którą powinien podjąć git push, jeśli nie podano jawnie refspec.

push.default = current- naciśnij bieżącą gałąź, aby zaktualizować gałąź o tej samej nazwie na końcu odbierającym. Działa zarówno w centralnym, jak i niecentralnym przepływie pracy.

Dla mnie jest to dobre uproszczenie mojego codziennego przepływu pracy w Git. Ustawienie konfiguracji zajmuje się „zwykłym” przypadkiem użycia, w którym dodajesz oddział lokalnie i chcesz go utworzyć zdalnie. Mogę również równie łatwo tworzyć lokalne oddziały z pilotów, po prostu robiąc git co remote_branch_name(w przeciwieństwie do używania --set-upstream-toflagi).

Wiem, że to pytanie, a akceptowane odpowiedzi są dość stare, ale zachowanie się zmieniło, dzięki czemu istnieją teraz opcje konfiguracji upraszczające przepływ pracy.

Aby dodać do globalnej konfiguracji Git, uruchom to w wierszu poleceń:

$ git config --global push.default current
Jesper Rønn-Jensen
źródło
5
Uważam, że git push -u origin HEADodpowiedź tutaj jest nieco bardziej szczegółowa (piszesz, co robisz), nie będąc zbyt wielkim, by pisać. Ponadto, git push -ubez dodatkowych argumentów nie działałoby dla mnie, jeśli gałąź została utworzona za pomocą-t
Qw3ry
git config --global push.default upstream && git checkout -b foo && <change a file> && git push -unie działa (od git 2.19.1); Push wymaga argumentów zdalnego i rozgałęzienia.
knite
Czy mógłbyś rozwinąć to, co masz na myśli git co remote_branch_name?
flannelbeard
84

Jak stwierdzono w poprzednich odpowiedziach,

git push <remote-name> <local-branch-name>:<remote-branch-name>

wystarczy do wypchnięcia lokalnego oddziału.

Twoi koledzy mogą pobrać wszystkie zdalne gałęzie (w tym nowe) za pomocą tego polecenia:

git remote update

Następnie, aby wprowadzić zmiany w gałęzi, zwykły przepływ:

git checkout -b <local-branch-name> <remote-name>/<remote-branch-name>
Lucian
źródło
Podoba mi się, ponieważ pozwala na to, by nazwa zdalna była inna niż nazwa lokalna
Ariel Gabizon
66

Utwórz nowy oddział lokalnie w oparciu o bieżący oddział:

git checkout -b newbranch

Zatwierdź wszelkie zmiany w normalny sposób. Następnie pchnij go w górę:

git push -u origin HEAD

Jest to skrót do wypchnięcia bieżącej gałęzi do gałęzi o tej samej nazwie origini śledzenia, abyś nie musiał określać origin HEADw przyszłości.

Zenexer
źródło
4
Pomogło to w moim przypadku: git push -u origin HEAD. Myślę, że to najbardziej klarowny sposób.
Scadge
2
Tak, nigdy nie pamiętasz dokładnie tego, co ostatnio wpisałeś jako gałąź, więc jest to właściwy sposób.
marksyzm
4
@marksyzm Jeśli nie pamiętasz, na której gałęzi się znajdujesz lub jak ją nazwałeś, prawdopodobnie nie powinieneś naciskać! Przynajmniej nie bez git statuspierwszego uruchomienia .
Zenexer,
1
Tak, muszę się upewnić, że świat nie eksploduje podczas tego pchnięcia; Zgadzam się.
marksyzm
1
Jest to najbardziej efektywny sposób na jednoczesne utworzenie gałęzi śledzenia oraz gałęzi zdalnej. Chciałbym również dodać git remote show originjako trzeci krok, aby zobrazować nową relację śledzenia / śledzenia.
hb5fa
54

Jeśli chcesz utworzyć gałąź z bieżącej gałęzi

git checkout -b {your_local_branch_name} 

chcesz oddziału ze zdalnego oddziału, możesz spróbować

git checkout -b {your_local_branch_name} origin/<remote_branch_name>

Jeśli skończysz ze zmianami, możesz dodać plik.

git add -A or git add <each_file_names>

Następnie wykonaj zatwierdzenie lokalnie

git commit -m 'your commit message'

Gdy chcesz przełączyć się na zdalne repozytorium

git push -u origin <your_local_branch_name>

Wszystko razem będzie

git checkout -b bug_fixes 

lub Jeśli chcesz utworzyć oddział ze zdalnego oddziału, powiedz programowanie

git checkout -b poprawki_błędów pochodzenie / rozwój

Możesz przekazać do oddziału w celu zdalnego repo przez

git push -u origin bug_fixes

Za każdym razem, gdy chcesz zaktualizować swój oddział z dowolnego innego oddziału, powiedz master .

git pull origin master.

sreekumar
źródło
46

Jeśli chcesz po prostu utworzyć oddział zdalny bez lokalnego, możesz to zrobić w następujący sposób:

git push origin HEAD:refs/heads/foo

Pcha cokolwiek, co jest w twojej głowie, aby rozgałęzić foo, które nie istniały na pilocie.

Tassadar
źródło
Wykonanie tego całkowicie pomieszało moje Visual Studio do tego stopnia, że ​​nie uruchomiłoby się poprawnie. Team Explorer w ogóle się nie ładował, ale wszystko inne poszło też w błąd, rzucając błędy. Po prostu dla ciebie.
Josh
Wygląda na to, że powinno działać, ale kiedy go wypróbowałem, nasz serwer gitlab nie rozpoznał wyniku jako gałęzi.
JosephH
Jakiej gałęzi jest odgałęzienie na pilocie? Co jeśli chciałbym foo oddzielić od foo2? Czy to jest możliwe? Dziękuję Ci.
user674669,
Działa również na serwerze gerrit, tworząc nowy oddział na pilocie, który nie istniał przed tym poleceniem.
MichaelZ
33

Najłatwiejsze rozwiązanie ... Drumm Roll ... git wersja 2.10.1 (Apple Git-78)

1) git checkout -b localBranchNameThatDoesNotExistInRemote

2) Do your changes, and do a git commit 

3) git push origin localBranchNameThatDoesNotExistInRemote --force

Uwaga - Oddział, który właśnie utworzyłeś w środowisku lokalnym, oraz nieistniejący zdalny oddział, w którym próbujesz pchać, musi mieć tę samą nazwę .

sapy
źródło
3
Dzięki za Twoją sugestię. Nawet jeśli nazywasz to łatwym rozwiązaniem, nadal uważam, że git push -ujest o wiele łatwiejsze. Wymaga posiadania jednej globalnej linii konfiguracji, patrz stackoverflow.com/a/27185855/109305 . Używam git push -ustale, to pokrywa 99% moich przypadków użycia podczas pracy.
Jesper Rønn-Jensen
29

[Szybka odpowiedź]

Możesz to zrobić w 2 krokach:

1. Użyj checkoutdo utworzenia lokalnego oddziału:

git checkout -b yourBranchName

2. Użyj pushpolecenia, aby automatycznie utworzyć gałąź i wysłać kod do zdalnego repozytorium:

git push -u origin yourBanchName

Są różne sposoby na zrobienie tego, ale myślę, że ten sposób jest naprawdę prosty.

Javier C.
źródło
1
Szybko i do rzeczy!
Dev
26

Najpierw utwórz oddział lokalnie:

git checkout -b your_branch

A następnie zdalnie utworzyć oddział:

git push --set-upstream origin your_branch

Uwaga: Działa to w najnowszych wersjach git:

$ git --version
git version 2.3.0

Twoje zdrowie!

ipegasus
źródło
Jest to tylko tekst pomocy generowany przez polecenie, git pushgdy lokalny oddział nie jest śledzony zdalnie.
nurettin
18

Utwórz gałąź na komputerze lokalnym i przełącz się w tej gałęzi:

$ git checkout -b [name_of_your_new_branch]

Wciśnij gałąź na github:

$ git push origin [name_of_your_new_branch]

Jeśli chcesz coś zatwierdzić w swoim oddziale, pamiętaj, aby być w swoim oddziale.

Możesz zobaczyć wszystkie oddziały utworzone za pomocą:

$ git branch

Który pokaże:

* approval_messages
  master
  master_clean

Dodaj nowego pilota do swojego oddziału:

$ git remote add [name_of_your_remote] 

Przekaż zmiany ze swojego zatwierdzenia do swojego oddziału:

$ git push origin [name_of_your_remote]

Zaktualizuj swój oddział, gdy oryginalny oddział z oficjalnego repozytorium zostanie zaktualizowany:

$ git fetch [name_of_your_remote]

Następnie musisz złożyć wniosek o scalenie zmian, jeśli twoja gałąź wywodzi się z rozwoju, musisz:

$ git merge [name_of_your_remote]/develop

Usuń gałąź w lokalnym systemie plików:

$ git branch -d [name_of_your_new_branch]

Aby wymusić usunięcie lokalnego oddziału w systemie plików:

$ git branch -D [name_of_your_new_branch]

Usuń gałąź z github:

$ git push origin :[name_of_your_new_branch]

Tutaj wszystkie informacje

Inne istniejące projekty

Numan Turkeri
źródło
14

Tworzenie gałęzi lokalnej z istniejącej gałęzi (może być master / develop / any-other-branch).

git checkout -b nazwa_oddziału

Wciśnij to do pilota

git push -u nazwa_graniczna_lokalna nazwa_gałęziowa_zdalna: nazwa_gałęziowa zdalna

Tutaj,

  1. -u: ustawia gałąź nadrzędną
  2. nazwa_zdalna: git ustawia domyślnie nazwę na „pochodzenie” podczas tworzenia repozytorium. Można to jednak zmienić na inną dowolną nazwę.
  3. local_branch_name: to nazwa oddziału lokalnego, który ma zostać przekazany.
  4. remote_branch_name: to nazwa zdalnego oddziału, który chcemy utworzyć na zdalnym.

Jeśli usuniemy lokalne i zdalne nazwy oddziałów, będą miały format

git push -u nazwa_zdalna nazwa_oddziału

Spowoduje to wypchnięcie oddziału lokalnego do zdalnego i o tej samej nazwie, co oddział lokalny nazwa_oddziału. Oddział lokalny będzie również śledził oddział zdalny.

iosCurator
źródło
10

Wiem, że dobrze odpowiedzieliśmy na to pytanie, ale chciałem tylko wymienić kroki, które podejmuję, aby utworzyć nową gałąź „myNewBranch” i wcisnąć zdalnie (w moim przypadku „origin”) i skonfigurować śledzenie. Rozważ to w wersji „TL; DR” :)

# create new branch and checkout that branch
git checkout -b myNewBranch
# now push branch to remote 
git push origin myNewBranch
# set up the new branch to track remote branch from origin
git branch --set-upstream-to=origin/myNewBranch myNewBranch
sufinawaz
źródło
8

Teraz w git możesz po prostu pisać, gdy jesteś we właściwej gałęzi

git push --set-upstream origin <remote-branch-name>

i git stworzy dla ciebie gałąź pochodzenia.

Maurizio Brioschi
źródło
1
-u jest skrótem od --set-upstream .., więc komenda może być git push -u origin <nazwa-zdalnej-gałęzi>
Uncaught Exception
fatal: „origin” nie wydaje się być repozytorium git
Dmitry Grinko
być może musisz ustawić pochodzenie swojego repozytorium git
Maurizio Brioschi,
8

Chciałem tylko dodać, że:

git checkout -b {branchName}

Tworzy nowy oddział, sprawdza również ten oddział / czyni go Twoim bieżącym oddziałem. Jeśli z jakiegoś powodu wszystko, co chcesz zrobić, to oderwać gałąź, ale nie ustawić jej jako bieżącej gałęzi, możesz użyć następującego polecenia:

git branch {branchName}

W pierwszym poleceniu „checkout” czyni z tej gałęzi bieżącą gałąź, a „-b” oznacza: ta gałąź jeszcze nie istnieje, więc zrób to dla mnie.

Brian Sachetta
źródło
6

Jak to zrobić poprzez Drzewo Źródłowe

 1: Open SourceTree, click on Repository -> Checkout
 2 :Click on Create New Branch
 3: Select branch where from you want to get code for new branch 
 4: Give your branch name
 5: Push the branch  (by click on Push button)
Monis Majeed
źródło
5

git push -u <remote-name> <branch-name>nie działa, jeśli nowo utworzona gałąź nie jest spawnowana z tego samego repozytorium, tj. jeśli nie utworzyłeś nowej gałęzi przy użyciu git checkout -b new_branch, to nie zadziała.

Na przykład sklonowałem lokalnie dwa różne repozytoria i musiałem skopiować repo2 / branch1 do repo1 /, a następnie też je wypchnąć.

Ten link pomógł mi przesłać mój oddział lokalny (sklonowany z innego repozytorium) do mojego zdalnego repozytorium:

złamana stopa
źródło
3

Oto jak to zrobić zaćmieniem poprzez Egit.

1) Przejdź do widoku „Eksploracja repozytorium git” i eksploruj projekt git, w którym chcesz utworzyć gałąź. W obszarze Brances -> Local .. wybierz gałąź, dla której chcesz utworzyć gałąź (w moim przypadku wybrałem master .. możesz wybrać inną gałąź, jeśli chcesz) .. następnie kliknij prawym przyciskiem myszy i kliknij opcję Utwórz gałąź. i wybierz opcję kasy tego projektu, a następnie kliknij przycisk Zakończ.

2) Teraz z eksploratora projektu wybierz projekt .. kliknij prawym przyciskiem myszy, a następnie Zespół -> Oddział Push.

Zostanie utworzona nowa gałąź zdalna. Możesz podać nazwę oddziału swoim kolegom, aby mogli go pobrać.

użytkownik2225713
źródło
Styczne ostrzeżenie o Egit - i wszystkich klientach opartych na JGit, AFAIK: nie obsługują atrybutów .git! Oznacza to, że jeśli Twój zespół używa kombinacji Windows (CRLF) i Linux / OSX (LF), musisz zawsze polegać na tym, że każdy klient ma odpowiednie ustawienia. Oczywiście lepiej jest centralnie zarządzać zakończeniami linii na poziomie repo lub projektu, a obsługiwanym sposobem jest .gitattributes. Więc jeśli nie musisz absolutnie używać Egit ... nie rób tego! :)
tydzień
2

Użyłem dwóch sposobów, aby utworzyć oddział

Jeśli używasz TortoiseGit, wykonaj następujące kroki: -

1. Utwórz oddział za pomocą TortoiseGit

Kliknij prawym przyciskiem myszy swój projekt >>> TortoiseGit >>> Utwórz gałąź >>> wpisz nazwę gałęzi i wybierz gałąź podstawową, a następnie naciśnij ok

2. Wciśnij gałąź

Kliknij projekt prawym przyciskiem myszy >>> TortoiseGit >>> naciśnij >>> kliknij OK

3. Przejdź do nowego oddziału

Kliknij projekt prawym przyciskiem myszy >>> TortoiseGit >>> Switch / Checkout >>> wybierz nowo utworzony oddział i naciśnij OK

Jeśli używasz wiersza polecenia, wykonaj następujące kroki: -

1. Utwórz oddział za pomocą wiersza polecenia

$ git Checkout -b nowa_nazwa_gałęzi

2. Wciśnij gałąź

$ git push origin new_branch_name

3.Przejdź do nowej gałęzi, która już przełączy się na nową_nazję_gałęzi, w przeciwnym razie możesz jej użyć

$ git Checkout new_branch_name

Mandeep Singh Gill
źródło
0

Korzystam z tego i jest to całkiem przydatne:

git config --global alias.mkdir '!git checkout -b $1; git status; git push -u origin $1; exit;'

Zastosowanie: git mkdir NEW_BRANCH

Nie potrzebujesz nawet statusu git; może chcę tylko upewnić się, że wszystko idzie dobrze ...

Możesz mieć ZARÓWNO LOKALNIE i ZDALNIE jednym poleceniem.

Tarik
źródło