Jakie są różnice między oddziałem lokalnym, lokalnym oddziałem śledzenia, oddziałem zdalnym i oddziałem zdalnego śledzenia?

158

Właśnie zacząłem używać Gita i naprawdę pomyliłem się między różnymi gałęziami. Czy ktoś może mi pomóc dowiedzieć się, jakie są następujące typy gałęzi?

  • oddziały lokalne
  • lokalne oddziały śledzenia
  • zdalne oddziały
  • oddziały zdalnego śledzenia

Jaka jest różnica między nimi? A jak one ze sobą współpracują?

Chyba bardzo pomocny będzie szybki kod demonstracyjny.

eded
źródło

Odpowiedzi:

123

Lokalna gałąź jest gałęzią, że tylko można (użytkownik lokalny) zob. Istnieje tylko na twoim lokalnym komputerze.

git branch myNewBranch        # Create local branch named "myNewBranch"

Zdalnego gałąź jest gałęzią na odległym miejscu (w większości przypadków origin). Możesz wypchnąć nowo utworzony oddział lokalny myNewBranchdo origin. Teraz inni użytkownicy mogą to śledzić.

git push -u origin myNewBranch   # Pushes your newly created local branch "myNewBranch"
                                 # to the remote "origin".
                                 # So now a new branch named "myNewBranch" is
                                 # created on the remote machine named "origin"

Zdalnego śledzenia oddział jest lokalna kopia zdalnej gałęzi. Po myNewBranchnaciśnięciu originpowyższego polecenia origin/myNewBranchna komputerze zostanie utworzona zdalna gałąź śledzenia o nazwie . Ta zdalna gałąź śledzenia śledzi zdalną gałąź myNewBranchna origin. Możesz zaktualizować swoją gałąź zdalnego śledzenia, aby była zsynchronizowana ze zdalną gałęzią za pomocą git fetchlub git pull.

git pull origin myNewBranch      # Pulls new commits from branch "myNewBranch" 
                                 # on remote "origin" into remote tracking
                                 # branch on your machine "origin/myNewBranch".
                                 # Here "origin/myNewBranch" is your copy of
                                 # "myNewBranch" on "origin"

Lokalny oddział śledzenia jest lokalny oddział , który śledzi inny oddział. Dzieje się tak, abyś mógł wypychać / wyciągać zatwierdzenia do / z innej gałęzi. Lokalne oddziały śledzenia w większości przypadków śledzą zdalne oddziały śledzenia. Gdy wypychasz oddział lokalny do originkorzystania git push commandz -uopcji z opcją (jak pokazano powyżej), konfigurujesz oddział lokalny myNewBranchdo śledzenia gałęzi zdalnego śledzenia origin/myNewBranch. Jest to potrzebne do użycia git pushi git pullbez określania nadrzędnego źródła, do którego należy wypychać lub wyciągać.

git checkout myNewBranch      # Switch to myNewBranch
git pull                      # Updates remote tracking branch "origin/myNewBranch"
                              # to be in sync with the remote branch "myNewBranch"
                              # on "origin".
                              # Pulls these new commits from "origin/myNewBranch"
                              # to local branch "myNewBranch which you just switched to.
SNce
źródło
W przypadku definicji lokalnej gałęzi śledzenia, czy nie jest to to samo, co oddział lokalny po przekazaniu go do zdalnego?
mskw
2
@mskw Nie, lokalna gałąź śledzenia i lokalna (bez śledzenia) gałąź różnią się skojarzeniem. Oddział lokalny NIE jest powiązany z żadnym oddziałem. Jest to po prostu gałąź istniejąca na twoim lokalnym komputerze w izolacji. Lokalna gałąź śledzenia jest powiązana ze zdalną gałęzią śledzenia. Możesz więc push / pull commity do / od siebie.
SNce
196

Oto długa odpowiedź.

Piloty:

Jeśli używasz Git wspólnie, prawdopodobnie będziesz musiał zsynchronizować swoje zatwierdzenia z innymi maszynami lub lokalizacjami. W terminologii Gita każda maszyna lub lokalizacja jest nazywana zdalną i każda może mieć jedną lub więcej gałęzi. Najczęściej będziesz mieć tylko jeden, nazwany origin. Aby wyświetlić wszystkie piloty, uruchom git remote:

$ git remote
bitbucket
origin

Możesz sprawdzić, do których lokalizacji te nazwy zdalne są skrótami, uruchamiając git remote -v:

$ git remote -v
bitbucket [email protected]:flimm/example.git (fetch)
bitbucket [email protected]:flimm/example.git (push)
origin [email protected]:Flimm/example.git (fetch)
origin [email protected]:Flimm/example.git (push)

Każdy pilot ma katalog w git/refs/remotes/:

$ ls -F .git/refs/remotes/
bitbucket/ origin/

