Jak wypchnąć nowy oddział lokalny do zdalnego repozytorium Git i śledzić go?

4302

Chcę móc wykonać następujące czynności:

  1. Utwórz oddział lokalny na podstawie innego (zdalnego lub lokalnego) oddziału (przez git branchlub git checkout -b)

  2. Wciśnij oddział lokalny do zdalnego repozytorium (publikuj), ale spraw, aby można go było śledzić git pulli git pushbędzie działać natychmiast.

Jak mogę to zrobić?

Wiem o tym --set-upstreamw Git 1.7, ale jest to akcja po stworzeniu. Chcę znaleźć sposób na dokonanie podobnej zmiany podczas wypychania gałęzi do zdalnego repozytorium.

Roni Yaniv
źródło
71
dla przypomnienia --set-upstream to -u
Baiyan Huang,
@BaiyanHuang dzięki za zwrócenie na to uwagi. Początkowo myślałem, że -u znaczy nie wyśledzone, co nie miało dla mnie sensu
Dmitry

Odpowiedzi:

6608

W Git 1.7.0 i nowszych możesz pobrać nową gałąź:

git checkout -b <branch>

Edytuj pliki, dodawaj i zatwierdzaj. Następnie naciśnij-u--set-upstream opcję (skrót od ) :

git push -u origin <branch>

Git skonfiguruje informacje o śledzeniu podczas wypychania.

Daniel Ruoso
źródło
81
Warto również zauważyć, że jeśli masz już gałąź śledzenia ustawioną na gałęzi, którą naciskasz, i push.defaultjest ustawiona na upstream, nie zrobi tego, co według ciebie zrobi. Spróbuje przerzucić istniejącą gałąź śledzenia. Użyj: git push -u origin mynewfeature:mynewfeaturelub zrób git branch --unset-upstreampierwszy.
void.pointer
13
Dla osób korzystających z Git z Visual Studio: W rzeczywistości działa to w „Publish Branch” w Visual Studio. Po wykonaniu git push z parametrem -u mogę wreszcie zobaczyć moją gałąź opublikowaną w VS UI.
Puterdo Borato,
3
Czy git push -u origin <odgałęzienie> jest taki sam jak git push -u origin HEAD (zakładając, że masz gałąź, którą chcesz wypchnąć, sprawdzone?)
gymbrall
13
Czy potrzebujemy tej -uopcji za każdym razem, gdy pchamy gałąź do jej pilota, czy potrzebujemy jej tylko za pierwszym razem?
Stephane
17
@Stephane Potrzebujesz tylko -uraz, aby rozpocząć śledzenie. Następnie użyjgit push
Todd
491

Jeśli nie udostępniasz repozytorium innym osobom, przydatne jest wypchnięcie wszystkich gałęzi do pilota i --set-upstreamprawidłowe śledzenie:

git push --all -u

(Nie do końca to, o co prosił PO, ale ten jednowarstwowy jest dość popularny)

Jeśli dzielisz się repozytorium z innymi, nie jest to naprawdę dobra forma, ponieważ zapchasz repo wszystkimi swoimi podejrzanymi gałęziami eksperymentalnymi.

ErichBSchulz
źródło
14
i git pull --allwyciąga to wszystko gdzie indziej? kewl
commonpike
1
To polecenie konfiguruje śledzenie do właściwej gałęzi bez potrzeby pchania czegokolwiek. Dziękuję Ci.
amey91
45
Git pozwala zatwierdzić gałąź i nie przesuwać jej z bardzo dobrych powodów. Tylko użycie git push - wszystko jest jak upuszczenie kawałka architektury git. Jeśli to działa, jest w porządku, świetnie, rób to na zawsze. Ale PROSZĘ nie polecam innym, aby unikali nauki git tylko dlatego, że jest to szybki sposób na robienie różnych rzeczy.
Federico Razzoli,
4
To naprawdę nie jest właściwa odpowiedź i nie jest dobrym narzędziem do rekomendowania bez prawdziwego wyjaśnienia, co robi i jakie są tego konsekwencje. Proszę rozważyć usunięcie tej odpowiedzi.
akronimn
3
@Federico @akronymn Gdzie można znaleźć niebezpieczeństwa związane z robieniem git push --all -u?
user1823664,
155

