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 git@bitbucket.org:flimm/example.git (fetch)
bitbucket git@bitbucket.org:flimm/example.git (push)
origin git@github.com:Flimm/example.git (fetch)
origin git@github.com: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-feature
niczego 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 pull
i git push
bez 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 pull
uż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: git@github.com:Flimm/example.git
Push URL: git@github.com: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 remote
polecenie 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 fetch
lub git pull
do 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
, --track
flaga 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-kitty
i 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.