Jak wypchnąć tylko jedną gałąź Git (i żadnych innych)?

247

Pracuję na lokalnym repozytorium git. Istnieją dwie gałęzie masteri feature_x.

Chcę przekazać feature_xdo zdalnego repozytorium, ale nie chcę przesyłać zmian w mastergałęzi.

Czy git push origin feature_xmój feature_xoddział ( feature_xoddział już istnieje na odległość) będzie działał?

Nie chcę tego testować na moim pudełku, ponieważ nie mogę teraz naciskać na opanowanie.

Rafael Mueller
źródło
Spójrz tutaj: zdalnie, a tutaj: pchnij gałąź do github. Brzmi, jakby to działało.
al.

Odpowiedzi:

376

tak, po prostu wykonaj następujące czynności

git checkout feature_x
git push origin feature_x
cpjolicoeur
źródło
54
Dzięki nowoczesnemu gitowi powinieneś być w stanie po prostu „git push origin HEAD”, a nawet „git push HEAD”, aby wypchnąć tylko aktualnie sprawdzoną gałąź.
Jakub Narębski
2
Czy konieczne jest zamówienie do Feature_x?
hd.
5
tak, ponieważ jeśli jesteś w trybie master, spróbuje on wypchnąć lokalną gałąź master do zdalnej gałęzi feature_x. aby nie musieć najpierw
kasować,
1
@cjolicoeur Widziałem w innych pytaniach (np. tutaj ), że robią git push -u origin <branch-name>. Jednak nie wspomniałeś o tym. Czy to konieczne ?
riroo
3
@miss_R -uopcja git-pushpolecenia spowoduje ustawienie referencji w górę dla śledzenia gałęzi, która właśnie została wypchnięta. Dzięki temu rzeczy takie jak git-pullta gałąź w przyszłości będą już wiedziały, z której gałęzi pobrać, nie określając jej. Nie jest wymagana jako opcja wypychania pojedynczej gałęzi, ale jest szeroko stosowana, ponieważ wiele osób chce, aby lokalna gałąź śledziła zdalną gałąź, którą wypychają.
cpjolicoeur
74

Domyślnie git pushaktualizuje wszystkie zdalne gałęzie. Ale możesz skonfigurować git, aby aktualizował tylko bieżącą gałąź do jej źródła.

git config push.default upstream

Oznacza to, że git zaktualizuje tylko bieżącą (wypisaną) gałąź, gdy wykonujesz polecenie git push.

Inne ważne opcje to:

  • nothing: Nie wypychaj niczego (błąd), chyba że podano wyraźnie refspec . Jest to przede wszystkim przeznaczone dla osób, które chcą uniknąć błędów, zawsze wyrażając się jasno.
  • matching: Wciśnij wszystkie gałęzie o tej samej nazwie na obu końcach. (opcja domyślna przed wersją 1.7.11)
  • upstream: Wciśnij bieżącą gałąź do jej górnej gałęzi. Ten tryb ma sens tylko wtedy, gdy przepychasz się do tego samego repozytorium, z którego normalnie korzystasz (tj. Centralny przepływ pracy ). Nie trzeba mieć tej samej nazwy dla oddziału lokalnego i zdalnego.
  • tracking: Przestarzałe, użyj upstreamzamiast tego.
  • current: Wciśnij bieżącą gałąź do zdalnej gałęzi o tej samej nazwie na końcu odbierającym. Działa zarówno w centralnym, jak i niecentralnym przepływie pracy.
  • simple: [dostępny od wersji 1.7.11] w scentralizowanym przepływie pracy, pracuj jak upstreamz dodatkowym bezpieczeństwem, aby odmówić wypchnięcia, jeśli nazwa gałęzi upstream jest inna niż nazwa lokalna. Podczas pchania do pilota innego niż pilot, z którego zwykle wyciągasz, działaj jak current. Jest to najbezpieczniejsza opcja i nadaje się dla początkujących. Ten tryb stał się domyślny w Git 2.0.
Karthik Bose
źródło
2
Dzięki, currentto było to, czego szukałem, domyślnie git pushw foooddziale popchnie go do origin/foogałęzi.
Dorian
@Dianian, dziękuję, zgadzam się, że currentma to większy sens jako domyślny.
Zoltán
@Dorian, @ Zoltán - simpleDomyślnie uważam, że ma to większy sens. Zaktualizowałem odpowiedź słowem „kiedy użyć czego”. Proszę spojrzeć.
Karthik Bose
1
Uwaga: od wersji git 2 wartość domyślna zmieniła się na simple.
Danijel
8

Drobna aktualizacja oprócz odpowiedzi Karthika Bose'a - możesz skonfigurować git globalnie, aby wpływać na wszystkie obszary robocze, aby zachowywały się w ten sposób:

git config --global push.default upstream
Bhaskar
źródło
upstream nie został uznany za prawidłowe ustawienie dla mnie, musiałem zamiast tego wpisać „prąd”
konik polny
-2

Powiedzmy, że masz lokalną gałąź foo, zdalne źródło origin i zdalne źródło / master gałęzi.

Aby przesłać zawartość foo do origin / master, musisz najpierw ustawić jej pobieranie:

git checkout foo
git branch -u origin/master

Następnie możesz przepchnąć tę gałąź, używając:

git push origin HEAD:master

W ostatnim poleceniu możesz dodać --force, aby zastąpić całą historię pochodzenia / master historią foo.

CodeKid
źródło