Che cos'è un ramo di tracciamento?


173

Qualcuno può spiegare un "ramo di tracciamento" come si applica a Git?

Ecco la definizione da git-scm.com :

Un "ramo di tracciamento" in Git è un ramo locale collegato a un ramo remoto. Quando si spinge e si tira su quel ramo, si spinge e si tira automaticamente sul ramo remoto a cui è collegato.

Usa questo se tiri sempre dallo stesso ramo a monte nel nuovo ramo e se non vuoi usare esplicitamente "git pull".

Sfortunatamente, essendo nuovo a git e proveniente da SVN, questa definizione non ha assolutamente senso per me.

Sto leggendo " La guida pragmatica a Git " (ottimo libro, a proposito), e sembrano suggerire che i rami di tracciamento sono una buona cosa e che dopo aver creato il tuo primo telecomando (origine, in questo caso), dovresti impostare il ramo principale come ramo di tracciamento, ma sfortunatamente non copre il motivo per cui un ramo di tracciamento è una buona cosa o quali vantaggi si ottengono impostando il ramo principale come ramo di tracciamento del repository di origine .

Qualcuno può illuminarmi (in inglese) per favore?


6
Una nota terminologica: la parola track , in Git, è molto gravemente sovraccarica. Alcuni file vengono tracciati e altri non tracciati ; alcuni nomi di rami sono chiamati rami di tracciamento remoto; e puoi utilizzare l' --trackopzione per creare un ramo (locale) che ha uno di questi rami di tracciamento remoto impostato come upstream . La terminologia si è evoluta in qualche modo tra il 2006 e il 2019, quindi persone diverse a volte possono significare qualcosa di diverso da ciascuna di queste parole.
Torek,

Personalmente raccomando di usare la frase nomi di localizzazione remota al posto dei rami di localizzazione remota , in parte perché anche la parola ramo è piuttosto sovraccarica. I nomi di tracciamento remoto sono quelli che sembrano origin/master: sono nel tuo repository, ma sono il modo in cui il tuo Git ricorda i nomi dei rami come visto in altri repository Git su origin. Se quindi si utilizza la parola a monte , che è il termine più moderno, per dire che il vostro masterè origin/masterposta come a monte , è possibile evitare ogni confusione questa terminologia.
Torek,

Risposte:


141

Il libro ProGit ha un'ottima spiegazione :

Tracciamento dei rami

Il check out di un ramo locale da un ramo remoto crea automaticamente quello che viene chiamato un ramo di tracciamento. Le filiali di tracciamento sono filiali locali che hanno una relazione diretta con una filiale remota. Se utilizzi una diramazione e un tipo di tracciamento git push, Git sa automaticamente su quale server e filiale puntare. Inoltre, l'esecuzione git pullsu uno di questi rami recupera tutti i riferimenti remoti e quindi si unisce automaticamente al ramo remoto corrispondente.

Quando si clona un repository, in genere crea automaticamente un ramo principale che tiene traccia dell'origine / principale. Ecco perché git pushe git pulllavorare fuori dagli schemi senza altri argomenti. Tuttavia, puoi impostare altri rami di tracciamento, se lo desideri, quelli che non tengono traccia dei rami sull'origine e non tengono traccia del ramo principale. Il semplice caso è l'esempio che hai appena visto, in esecuzione git checkout -b [branch] [remotename]/[branch]. Se hai Git versione 1.6.2 o successive, puoi anche usare la --trackscorciatoia:

$ git checkout --track origin/serverfix
Branch serverfix set up to track remote branch refs/remotes/origin/serverfix.
Switched to a new branch "serverfix"

Per impostare un ramo locale con un nome diverso rispetto al ramo remoto, è possibile utilizzare facilmente la prima versione con un nome di ramo locale diverso:

$ git checkout -b sf origin/serverfix
Branch sf set up to track remote branch refs/remotes/origin/serverfix.
Switched to a new branch "sf"

Ora, la tua filiale locale sfsi sposterà e rimuoverà automaticamente da origin/serverfix.

BONUS: git statusinformazioni extra

Con un ramo di monitoraggio, git statusti dirà se sei lontano dal ramo di monitoraggio: utile per ricordarti che non hai ancora inviato le modifiche! Sembra così:

$ git status
On branch master
Your branch is ahead of 'origin/master' by 1 commit.
  (use "git push" to publish your local commits)

o

$ git status
On branch dev
Your branch and 'origin/dev' have diverged,
and have 3 and 1 different commits each, respectively.
  (use "git pull" to merge the remote branch into yours)


21
Volevo solo chiarire questo: "Il check out di un ramo locale da un ramo remoto crea automaticamente quello che viene chiamato un ramo di tracciamento". Questo è fuorviante. Senza l'opzione --track qualsiasi ramo che crei non monitorerà.
JohnO

