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 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)
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 master
está rastreando a ramificação de rastreamento remoto origin/master
e a ramificação local new-feature
nã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 pull
e 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 pull
usado 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: 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)
Este git remote
comando 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 fetch
ou git pull
para 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 --track
sinalizador 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-kitty
e 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.