Przed wprowadzeniem git push -unie było git pushmożliwości uzyskania tego, czego pragniesz. Trzeba było dodać nowe instrukcje konfiguracji.

Jeśli utworzysz nowy oddział za pomocą:

$ git checkout -b branchB
$ git push origin branchB:branchB

Możesz użyć git configpolecenia, aby uniknąć bezpośredniej edycji .git/configpliku.

$ git config branch.branchB.remote origin
$ git config branch.branchB.merge refs/heads/branchB

Możesz też ręcznie edytować .git/configplik, aby mieć informacje o śledzeniu do tej gałęzi.

[branch "branchB"]
    remote = origin
    merge = refs/heads/branchB
Lohrun
źródło
4
czasami potrzebujesz tegogit push origin -u local_branch:remote_branch
Bruce Lee
127

Mówiąc prosto, aby utworzyć nowy oddział lokalny , wykonaj:

git branch <branch-name>

Aby przekazać go do zdalnego repozytorium, wykonaj:

git push -u origin <branch-name>
piyushmandovra
źródło
17
git branch <branch-name>i git checkout -b <branch-name>oba tworzą oddział, ale kasa przechodzi do nowego oddziału
Robert,
1
nawias klamrowy jest po prostu wspomnieć, że musisz zastąpić dowolną nazwą oddziału, którą chcesz utworzyć i wcisnąć.
piyushmandovra
jest to nieistniejąca gałąź na odległość, i odrzućsrc branch-name does not match any
Adi Prasetyo
96

Niewielka różnorodność podanych tutaj rozwiązań:

  1. Utwórz oddział lokalny na podstawie innego (zdalnego lub lokalnego) oddziału:

    git checkout -b branchname
    
  2. Wciśnij oddział lokalny do zdalnego repozytorium (publikuj), ale spraw, aby można go było śledzić git pulli git pushbędzie działać natychmiast

    git push -u origin HEAD
    

    Użycie HEADto „wygodny sposób na przesunięcie bieżącej gałęzi do tej samej nazwy na pilocie”. Źródło: https://git-scm.com/docs/git-push W terminologii Git HEAD (wielkimi literami) jest odniesieniem do górnej części bieżącej gałęzi (drzewa).

    Ta -uopcja jest po prostu krótka --set-upstream. Spowoduje to dodanie referencji śledzenia w górę dla bieżącej gałęzi. możesz to sprawdzić, przeglądając plik .git / config:

    Wpisz opis zdjęcia tutaj

bg17aw
źródło
2
Dziękuję :) git push -u origin <branch-name>nie działało dla mnie, ale używanie HEADzamiast <branch-name>działało idealnie :)
Daniel Tonon,
56

Po prostu robię

git push -u origin localBranch:remoteBranchToBeCreated

nad już sklonowanym projektem.

Git tworzy nowy oddział o nazwie remoteBranchToBeCreatedpod moimi zobowiązaniami, które zrobiłem localBranch.

Edycja : zmienia bieżący oddział lokalny (ewentualnie nazwany localBranch) w górę origin/remoteBranchToBeCreated. Aby to naprawić, po prostu wpisz:

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

Więc twój obecny oddział lokalny śledzi teraz origin/localBranch.

Arda
źródło
1
Właśnie tego aktywnie szukałem
eli
git rzuca, error: src refspec <new branch> does not match any.kiedy próbuję tego.
codeforester
1
To powinna być najlepsza odpowiedź.
Aditya Abhas
30

Przypuszczam, że już sklonowałeś projekt taki jak:

git clone http://github.com/myproject.git
  1. Następnie w lokalnej kopii utwórz nowy oddział i sprawdź go:

    git checkout -b <newbranch>
    
  2. Załóżmy, że utworzyłeś „git bare --init” na swoim serwerze i utworzyłeś myapp.git, powinieneś:

    git remote add origin ssh://example.com/var/git/myapp.git
    git push origin master
    
  3. Następnie użytkownicy powinni mieć możliwość

    git clone http://example.com/var/git/myapp.git
    