Gałęzie na twojej maszynie:

TLDR: na komputerze lokalnym masz trzy rodzaje oddziałów: lokalne oddziały bez śledzenia, lokalne oddziały śledzące i oddziały ze zdalnym śledzeniem. Na zdalnym komputerze masz tylko jeden rodzaj gałęzi.

1. Oddziały lokalne

Możesz wyświetlić listę wszystkich lokalnych oddziałów na swoim komputerze, uruchamiając git branch:

$ git branch
master
new-feature

Każdy oddział lokalny ma plik pod .git/refs/heads/:

$ ls -F .git/refs/heads/
master new-feature

Na twoim komputerze są dwa typy oddziałów lokalnych: bez śledzenia oddziałów lokalnych i śledzące oddziały lokalne.

1.1 Brak śledzenia oddziałów lokalnych

Lokalne oddziały bez śledzenia nie są powiązane z żadnym innym oddziałem. Tworzysz go, biegając git branch <branchname>.

1.2. Śledzenie lokalnych oddziałów

Lokalne oddziały śledzące są powiązane z innym oddziałem, zwykle oddziałem zdalnego śledzenia. Tworzysz go, biegając git branch --track <branchname> [<start-point>].

Możesz sprawdzić, który z lokalnych oddziałów śledzi oddziały za pomocą git branch -vv:

$ git branch -vv
master      b31f87c85 [origin/master] Example commit message
new-feature b760e04ed Another example commit message

Na podstawie danych wyjściowych tego polecenia można zobaczyć, że gałąź lokalna masterśledzi gałąź zdalnego śledzenia origin/master, a gałąź lokalna new-featureniczego nie śledzi.

Innym sposobem sprawdzenia, które gałęzie śledzą gałęzie, jest przyjrzenie się .git/config.

Śledzenie lokalnych oddziałów jest przydatne. Pozwalają na uruchamianie git pulli git pushbez określania, której gałęzi nadrzędnej użyć. Jeśli gałąź nie jest skonfigurowana do śledzenia innej gałęzi, pojawi się błąd podobny do tego:

$ git checkout new-feature
$ git pull
There is no tracking information for the current branch.
Please specify which branch you want to merge with.
See git-pull(1) for details

    git pull <remote> <branch>

If you wish to set tracking information for this branch you can do so with:

    git branch --set-upstream new-feature <remote>/<branch>

2. Zdalne śledzenie oddziałów (nadal na twoim komputerze)

Możesz wyświetlić listę wszystkich gałęzi zdalnego śledzenia na swoim komputerze, uruchamiając git branch -r:

$ git branch -r
bitbucket/master
origin/master
origin/new-branch

Każda gałąź zdalnego śledzenia ma plik w .git/refs/<remote>/:

$ tree -F .git/refs/remotes/
.git/refs/remotes/
├── bitbucket/
│   └── master
└── origin/
    ├── master
    └── new-branch

Pomyśl o swoich gałęziach zdalnego śledzenia jako o lokalnej pamięci podręcznej dla tego, co zawierają komputery zdalne. Możesz zaktualizować swoje gałęzie zdalnego śledzenia za pomocą git fetch, który git pullużywa za kulisami.

Mimo że wszystkie dane dla oddziału zdalnego śledzenia są przechowywane lokalnie na twoim komputerze (jak pamięć podręczna), nadal nie nazywa się to oddziałem lokalnym. (Przynajmniej nie nazwałbym tego tak!) Nazywa się to po prostu gałęzią zdalnego śledzenia.

Oddziały na zdalnym komputerze:

Możesz wyświetlić wszystkie zdalne gałęzie (czyli gałęzie na zdalnym komputerze), uruchamiając git remote show <remote>:

$ git remote show origin
* remote origin
  Fetch URL: [email protected]:Flimm/example.git
  Push  URL: [email protected]:Flimm/example.git
  HEAD branch: master
  Remote branches:
    io-socket-ip            new (next fetch will store in remotes/origin)
    master                  tracked
    new-branch              tracked
  Local ref configured for 'git pull':
    master     merges with remote master
    new-branch merges with remote new-branch
  Local ref configured for 'git push':
    master     pushes to master     (up to date)
    new-branch pushes to new-branch (fast-forwardable)

To git remotepolecenie wysyła zapytanie do zdalnego komputera za pośrednictwem sieci o jego gałęzie. Nie aktualizuje oddziałów zdalnego śledzenia na komputerze lokalnym, użyj git fetchlub git pulldo tego.

Na wyjściu możesz zobaczyć wszystkie gałęzie, które istnieją na zdalnym komputerze, patrząc pod nagłówkiem „Zdalne gałęzie” (ignoruj ​​wiersze oznaczone jako „nieaktualne”).

