Quais são as diferenças entre filial local, filial de rastreamento local, filial remota e filial de rastreamento remoto?

158

Comecei a usar o Git e fiquei realmente confuso entre diferentes ramos. Alguém pode me ajudar a descobrir quais são os seguintes tipos de ramificações?

  • filiais locais
  • filiais locais de rastreamento
  • filiais remotas
  • filiais de rastreamento remoto

Qual a diferença entre eles? E como eles trabalham um com o outro?

Um rápido código de demonstração será realmente útil, eu acho.

afiado
fonte

Respostas:

123

Uma ramificação local é uma ramificação que somente você (o usuário local) pode ver. Existe apenas na sua máquina local.

git branch myNewBranch        # Create local branch named "myNewBranch"

Uma filial remota é uma filial em um local remoto (na maioria dos casos origin). Você pode enviar a ramificação local recém-criada myNewBranchpara origin. Agora outros usuários podem rastreá-lo.

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"

Uma filial de rastreamento remoto é uma cópia local de uma filial remota. Quando você myNewBranchpressiona origino comando acima, uma ramificação de rastreamento remoto chamada origin/myNewBranché criada em sua máquina. Este ramo de rastreamento remoto acompanha o ramo remoto myNewBranchem origin. Você pode atualizar sua filial de rastreamento remoto para estar sincronizada com a filial remota usando git fetchou 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"

Uma ramificação de rastreamento local é uma ramificação local que está rastreando outra ramificação. Isso é para que você possa enviar / enviar confirmações de / para o outro ramo. As ramificações de rastreamento local na maioria dos casos rastreiam uma ramificação de rastreamento remoto. Ao enviar uma ramificação local para originusar a opção git push commandwith -u(como mostrado acima), você configura a ramificação local myNewBranchpara rastrear a ramificação de rastreamento remoto origin/myNewBranch. Isso é necessário para usar git pushe git pullsem especificar um upstream para empurrar ou puxar.

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.
SNce
fonte
Para a definição de filial de rastreamento local, não é o mesmo que uma filial local depois de enviá-la para remoto?
mskw
2
@mskw Não, uma filial local de rastreamento e uma filial local (sem rastreamento) diferem na associação. Uma filial local NÃO está associada a nenhuma filial. É simplesmente uma filial existente em sua máquina local isoladamente. Uma filial de rastreamento local está associada a uma filial de rastreamento remoto. Assim, você pode pressionar / puxar confirmações de uma para a outra.
SNCE
196

Aqui está a resposta longa.

Remotos:

Se você estiver usando o Git de forma colaborativa, provavelmente precisará sincronizar suas confirmações com outras máquinas ou locais. Cada máquina ou local é chamado de remoto , na terminologia do Git, e cada um pode ter uma ou mais ramificações. Na maioria das vezes, você terá apenas um, nomeado origin. Para listar todos os controles remotos, execute git remote:

$ git remote
bitbucket
origin

Você pode ver para quais locais esses nomes remotos são atalhos, executando git remote -v:

$ git remote -v
bitbucket [email protected]:flimm/example.git (fetch)
bitbucket [email protected]:flimm/example.git (push)
origin [email protected]:Flimm/example.git (fetch)
origin [email protected]:Flimm/example.git (push)

Cada controle remoto tem um diretório em git/refs/remotes/:

$ ls -F .git/refs/remotes/
bitbucket/ origin/

Ramos em sua máquina:

TLDR: na sua máquina local, você tem três tipos de ramificações: ramificações locais sem rastreamento, ramificações locais e ramificações de rastreamento remoto. Em uma máquina remota, você tem apenas um tipo de ramificação.

1. Agências locais

Você pode visualizar uma lista de todas as filiais locais em sua máquina executando git branch:

$ git branch
master
new-feature

Cada filial local tem um arquivo em .git/refs/heads/:

$ ls -F .git/refs/heads/
master new-feature

Existem dois tipos de filiais locais em sua máquina: filiais locais sem rastreamento e filiais locais.

1.1 Agências locais sem rastreamento

As ramificações locais sem rastreamento não estão associadas a nenhuma outra ramificação. Você cria um executando git branch <branchname>.

1.2 Rastreando filiais locais

As ramificações locais de rastreamento estão associadas a outra ramificação, geralmente uma ramificação de rastreamento remoto. Você cria um executando git branch --track <branchname> [<start-point>].

Você pode visualizar qual de suas filiais locais está rastreando filiais usando git branch -vv:

$ git branch -vv
master      b31f87c85 [origin/master] Example commit message
new-feature b760e04ed Another example commit message

Na saída deste comando, você pode ver que a ramificação local masterestá rastreando a ramificação de rastreamento remoto origin/mastere a ramificação local new-featurenão está rastreando nada.

Outra maneira de ver quais filiais estão rastreando filiais é observando .git/config.

O rastreamento de filiais locais é útil. Eles permitem que você execute git pulle git push, sem especificar qual ramificação upstream usar. Se o ramo não estiver configurado para rastrear outro ramo, você receberá um erro como este:

$ 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. Filiais de rastreamento remoto (ainda em sua máquina)

Você pode visualizar uma lista de todas as ramificações de rastreamento remoto em sua máquina executando git branch -r:

$ git branch -r
bitbucket/master
origin/master
origin/new-branch

Cada ramificação de rastreamento remoto tem um arquivo em .git/refs/<remote>/:

