Quali sono le differenze tra filiale locale, filiale di localizzazione locale, filiale remota e filiale di localizzazione remota?


158

Ho appena iniziato a usare Git e mi sono davvero confuso tra diversi rami. Qualcuno può aiutarmi a capire quali sono i seguenti tipi di filiali?

  • filiali locali
  • filiali di localizzazione locali
  • rami remoti
  • filiali di tracciamento remoto

Qual'è la differenza tra loro? E come lavorano l'uno con l'altro?

Un rapido codice demo sarà davvero utile, immagino.

Risposte:


123

Un ramo locale è un ramo che solo tu (l'utente locale) può vedere. Esiste solo sul tuo computer locale.

git branch myNewBranch        # Create local branch named "myNewBranch"

Un ramo remoto è un ramo in una posizione remota (nella maggior parte dei casi origin). È possibile inviare il ramo locale appena creato myNewBrancha origin. Ora altri utenti possono seguirlo.

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"

Un ramo di tracciamento remoto è una copia locale di un ramo remoto. Quando myNewBranchviene spinto a originutilizzare il comando sopra, origin/myNewBranchviene creato un ramo di tracciamento remoto denominato sul computer. Questo ramo di tracciamento remoto traccia il ramo remoto myNewBranchsu origin. Puoi aggiornare il tuo ramo di tracciamento remoto per essere sincronizzato con il ramo remoto usando git fetcho 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"

Un ramo di localizzazione locale è un ramo locale che sta monitorando un altro ramo. Questo è così che puoi spingere / tirare i commit verso / dall'altro ramo. Nella maggior parte dei casi i rami di localizzazione locali tengono traccia di un ramo di localizzazione remoto. Quando si spinge un ramo locale per originutilizzare l' opzione git push commandwith -u(come mostrato sopra), si imposta il ramo locale myNewBranchper tenere traccia del ramo di tracciamento remoto origin/myNewBranch. Questo è necessario per l'uso git pushe git pullsenza specificare un upstream da cui spingere o da cui estrarre.

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.

Per la definizione del ramo di tracciamento locale, non è lo stesso di un ramo locale dopo averlo spinto in remoto?
mskw,

2
@mskw No, un ramo di tracciamento locale e un ramo locale (non di tracciamento) differiscono per associazione. Un ramo locale NON è associato a nessun ramo. È semplicemente un ramo esistente sul tuo computer locale in isolamento. Un ramo di tracciamento locale è associato a un ramo di tracciamento remoto. Quindi puoi spingere / tirare i commit l'uno verso l'altro.
SNce,

196

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 mastersta monitorando il ramo di monitoraggio remoto origin/mastere il ramo locale new-featurenon 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 pulle 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 pullutilizza 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 remotecomando interroga la macchina remota sulla rete sui suoi rami. Non aggiorna i rami di tracciamento remoto sul tuo computer locale, usi git fetcho git pullper 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 --trackflag 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-kittye 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.


Vorrei usare per creare il ramo e andare al ramo in un cmd come: git checkout -b mynewbranch
Zeta

Ho adorato l'ultimo punto sulla differenza tra spazio e barra!
aderchox,

12

Filiale locale:

Una filiale sulla tua macchina su cui puoi lavorare e aggiungere commit. Puoi elencare questi rami con git branch.

Filiale locale (con tracciamento):

Un ramo locale ordinario configurato per corrispondere a un ramo remoto. Questo ha vantaggi come la capacità di git pulle git pushsenza dover specificare il repository e il nome del ramo. Il tracciamento inoltre git statusti informa quando la tua filiale è davanti o dietro il telecomando.

Filiale remota:

Semplicemente un ramo su un repository remoto, in genere su un server come GitHub ecc.

Filiale di tracciamento remoto:

Una copia locale di una filiale remota. Questo ramo non dovrebbe mai essere modificato. Il suo scopo è di tenere traccia dello stato corrente di un ramo remoto. I rami di tracciamento remoto possono essere visualizzati con git branch -re in genere assomigliano a origin/master(nome del repository seguito da una barra seguita dal nome del ramo). In esecuzione git fetchaggiornerà i rami di tracciamento remoto per riflettere lo stato dei rami remoti corrispondenti.

git branch -avvè il mio preferito personale per visualizzare una rapida panoramica di quali rami sono sulla mia macchina, quali rami sono sul telecomando e l'ultimo commit in ciascuno. La -aparte specifica che devono essere mostrati tutti i rami (remoti e locali). Il vsimbolo "alla fine" indica verboso (mostra l'ultimo hash e messaggio di commit). Grazie a @Flimm per aver sottolineato che il secondo vaggiunge informazioni su quale filiale locale sta monitorando quale telecomando.


1
non capisco la differenza tra localizzazione locale e filiali di localizzazione remota: la prima corrisponde all'origine e la seconda alla macchina remota. ma non sono la stessa cosa? non è solo il repository che di solito è su github?
Akantoword,

1
@akantoword Ho aggiornato la risposta per cercare di chiarire un po '. Fondamentalmente il ramo di tracciamento remoto è semplicemente una copia locale del ramo remoto che non è destinato a funzionare. Un ramo locale con rilevamento è per lavorare.
Eric Mathison
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.