O que é um ramo de rastreamento?

173

Alguém pode explicar um "ramo de rastreamento" como se aplica ao git?

Aqui está a definição de git-scm.com :

Uma 'ramificação de rastreamento' no Git é uma ramificação local conectada a uma ramificação remota. Quando você pressiona e puxa esse ramo, ele empurra e puxa automaticamente para o ramo remoto ao qual está conectado.

Use isso se você sempre puxa da mesma ramificação upstream para a nova ramificação e se não deseja usar "git pull" explicitamente.

Infelizmente, sendo novo no git e vindo do SVN, essa definição não faz absolutamente nenhum sentido para mim.

Estou lendo o " Guia Pragmático do Git " (ótimo livro, por sinal), e eles parecem sugerir que rastrear ramificações é uma coisa boa e que, depois de criar seu primeiro controle remoto (origem, neste caso), você deve configure sua ramificação principal para ser uma ramificação de rastreamento, mas infelizmente não cobre por que uma ramificação de rastreamento é uma coisa boa ou quais os benefícios que você obtém ao configurar sua ramificação principal para ser uma ramificação de rastreamento do seu repositório de origem .

Alguém pode me esclarecer (em inglês)?

jerhinesmith
fonte
6
Uma nota de terminologia: a palavra faixa , no Git, está muito sobrecarregada. Alguns arquivos são rastreados e outros não são rastreados ; alguns nomes de ramificações são chamados ramificações de rastreamento remoto; e você pode usar a --trackopção para criar uma ramificação (local) que tenha uma dessas ramificações de rastreamento remoto definidas como upstream . A terminologia evoluiu um pouco entre 2006 e 2019, então pessoas diferentes podem às vezes significar algo diferente para cada uma dessas palavras.
Torek 19/04/19
Pessoalmente, recomendo usar a frase nomes de rastreamento remoto no lugar de ramificações de rastreamento remoto , em parte porque a palavra ramificação também está sobrecarregada. Os nomes de rastreamento remoto são os seguintes origin/master: eles estão no seu repositório, mas são a maneira de o Git lembrar os nomes das ramificações, como visto em outro repositório Git em origin. Se você usar a palavra a montante , que é o termo mais moderno, para dizer que a sua mastertem origin/masterdefinido como o seu montante , você pode evitar toda a confusão esta terminologia.
Torek 19/04/19

Respostas:

141

O livro do ProGit tem uma explicação muito boa :

Rastreando Ramos

Marcar uma filial local a partir de uma filial remota cria automaticamente o que é chamado de filial de rastreamento. As ramificações de rastreamento são ramificações locais que têm um relacionamento direto com uma ramificação remota. Se você estiver em um ramo e tipo de rastreamento git push, o Git saberá automaticamente em qual servidor e ramo enviar. Além disso, executandogit pull enquanto estiver em uma dessas ramificações buscará todas as referências remotas e será mesclada automaticamente na ramificação remota correspondente.

Quando você clona um repositório, ele geralmente cria automaticamente uma ramificação mestre que rastreia a origem / mestre. É por isso que git pushe git pulltrabalha fora da caixa sem outros argumentos. No entanto, você pode configurar outros ramos de rastreamento, se desejar - aqueles que não rastreiam ramos na origem e não rastreiam o ramo mestre. O caso simples é o exemplo que você acabou de ver, executando git checkout -b [branch] [remotename]/[branch]. Se você possui o Git versão 1.6.2 ou posterior, também pode usar a --trackabreviação:

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

Para configurar uma filial local com um nome diferente da filial remota, você pode facilmente usar a primeira versão com um nome de filial local diferente:

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

Agora, sua filial local sfirá automaticamente empurrar para e retirar origin/serverfix.

BÔNUS: git statusinformações extras

Com um ramo de rastreamento, git statusvocê saberá a que distância está do seu ramo de rastreamento - útil para lembrá-lo de que você ainda não efetuou as alterações! Se parece com isso:

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

ou

$ 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)

Assaf Lavie
fonte
21
Só queria esclarecer isso: "Verificar uma ramificação local a partir de uma ramificação remota cria automaticamente o que é chamado de ramificação de rastreamento". Isso é enganador. Sem a opção --track, qualquer ramificação criada não será rastreada.
Johno
@ JohnO, pode querer levar isso com o cara do Pro Git. O livro inteiro é resultado de uma colaboração massiva de edição IIRC.
Assaf Lavie
2
@ JohnO, de acordo com: sbf5.com/~cduan/technical/git/git-4.shtml --track está ativado por padrão e, portanto, não é necessário.
Hank Lin
50