UWAGA: Zakładam, że masz uruchomiony serwer. Jeśli nie jest, nie będzie działać. Dobre instrukcje są tutaj .

DODANY

Dodaj zdalną gałąź:

git push origin master:new_feature_name

Sprawdź, czy wszystko jest w porządku (pobierz źródło i zdalne gałęzie):

git fetch origin
git branch -r

Utwórz oddział lokalny i śledź oddział zdalny:

git checkout -tb new_feature_name origin/new_feature_name

Zaktualizuj wszystko:

git pull
VP.
źródło
1
Skrypt Williama, z którym się powiązałem, działa mniej więcej tak samo z dodatkową opcją usuwania zdalnych gałęzi i pewnymi zabezpieczeniami
Tobias Kienzler
1
> wypchnąć lokalny oddział do zdalnego repozytorium (opublikuj), ale spraw, aby był> możliwy do śledzenia, aby git pull i git push działały natychmiast. to, co robi github automatycznie, kiedy wypychasz kod do repozytorium :-)
VP.
1
To nie odpowiada na pytanie, <nazwa> oryginalnego repozytorium nie jest możliwe do śledzenia (i zmienia nazwę na <master> to nowe repo, które klonujesz w kroku 3).
Lohrun
1
wydaje się rodzaj przesady. czy git remote add originśledzenie lokalnego oddziału jest możliwe? czy to jest tutaj kluczowe polecenie?
Roni Yaniv
3
@Roni Yaniv: nie git remote add origintylko zarejestruj nowe zdalne repozytorium. Jest to tylko krok potrzebny do wypchnięcia oddziału do tego zdalnego repozytorium (jeśli nie chcesz za każdym razem wpisywać całego adresu)
Lohrun
23

edytuj Nieaktualne, po prostu użyjgit push -u origin $BRANCHNAME


Skorzystaj git publish-branchz różnych narzędzi Git Williama ( genialne repo i klonowanie ).

OK, nie Ruby, więc - ignorując zabezpieczenia! - weź trzy ostatnie wiersze skryptu i utwórz skrypt bash git-publish-branch:

#!/bin/bash
REMOTE=$1 # Rewrite this to make it optional...
BRANCH=$2
# Uncomment the following line to create BRANCH locally first
#git checkout -b ${BRANCH}
git push ${ORIGIN} ${BRANCH}:refs/heads/${BRANCH} &&
git config branch.${BRANCH}.remote ${REMOTE} &&
git config branch.${BRANCH}.merge refs/heads/${BRANCH}

Następnie uruchom git-publish-branch REMOTENAME BRANCHNAME, gdzie REMOTENAME to zazwyczaj origin (możesz zmodyfikować skrypt, aby przyjmował pochodzenie jako domyślny itp.)

Tobias Kienzler
źródło
1
zakłada to, że mam zainstalowany ruby. nie ma takiego szczęścia. jakieś inne pomysły?
Roni Yaniv
2
wywołania git pushi git configpolecenia skryptów ruby . Użyłem kodu skryptu do edycji mojej odpowiedzi. Możesz użyć tych informacji do stworzenia małego skryptu powłoki, który robi dla ciebie pompkę.
Lohrun
1
Wygląda na to, że różne narzędzia git Williama zostały przeniesione (ten link jest już nieaktualny). Działający link to: gitorious.org/willgit
Mike D
1
Link „Williama” ponownie zerwany; nowy link wydaje się być git-wt-commit.rubyforge.org
ScottJ
22

Aby utworzyć nowy oddział poprzez rozgałęzienie z istniejącego oddziału

git checkout -b <new_branch>

a następnie wypchnij ten nowy oddział do repozytorium za pomocą

git push -u origin <new_branch>

Spowoduje to utworzenie i przekazanie wszystkich zatwierdzeń lokalnych do nowo utworzonego zdalnego oddziału origin/<new_branch>

cptjack
źródło
12

