Acho que estou no caminho certo para entender os conceitos básicos do git.
Eu já configurei e clonei um repositório remoto. Também criei um repositório vazio do lado do servidor e vinculei meu repositório local a ele.
Meu problema é que não entendo a diferença entre:
- origem / mestre vs. controles remotos / origem / mestre
Tanto quanto eu entendi, o mestre é uma filial local e os controles remotos / origem / mestre são remotos.
Mas o que exatamente é origem / mestre ?
git
git-remote
John Rumpel
fonte
fonte
.git/refs/origin/master
alguma vez se afastou.git/refs/remotes/origin/master
? Isso está acontecendo comigo agora e estou sendo expulso.Respostas:
Pegue um clone de um repositório remoto e execute
git branch -a
(para mostrar todos os ramos que o git conhece). Provavelmente será algo parecido com isto:Aqui
master
está uma ramificação no repositório local.remotes/origin/master
é uma ramificação nomeadamaster
no controle remoto nomeadoorigin
. Você pode se referir a isso comoorigin/master
:Você também pode se referir a ele como
remotes/origin/master
:Essas são apenas duas maneiras diferentes de se referir à mesma coisa (aliás, esses dois comandos significam "mostre-me as alterações entre a
master
filial remota e minhamaster
filial).remotes/origin/HEAD
é odefault branch
para o controle remoto nomeadoorigin
. Isso permite que você simplesmente diga emorigin
vez deorigin/master
.fonte
git branch -a
mostrar o ramo remoto comoremotes/origin/master
é parcialmente porque o ref subjacente é armazenado.git/refs/remotes/origin
(se não tiver sido compactado). Na minha opinião, a saída degit branch -a
poderia ser muito mais clara, talvez separando o nome do controle remoto do nome do ramo com algo diferente de uma barra.git branch -r
, que deve mostrar apenas ramificações remotas, mostrará a ramificação apenasorigin/master
porque oremotes/
prefixo não é necessário.git log
que vejocommit fa9sd8jasdf98 (HEAD -> master)
, o que isso significa? O que é HEAD neste caso? Eu pensei que era atualmente "mestre" e estava me comprometendoorigin/master
. Acho que misturei algo, alguém poderia ajudar a se acalmar? EDIT UPDATE: Eu acho que entendi, é correto supor que HEAD atualmente esteja apontando para o ramo principal, o que significa que estou atualmente no processo de se comprometer com o master?Resposta curta para bonecos como eu (roubados da Torek):
fonte
Tecnicamente não há realmente nenhum "remota" coisas em tudo 1 em sua repo Git, existem apenas nomes locais que devem corresponder aos nomes na outra, repo diferente. Os nomeados
origin/whatever
inicialmente corresponderão aos do repositório que você clonou:faz uma cópia local do outro repositório. Ao longo do caminho, ele anota todos os ramos que estavam lá, e os confirma, e os coloca no seu repositório local sob os nomes
refs/remotes/origin/
.Dependendo de quanto tempo você preceder
git fetch
ou equivalente para atualizar "minha cópia do que está em algum lugar.onde.está lá", eles podem mudar de ramo, criar novos e excluir alguns. Quando você faz o seugit fetch
(ou ogit pull
que é realmente buscar mais mesclar), seu repositório fará cópias de seu novo trabalho e alterará todas asrefs/remotes/origin/<name>
entradas conforme necessário. É esse momentofetch
que faz tudo coincidir (bem, isso e o clone inicial, e alguns casospush
também - basicamente sempre que o Git tem a chance de verificar), mas veja a advertência abaixo).Normalmente, o Git faz com que você se refira ao seu
refs/heads/<name>
como justo<name>
, e aos remotos comoorigin/<name>
, e tudo funciona porque é óbvio qual é qual. Às vezes é possível criar seus próprios nomes de ramificações que não tornam óbvias, mas não se preocupe com isso até que isso aconteça. :-) Apenas dê ao Git o nome mais curto que o torne óbvio, e ele irá a partir daí:origin/master
é "onde o mestre esteve lá na última vez que verifiquei" emaster
é "onde o mestre está aqui com base no que tenho feito" . Executegit fetch
para atualizar o Git em "onde o mestre está lá", conforme necessário.Advertência: nas versões do Git anteriores à 1.8.4,
git fetch
existem alguns modos que não atualizam "onde o mestre está lá" (mais precisamente, modos que não atualizam nenhuma ramificação de rastreamento remoto). Corrergit fetch origin
ougit fetch --all
mesmo a atualizaçãogit fetch
, é atualizada. Corrergit fetch origin master
não . Infelizmente, este modo "não atualiza" é acionado por comumgit pull
. (Isso é apenas um pequeno aborrecimento e é corrigido no Git 1.8.4 e posterior.)1 Bem, há uma coisa que é chamada de "remoto". Mas isso também é local! O nome
origin
é o que o Git chama de "um controle remoto". É basicamente apenas um nome abreviado para o URL usado quando você clonou. É também de onde vem oorigin
inorigin/master
. O nomeorigin/master
é chamado de ramificação de rastreamento remoto , que às vezes é reduzido para "ramificação remota", especialmente em documentação mais antiga ou mais informal.fonte
origin/master
adesivo nolocal
gráfico do repositório, e não noremote
(recomendo de todo o coração a apresentação "Git Happens" de Jessica Kerr para pessoas novas emgit
: vimeo.com/46010208 . Estava coçando a cabeça entre as 30:00 e as 30: 30: 19.)Eu tentaria simplificar a resposta de @ ErichBSchulz para iniciantes:
fonte
last time I've checked
perde ponto importante #$ git remote add origin https://github.com/git/git.git
--- Você executará este comando para vincular seu projeto do github à origem. Aqui a origem é definida pelo usuário. Você pode renomeá-lo$ git remote rename old-name new-name
$ git fetch origin
- Faz o download de objetos e referências do repositório remoto para o seu computador local [origem / mestre]. Isso significa que ele não afetará sua ramificação principal local, a menos que você as junte usando$ git merge origin/master
. Lembre-se de fazer o checkout do ramo correto onde você precisa mesclar antes de executar este comandoNota: O conteúdo buscado é representado como uma ramificação remota. Buscar permite que você revise as alterações antes de integrá-las à sua cópia do projeto. Para mostrar alterações entre a sua e a remota
$git diff master..origin/master
fonte
Um esclarecimento (e um ponto que me confundiu):
"controles remotos / origem / HEAD é o ramo padrão" não está realmente correto.
controles remotos / origem / mestre era a ramificação padrão no repositório remoto (última vez que você verificou). HEAD não é um ramo, apenas aponta para um ramo.
Pense em HEAD como sua área de trabalho. Quando você pensa dessa maneira, o 'git checkout branchname' faz sentido em relação à alteração dos arquivos da área de trabalho para que sejam de um ramo específico. Você "faz o checkout" dos arquivos da filial em sua área de trabalho. HEAD para todos os fins práticos é o que é visível para você na sua área de trabalho.
fonte
HEAD
é um "ponteiro para uma ramificação" (o arquivo real em seu repositório local geralmente contém a stringref: refs/heads/master
, por exemplo ... a menos que seja "desanexada", o que é outra coisa totalmente diferente). No entanto, há um tipo de bug na maneira comoclone
interpreta o "HEAD remoto": os protocolos de transferência não podem enviar uma ramificação indireta, apenas um SHA-1 bruto, então o git tem um kludge que faz com que "principalmente funcione". De vez em quando alguém se depara com um caso estranho. I tipo de git desejo não criarremotes/origin/HEAD
em tudo, especialmente quando ele sai errado ...Acho que essa notação de barra do Git provavelmente é melhor entendida olhando dentro da sua
.git
pasta.Por exemplo, aqui está uma árvore um pouco abreviada do meu .git para a base de origem do LibreOffice.
No linux
sudo apt-get install tree
é útil ver isso.No Windows , acho que o
tree
comando ainda pode funcionar.Role para baixo e dê uma olhada em refs (aka 'referências') na parte inferior:
Poderia ter sido menos confuso se fosse definido dessa maneira, mas não era:
Temos três tipos básicos de referências: cabeças , controles remotos e tags .
.git / refs / heads detém nosso mestre local .
.git / refs / remotes pode conter vários controles remotos, embora no momento só tenhamos origem nele.
.git / refs / tags (discutido em outro lugar).
origem , portanto, é o nosso único e remoto. Possui origem / mestre .
Descobrimos que temos 2 HEADS (ponteiros para ramificações atuais), um local e um remoto:
Se você listar suas filiais :
Em seguida, você pode ter muitas ramificações de rastreamento remoto, e fazemos aqui. Você sabe que essas são ramificações de rastreamento remoto porque são prefixadas com ' remotes / '. Os mostrados aqui são para a origem nomeada remota.
Portanto, a segunda linha é o ponteiro de ramificação atual da origem . Remotos / origem: HEAD - aponta para -> mestre. Isso mostra que no repositório remoto, a ramificação atual é a ramificação denominada master (não deve ser confundida com a ramificação local denominada master ).
Os ramos restantes não foram encontrados no seu .git / refs / tree, mas você os encontrará no
.git/packed-refs
.Quando git fetch alterações do repositório remoto para o repositório de rastreamento remoto.
Quando nos unimos , mesclamos as alterações nesse repositório de rastreamento remoto local em nossas filiais ou filiais locais de trabalho, nesse caso em nossa filial principal.
(Quando fazemos o git pull , fazemos as duas etapas em uma operação.)
Também é interessante observar que esses UUIDs locais e remotos para mestre atualmente apontam para o mesmo nó (também conhecido como 'commit'):
Portanto, nosso mestre local aponta para o mesmo local que o mestre de origem do controle remoto:
Por fim, acho que também é útil dar uma olhada
.git/packed-refs
Sem dúvida, isso deixa mais perguntas do que respostas, mas acho que pode começar a ajudá-lo a responder suas próprias perguntas sobre o que é o quê.
fonte