$ tree -F .git/refs/remotes/
.git/refs/remotes/
├── bitbucket/
│   └── master
└── origin/
    ├── master
    └── new-branch

Pense em suas ramificações de rastreamento remoto como seu cache local para o que as máquinas remotas contêm. Você pode atualizar suas ramificações de rastreamento remoto usando git fetch, que é git pullusado nos bastidores.

Mesmo que todos os dados de uma ramificação de rastreamento remoto sejam armazenados localmente em sua máquina (como um cache), ela ainda nunca é chamada de ramificação local. (Pelo menos, eu não chamaria assim!) É apenas chamado de ramo de rastreamento remoto.

Ramos em uma máquina remota:

Você pode visualizar todas as ramificações remotas (ou seja, as ramificações na máquina remota), executando git remote show <remote>:

$ git remote show origin
* remote origin
  Fetch URL: [email protected]:Flimm/example.git
  Push  URL: [email protected]: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)

Este git remotecomando consulta a máquina remota pela rede sobre suas ramificações. Ele não atualiza as ramificações de rastreamento remoto na sua máquina local, use git fetchou git pullpara isso.

Na saída, você pode ver todas as ramificações que existem na máquina remota, olhando sob o título "Ramificações remotas" (ignore as linhas marcadas como "obsoletas").

Se você pudesse efetuar login na máquina remota e encontrar o repositório no sistema de arquivos, consulte todas as suas ramificações em refs/heads/.

Folha de dicas:

  • Para excluir uma filial local, seja de rastreamento ou não, com segurança:

    git branch -d <branchname>
    
  • Para excluir uma filial local, seja de rastreamento ou não de rastreamento, com força:

    git branch -D <branchname>
    
  • Para excluir uma ramificação de rastreamento remoto:

    git branch -rd <remote>/<branchname>
    
  • Para criar uma nova ramificação local sem rastreamento:

    git branch <branchname> [<start-point>]
    
  • Para criar um novo ramo de rastreamento local: (Observe que, se <start-point>especificado e for um ramo de rastreamento remoto origin/foobar, o --tracksinalizador será incluído automaticamente)

    git branch --track <branchname> [<start-point]
    

    Exemplo:

    git branch --track hello-kitty origin/hello-kitty
    
  • Para excluir uma ramificação em uma máquina remota:

    git push --delete <remote> <branchname>
    
  • Para excluir todas as ramificações de rastreamento remoto obsoletas, ou seja, onde as ramificações correspondentes na máquina remota não existem mais:

    git remote prune <remote>
    

Você deve ter notado que em alguns comandos você usa <remote>/<branch>e outros comandos <remote> <branch>. Exemplos: git branch origin/hello-kittye git push --delete origin hello-kitty.

Pode parecer arbitrário, mas existe uma maneira simples de lembrar quando usar uma barra e quando usar um espaço. Quando você está usando uma barra, está se referindo a uma ramificação de rastreamento remoto em sua própria máquina, enquanto que quando está usando um espaço, na verdade, está lidando com uma ramificação em uma máquina remota pela rede.

Flimm
fonte
Gostaria de usar para criar ramo e ir para o ramo em um cmd como: git checkout -b mynewbranch
Zeta
Adorei o último ponto da diferença entre o espaço e a barra!
aderchox 19/07
12

Filial local:

Uma filial em sua máquina na qual você pode trabalhar e adicionar confirmações. Você pode listar esses ramos com git branch.

Filial local (com rastreamento):

Uma filial local comum configurada para corresponder a uma filial remota. Isso tem benefícios como a capacidade de git pulle git pushsem a necessidade de especificar o repositório e o nome da ramificação. O rastreamento também git statusinforma quando a filial está à frente ou atrás do controle remoto.

Filial remota:

Simplesmente uma ramificação em um repositório remoto - normalmente em um servidor como o GitHub etc.

Filial de rastreamento remoto:

Uma cópia local de uma filial remota. Este ramo nunca deve ser editado. Seu objetivo é acompanhar o estado atual de uma filial remota. As ramificações de rastreamento remoto podem ser visualizadas com git branch -re geralmente se parecem com origin/master(nome do repo seguido de uma barra seguida pelo nome da ramificação). A execução git fetchatualizará as ramificações de rastreamento remoto para refletir o estado das ramificações remotas correspondentes.

git branch -avvé o meu favorito para exibir uma visão geral rápida de quais ramificações estão em minha máquina, quais ramificações estão no controle remoto e a confirmação mais recente em cada uma. A -aparte especifica que todas as ramificações devem ser mostradas (remota e local). Os vno final representam verboso (mostra o último hash e mensagem de confirmação). Agradecemos ao @Flimm por salientar que o segundo vadiciona informações sobre qual filial local está rastreando qual remoto.

Eric Mathison
fonte
1
não entendo a diferença entre o rastreamento local e os ramos de rastreamento remoto - o primeiro corresponde à origem e o segundo à máquina remota. mas não são a mesma coisa? não é apenas o repositório que geralmente está no github?
Akantoword # 25/16
1
@akantoword Atualizei a resposta para tentar esclarecer um pouco. Basicamente, o ramo de rastreamento remoto é simplesmente uma cópia local da filial remota que não se destina a trabalhar em uma filial local com rastreamento é para trabalhar..
Eric Mathison