Ecco la lunga risposta.
Telecomandi:
Se stai usando Git in modo collaborativo, probabilmente dovrai sincronizzare i tuoi commit con altre macchine o posizioni. Ogni macchina o posizione è chiamata remota , nella terminologia di Git, e ciascuna può avere uno o più rami. Molto spesso, ne avrai solo uno, chiamato origin
. Per elencare tutti i telecomandi, eseguire git remote
:
$ git remote
bitbucket
origin
Puoi vedere per quali posizioni questi nomi remoti sono collegamenti, eseguendo 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)
Ogni telecomando ha una directory sotto git/refs/remotes/
:
$ ls -F .git/refs/remotes/
bitbucket/ origin/
Filiali sulla tua macchina:
TLDR: sul tuo computer locale, hai tre tipi di filiali: filiali locali non di tracciamento, filiali di localizzazione locali e filiali di tracciamento remoto. Su una macchina remota, hai solo un tipo di ramo.
1. Filiali locali
È possibile visualizzare un elenco di tutti i rami locali sul proprio computer eseguendo git branch
:
$ git branch
master
new-feature
Ogni ramo locale ha un file sotto .git/refs/heads/
:
$ ls -F .git/refs/heads/
master new-feature
Esistono due tipi di filiali locali sul computer: filiali locali non tracciabili e filiali locali tracciabili.
1.1 Filiali locali senza tracciamento
Le filiali locali senza tracciamento non sono associate ad altre filiali. Ne crei uno eseguendogit branch <branchname>
.
1.2. Tracciamento delle filiali locali
Il monitoraggio delle filiali locali è associato a un altro ramo, in genere un ramo di monitoraggio remoto. Ne crei uno eseguendogit branch --track <branchname> [<start-point>]
.
Puoi visualizzare quale delle tue filiali locali sta seguendo le filiali usando git branch -vv
:
$ git branch -vv
master b31f87c85 [origin/master] Example commit message
new-feature b760e04ed Another example commit message
Dall'output di questo comando, puoi vedere che il ramo locale master
sta monitorando il ramo di monitoraggio remoto origin/master
e il ramo locale new-feature
non sta monitorando nulla.
Un altro modo per vedere quali rami stanno seguendo i rami è dare un'occhiata .git/config
.
Tracciare le filiali locali sono utili. Consentono di eseguire git pull
e git push
, senza specificare quale ramo a monte utilizzare. Se il ramo non è impostato per tenere traccia di un altro ramo, verrà visualizzato un errore come questo:
$ 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. Diramazioni di localizzazione remote (ancora sulla tua macchina)
Puoi visualizzare un elenco di tutti i rami di tracciamento remoto sul tuo computer eseguendo git branch -r
:
$ git branch -r
bitbucket/master
origin/master
origin/new-branch
Ciascun ramo di tracciamento remoto ha un file in .git/refs/<remote>/
:
$ tree -F .git/refs/remotes/
.git/refs/remotes/
├── bitbucket/
│ └── master
└── origin/
├── master
└── new-branch
Pensa ai tuoi rami di tracciamento remoto come alla cache locale per ciò che contengono i computer remoti. Puoi aggiornare i tuoi rami di tracciamento remoto utilizzando git fetch
, che git pull
utilizza dietro le quinte.
Anche se tutti i dati per un ramo di tracciamento remoto sono archiviati localmente sul tuo computer (come una cache), non vengono mai chiamati rami locali. (Almeno, non lo chiamerei così!) Si chiama semplicemente un ramo di monitoraggio remoto.
Filiali su una macchina remota:
È possibile visualizzare tutti i rami remoti (ovvero i rami sul computer remoto), eseguendo 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)
Questo git remote
comando interroga la macchina remota sulla rete sui suoi rami. Non aggiorna i rami di tracciamento remoto sul tuo computer locale, usi git fetch
o git pull
per quello.
Dall'output, è possibile vedere tutti i rami presenti sul computer remoto guardando sotto l'intestazione "Rami remoti" (ignorare le linee contrassegnate come "stantio").
Se potessi accedere al computer remoto e trovare il repository nel filesystem, puoi dare un'occhiata a tutti i suoi rami sotto refs/heads/
.
Foglio cheat:
Per eliminare una succursale locale, sia di tracciamento che di non tracciamento, in modo sicuro:
git branch -d <branchname>
Per eliminare una filiale locale, sia di tracciamento che di non tracciamento, forzatamente:
git branch -D <branchname>
Per eliminare un ramo di tracciamento remoto:
git branch -rd <remote>/<branchname>
Per creare un nuovo ramo locale senza tracciamento:
git branch <branchname> [<start-point>]
Per creare un nuovo ramo di tracciamento locale: (Nota che se <start-point>
è specificato ed è un ramo di tracciamento remoto come origin/foobar
, allora il --track
flag viene automaticamente incluso)
git branch --track <branchname> [<start-point]
Esempio:
git branch --track hello-kitty origin/hello-kitty
Per eliminare un ramo su un computer remoto:
git push --delete <remote> <branchname>
Per eliminare tutti i rami di tracciamento remoti che sono obsoleti, ovvero dove i rami corrispondenti sul computer remoto non esistono più:
git remote prune <remote>
Potresti aver notato che in alcuni comandi usi <remote>/<branch>
e altri comandi <remote> <branch>
. Esempi: git branch origin/hello-kitty
e git push --delete origin hello-kitty
.
Può sembrare arbitrario, ma esiste un modo semplice per ricordare quando usare una barra e quando usare uno spazio. Quando si utilizza una barra, ci si riferisce a un ramo di tracciamento remoto sul proprio computer, mentre quando si utilizza uno spazio, si ha effettivamente a che fare con un ramo su un computer remoto in rete.