Abaixo estão minhas notas pessoais de aprendizado sobre as filiais de rastreamento do GIT, espero que sejam úteis para futuros visitantes:

insira a descrição da imagem aqui insira a descrição da imagem aqui insira a descrição da imagem aqui insira a descrição da imagem aqui insira a descrição da imagem aqui insira a descrição da imagem aqui


Rastreando ramos e "git fetch":

insira a descrição da imagem aqui insira a descrição da imagem aqui insira a descrição da imagem aqui

hagrawal
fonte
Obrigado pelas anotações! Você se importaria de compartilhar todos eles, se possível? Obrigado;
Aditya
@ Aditya: Esta pergunta é para rastrear filiais e eu publiquei todas as minhas anotações sobre este tópico. Se eu encontrar alguma outra pergunta relevante em que eu possa postar minhas outras anotações do GIT, ficarei feliz em fazê-lo.
hagrawal 22/06
Obrigado! O que eu quis dizer foi postá-los em seu blog ou algo assim :). Mais uma vez obrigado por boas notas!
Aditya
@ Aditya: Ah, entendo. Agora você está claro sobre o que você quer dizer. Estou atrasado no meu site, ainda para criar um para mim.
hagrawal 22/06
43

O livro Pro Git menciona :

As ramificações de rastreamento são ramificações locais que têm um relacionamento direto com uma ramificação remota

Não exatamente. A questão do SO " Tendo dificuldade em entendergit-fetch " inclui:

Não existe esse conceito de ramificações de rastreamento local , apenas ramificações de rastreamento remoto .
O mesmo origin/masterocorre com um ramo de rastreamento remoto masterno originrepositório.

Mas, na verdade, depois de estabelecer um relacionamento de filial upstream entre:

  • uma filial local como master
  • e um ramo de rastreamento remoto como origin/master

Em seguida, você pode considerar mastercomo um ramo de rastreamento local : rastreia o ramo de rastreamento remoto origin/master que, por sua vez, rastreia o ramo principal do repositório upstream origin .

texto alternativo

VonC
fonte
Esclarecimento da imagem: Meu computador tem 2 confirmações antes da origem. É de onde vêm esses dois commits fora do mestre. Imagem: progit.org/book/ch3-5.html
idbrii
Estou interpretando corretamente: se eu tiver localmente controles remotos definidos para origem e upstream, meu ramo mestre local rastreará a origem diretamente e upstream indiretamente? por exemplo: quando git statusreceberei uma mensagem de rastreamento de confirmação com relação aos repositórios de origem e upstream? (Instalação: clonei o repo de alguém localmente, levei meu clone para um novo repo na minha conta do GitHub e defina localmente os controles remotos de origem e upstream para o meu repo do github e o repo clonado, respectivamente).
3051717 SherylHohman
3
@ SherylHohman Não: uma filial local não rastreia nada "diretamente" ou "indiretamente". Ele rastreará o ramo de rastreamento remoto que você atribuirá a ele. No caso de uma bifurcação, a melhor prática é rastrear a montante (o repositório original) para ramificações comuns (como mestre) e rastrear a origem (sua bifurcação remota) para novas ramificações (seu PR ou ramificações de recursos): consulte stackoverflow.com/ a / 21847690/6309
VonC
2
@VonC - A declaração "Não existe esse conceito de ramificações de rastreamento local, apenas ramificações de rastreamento remoto". é interessante porque existe uma terminologia tão conflitante em relação às filiais. Esse link frequentemente referenciado web.archive.org/web/20130419172453/http://www.gitguys.com/… distingue entre "ramos de rastreamento" e "ramos de rastreamento remoto". Eles chamam origem / mestre de "ramificação de rastreamento remoto" - eu concordo -, mas também chamam "mestre" de "ramificação de rastreamento". O que é o rastreamento mestre? Eles estão errados ou é um problema de terminologia?
precisa saber é o seguinte
2
@Howiecamp, o que eles chamam de "filial de rastreamento chamada mestre" é simplesmente um mestre de filial local com uma origem / mestre de filial de rastreamento remoto associada, aqui para memorizar o último SHA1 buscado desde a origem em relação à sua ramificação mestre remota. Portanto, é um "atalho" para designar "uma filial local com uma filial upstream"
VonC 4/17/17
7

Foi assim que adicionei um ramo de rastreamento para que eu possa puxá-lo para o meu novo ramo:

git branch --set-upstream-to origin/Development new-branch
agrublev
fonte