W przypadku wersji GitLab wcześniejszej niż 1.7 użyj:

git checkout -b name_branch

(name_branch, ex: master)

Aby przekazać go do zdalnego repozytorium, wykonaj:

git push -u origin name_new_branch

(name_new_branch, na przykład: feature)

Dziwne
źródło
9

Utworzyłem alias, aby za każdym razem, gdy utworzyłem nowy oddział, odpowiednio go popychał i śledził. Do .bash_profilepliku wstawiłem następujący fragment :

# Create a new branch, push to origin and track that remote branch
publishBranch() {
  git checkout -b $1
  git push -u origin $1
}
alias gcb=publishBranch

Zastosowanie : wystarczy wpisać za gcb thuy/do-sth-koolpomocą thuy/do-sth-koolto moja nowa nazwa oddziału.

Thuy Trinh
źródło
4

Opierając się nieco na odpowiedziach tutaj, podsumowałem ten proces jako prosty skrypt Bash, który oczywiście może być również używany jako alias Git.

Ważnym dodatkiem do mnie jest to, że zachęca mnie to do przeprowadzenia testów jednostkowych przed zatwierdzeniem i domyślnie podaje aktualną nazwę oddziału.

$ git_push_new_branch.sh

  Have you run your unit tests yet? If so, pass OK or a branch name, and try again

  usage: git_push_new_branch {OK|BRANCH_NAME}

  e.g.

  git_push_new_branch           -> Displays prompt reminding you to run unit tests
  git_push_new_branch OK        -> Pushes the current branch as a new branch to the origin
  git_push_new_branch MYBRANCH  -> Pushes branch MYBRANCH as a new branch to the origin

git_push_new_branch.sh

function show_help()
{
  IT=$(cat <<EOF

  Have you run your unit tests yet? If so, pass OK or a branch name, and try again

  usage: git_push_new_branch {OK|BRANCH_NAME}

  e.g.

  git_push_new_branch.sh           -> Displays prompt reminding you to run unit tests
  git_push_new_branch.sh OK        -> Pushes the current branch as a new branch to the origin
  git_push_new_branch.sh MYBRANCH  -> Pushes branch MYBRANCH as a new branch to the origin

  )
  echo "$IT"
  exit
}

if [ -z "$1" ]
then
  show_help
fi

CURR_BRANCH=$(git rev-parse --abbrev-ref HEAD)
if [ "$1" == "OK" ]
then
  BRANCH=$CURR_BRANCH
else
  BRANCH=${1:-$CURR_BRANCH}
fi

git push -u origin $BRANCH
Brad Parks
źródło
2

Możesz to zrobić w 2 krokach:

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

git checkout -b yourBranchName

Pracuj ze swoim Oddziałem, jak chcesz.

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
0

Aby uzyskać największą elastyczność, możesz użyć niestandardowego polecenia Git . Na przykład utwórz następujący skrypt w języku Python gdzieś $PATHpod nazwą git-publishi wykonaj go:

#!/usr/bin/env python3

import argparse
import subprocess
import sys


def publish(args):
    return subprocess.run(['git', 'push', '--set-upstream', args.remote, args.branch]).returncode


def parse_args():
    parser = argparse.ArgumentParser(description='Push and set upstream for a branch')
    parser.add_argument('-r', '--remote', default='origin',
                        help="The remote name (default is 'origin')")
    parser.add_argument('-b', '--branch', help='The branch name (default is whatever HEAD is pointing to)',
                        default='HEAD')
    return parser.parse_args()


def main():
    args = parse_args()
    return publish(args)


if __name__ == '__main__':
    sys.exit(main())

Następnie git publish -hpokaże ci informacje o użyciu:

usage: git-publish [-h] [-r REMOTE] [-b BRANCH]

Push and set upstream for a branch

optional arguments:
  -h, --help            show this help message and exit
  -r REMOTE, --remote REMOTE
                        The remote name (default is 'origin')
  -b BRANCH, --branch BRANCH
                        The branch name (default is whatever HEAD is pointing to)
Eugene Yarmash
źródło