Gdybyś mógł zalogować się na zdalnej maszynie i znaleźć repozytorium w systemie plików, mógłbyś rzucić okiem na wszystkie jego gałęzie pod refs/heads/.

Ściągawka:

  • Aby bezpiecznie usunąć oddział lokalny, niezależnie od tego, czy śledzą, czy nie:

    git branch -d <branchname>
    
  • Aby wymusić usunięcie lokalnego oddziału, niezależnie od tego, czy jest śledzony, czy nie:

    git branch -D <branchname>
    
  • Aby usunąć gałąź zdalnego śledzenia:

    git branch -rd <remote>/<branchname>
    
  • Aby utworzyć nowy lokalny oddział bez śledzenia:

    git branch <branchname> [<start-point>]
    
  • Aby utworzyć nową lokalną gałąź śledzenia: (Zauważ, że jeśli <start-point>jest określony i jest to gałąź zdalnego śledzenia, taka jak origin/foobar, --trackflaga jest dołączana automatycznie)

    git branch --track <branchname> [<start-point]
    

    Przykład:

    git branch --track hello-kitty origin/hello-kitty
    
  • Aby usunąć oddział na zdalnym komputerze:

    git push --delete <remote> <branchname>
    
  • Aby usunąć wszystkie gałęzie zdalnego śledzenia, które są nieaktualne, czyli takie, w których odpowiadające im gałęzie na komputerze zdalnym już nie istnieją:

    git remote prune <remote>
    

Można zauważyć, że w niektórych poleceń, należy użyć <remote>/<branch>, i inne polecenia, <remote> <branch>. Przykłady: git branch origin/hello-kittyi git push --delete origin hello-kitty.

Może się to wydawać arbitralne, ale istnieje prosty sposób na zapamiętanie, kiedy należy użyć ukośnika, a kiedy spacji. Kiedy używasz ukośnika, masz na myśli oddział zdalnego śledzenia na swoim własnym komputerze, podczas gdy gdy używasz spacji, w rzeczywistości masz do czynienia z oddziałem na zdalnym komputerze w sieci.

Flimm
źródło
Użyłbym do stworzenia gałęzi i przejścia do gałęzi w jednym cmd jako: git checkout -b mynewbranch
Zeta
Podobał mi się ostatni punkt dotyczący różnicy między spacją a ukośnikiem!
aderchox
12

Oddział lokalny:

Gałąź na twoim komputerze, w której możesz pracować i dodawać zatwierdzenia. Możesz wymienić te gałęzie z git branch.

Oddział lokalny (ze śledzeniem):

Zwykły oddział lokalny skonfigurowany tak, aby odpowiadał oddziałowi zdalnemu. Ma to zalety, takie jak możliwość git pulli git pushbez konieczności określania repozytorium i nazwy gałęzi. Śledzenie powoduje również, że git statusTwój oddział jest przed lub za pilotem.

Oddział zdalny:

Po prostu oddział w zdalnym repozytorium - zwykle na serwerze, takim jak GitHub itp.

Oddział zdalnego śledzenia:

Lokalna kopia zdalnego oddziału. Ta gałąź nigdy nie powinna być edytowana. Jego celem jest śledzenie aktualnego stanu zdalnego oddziału. Gałęzie zdalnego śledzenia można przeglądać za pomocą git branch -ri zazwyczaj wyglądają jak origin/master(nazwa repozytorium, po której następuje ukośnik, po którym następuje nazwa gałęzi). Uruchomienie git fetchzaktualizuje gałęzie zdalnego śledzenia, aby odzwierciedlić stan odpowiednich gałęzi zdalnych.

git branch -avvjest moim ulubionym narzędziem do wyświetlania szybkiego przeglądu, które gałęzie znajdują się na moim komputerze, które gałęzie są zdalne i najnowsze zatwierdzenie w każdym z nich. W -aczęści określa, że wszystkie gałęzie powinny być pokazane (zdalne i lokalne). Na vkońcu oznacza verbose (pokazuje ostatni skrót zatwierdzenia i komunikat). Dzięki @Flimm za wskazanie, że druga vdodaje informację o tym, który oddział lokalny śledzi który pilot.

Eric Mathison
źródło
1
Nie rozumiem różnicy między lokalnymi i zdalnymi gałęziami śledzenia - pierwsza odpowiada źródłu, a druga zdalnej maszynie. ale czy to nie to samo? czy to nie jest tylko repozytorium, które jest zwykle na githubie?
akantoword
1
@akantoword Zaktualizowałem odpowiedź, aby trochę wyjaśnić. Zasadniczo gałąź zdalnego śledzenia jest po prostu lokalną kopią zdalnego oddziału, która nie jest przeznaczona do pracy. Lokalny oddział ze śledzeniem jest przeznaczony do pracy w.
Eric Mathison