@JohnO, potrebbe volerlo prendere con il ragazzo Pro Git. L'intero libro è il risultato della massiccia collaborazione di redazione IIRC.
Assaf Lavie,

2
@ JohnO, secondo: sbf5.com/~cduan/technical/git/git-4.shtml - la traccia è attiva di default e quindi non è necessaria.
Hank Lin,

50

Di seguito sono riportate le mie note di apprendimento personali sui rami di tracciamento GIT, speriamo che sia utile per i futuri visitatori:

inserisci qui la descrizione dell'immagine inserisci qui la descrizione dell'immagine inserisci qui la descrizione dell'immagine inserisci qui la descrizione dell'immagine inserisci qui la descrizione dell'immagine inserisci qui la descrizione dell'immagine


Tracciamento di rami e "git fetch":

inserisci qui la descrizione dell'immagine inserisci qui la descrizione dell'immagine inserisci qui la descrizione dell'immagine


Grazie per le note! Ti dispiacerebbe condividerli tutti se possibile? Grazie;
Aditya,

@Aditya: questa domanda è per il monitoraggio delle filiali e ho pubblicato tutte le mie note su questo argomento. Se trovo qualche altra domanda pertinente in cui posso pubblicare le mie altre note GIT, sarò felice di farlo.
hagrawal,

Grazie! Quello che volevo dire era pubblicarli sul tuo blog o qualcosa di simile :). Grazie ancora per le belle note!
Aditya,

@Aditya: Ah, capisco. Ora sei chiaro su cosa intendi. Sto correndo indietro sul mio sito Web, ma ancora per crearne uno per me stesso.
hagrawal,

43

Il libro Pro Git menziona :

Le filiali di tracciamento sono filiali locali che hanno una relazione diretta con una filiale remota

Non esattamente. La domanda SO " Avere difficoltà a comprenderegit-fetch " include:

Non esiste un simile concetto di filiali di localizzazione locali , solo filiali di localizzazione remote .
Quindi origin/masterè un ramo di tracciamento remoto per masternel originrepository.

Ma in realtà, una volta stabilita una relazione di diramazione a monte tra:

  • una filiale locale come master
  • e un ramo di tracciamento remoto come origin/master

Quindi puoi considerare masterun ramo di tracciamento locale : tiene traccia del ramo di tracciamento remoto origin/master che, a sua volta, tiene traccia del ramo principale del repository a monte origin .

testo alternativo


Chiarimento dell'immagine: Risorse del computer 2 impegna prima dell'origine. Ecco da dove vengono quei due commessi fuori dal maestro. Immagine: progit.org/book/ch3-5.html
idbrii

Sto interpretando correttamente: se localmente ho impostato telecomandi per origine e upstream, il mio ramo principale locale traccerà l'origine direttamente e indirettamente a monte? ad esempio: quando git statusriceverò un messaggio di tracciamento del commit rispetto sia ai repository di origine sia a quelli a monte? (Settup: ho clonato il repository di qualcuno localmente, ho spinto il mio clone in un nuovo repository sul mio account GitHub e ho impostato localmente i telecomandi upstream e di origine sul mio repository github e sul repository clonato clonato rispettivamente).
SherylHohman,

3
@SherylHohman No: una filiale locale non traccia nulla "direttamente" o "indirettamente". Traccia il ramo di localizzazione remoto che gli verrà assegnato. Nel caso di un fork, la migliore pratica è quella di tracciare a monte (il repository originale) per i rami comuni (come master) e tenere traccia dell'origine (il fork remoto) per i nuovi rami (i rami PR o delle funzioni): vedere stackoverflow.com/ a / 21847690/6309
VonC,

2
@VonC - L'affermazione "Non esiste un simile concetto di filiali di localizzazione locali, solo filiali di localizzazione remote". è interessante b / c c'è una terminologia così contrastante intorno ai rami. Questo link spesso referenziato web.archive.org/web/20130419172453/http://www.gitguys.com/… distingue tra "rami di tracciamento" e "rami di tracciamento remoto". Chiamano origin / master un "ramo di tracciamento remoto" - sono d'accordo - ma poi chiamano "master" anche un "ramo di tracciamento". Che cos'è il monitoraggio principale? Hanno torto o è un problema di terminologia?
Howiecamp,

2
@Howiecamp quello che chiamano un "ramo di tracciamento chiamato master" è semplicemente un master di filiale locale con origine / master di un ramo di tracciamento remoto associato, qui per memorizzare l'ultimo SHA1 recuperato dall'origine rispetto al suo ramo master remoto. Quindi è una "scorciatoia" per designare "un ramo locale con un ramo a monte"
VonC

7

È stato così che ho aggiunto un ramo di tracciamento in modo da poterlo estrarre nel mio nuovo ramo:

git branch --set-upstream-to origin/Development new-branch
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.