O que os checkouts do git realmente significam?

93

O que está checkoutno git?

Eu sei que uma vez que você faz checkoutpara um determinado ramo, os HEADpontos para esse ramo. Mas o que isto realmente significa? Isso significa que posso trabalhar nesse ramo? Se sim, então, sem fazer check-out de um branch, não consigo trabalhar nele?

Além disso, o que remote checkoutsignifica? Como isso é útil?

Daehaai
fonte
1
Nenhuma tomada. Sim, eu tenho e me deparei com a teoria do que isso significa. ou seja, aponte para HEAD etc. Mas eu quero saber do ponto de vista do "código de verificação - faça alterações - verificação de entrada" ou é diferente?
daehaai
24
@antonijn - Eu tentei pesquisar a questão no Google - este é o primeiro resultado - meio triste porque, assim que cheguei aqui, vi que a questão estava fechada e essa atitude maluca que todo mundo tem - venho do TFS e eu estou começando a suspeitar que "Checkout" significa algo completamente diferente no GIT. Eu quero saber o que isso significa em git-land.
BrainSlugs83

Respostas:

57

Como você notou, HEADé um rótulo indicando onde você está na árvore de commits. Ele se move com você quando você muda de um commit para outro. git checkout <commit>é o mecanismo básico para mover-se na árvore de commits, movendo seu focus ( HEAD) para o commit especificado.

A confirmação pode ser especificado por qualquer um de uma série de maneiras, cometer hash nome de filial, nome tag, a sintaxe relativa ( HEAD^, HEAD~1, etc.) e assim por diante. Muitas vezes é útil considerar um checkout para alterar branches, e há algumas opções que funcionam a partir dessa perspectiva, mas todas fazem referência a commits.

Para fazer check-out, um commit tem alguns efeitos colaterais além da movimentação HEAD.

  • O diretório de trabalho é atualizado para o estado do commit em check-out.
  • se um nome de ramificação for especificado, o check-out tornará essa ramificação ativa. O branch ativo irá se mover junto com quaisquer novos commits que forem adicionados.
    • com a -bopção, um novo branch será criado com base no commit atual e então tornado ativo.
    • com a --trackopção o branch com check-out pode ser informado de um branch remoto
    • com a --orphanopção, um novo branch é criado (como com -b), mas não será baseado em nenhum commit existente.

Existem mais algumas opções, que você pode ler na página de manual do git checkout , todas elas giram em torno da movimentação de um commit para outro - apenas variando o efeito que o movimento tem além de mover HEAD.

David Culp
fonte
Portanto, parece que "checkout" significa algo completamente diferente (em comparação com o TFS de qualquer maneira - o equivalente do TFS seria "obter" um "changeset" específico). Que bom que pesquisei isso! - existe alguma constante mágica para "mais recente"? (no TFS é "T") - assim podemos apenas baixar a versão mais recente do código sem saber o rótulo "HEAD"?
BrainSlugs83
1
Se você está em um branch, o nome do branch é o último commit para aquele branch - se você não está em um branch, você está no último commit. Eu usaria o comando log para encontrar o commit mais recente no repositório sem levar em conta o branch e então mover manualmente para ele - mas tenho certeza que pode ser automatizado se necessário.
David Culp,
Sobre o último parágrafo: observe que git checkout <commit> <path>não muda ramos.
galath
Sua explicação não é errado, mas você se esqueceu de um caso muito importante (e potencialmente perigoso) uso: git checkout <path>.
Eric Duminil
24

Deixe-me explicar alguns casos de uso de checkout com arquivo, pasta e branches para que possa ser útil no entendimento.

Digamos que temos uma pasta chamada deve index.htmltambém Tudo é rastreado e o diretório de trabalho está limpo.

Se eu acidentalmente mudar o nome do arquivo index.htmle quiser desfazê-lo, simplesmente irei usá- git checkout index.htmllo para recuperar o estado do arquivo do repositório atualmente selecionado.

Agora se eu fiz alguma alteração na devpasta e quero recuperar isso. Eu posso usar, git checkout devmas e se já houver um branch nomeado em devvez de fazer check-out dessa pasta, ele puxará para baixo esse branch. Para evitar isso, prefiro fazer git checkout -- dev.

Agora aqui o traço duplo vazio representa o branch atual e pede ao git a pasta devdo branch atualmente selecionado.

Da mesma forma, se eu fizer git checkout alpha devisso, puxarei a pasta dev da ramificação alfa.

Esta resposta é para sua primeira pergunta 'git checkout realmente significa'.

bawa g
fonte
2
Em sua última linha Esta resposta é para sua primeira pergunta 'git checkout realmente significa'. você está verificando a pasta 'realmente' da filial 'média': P
Paramvir Singh Karwal
22

"Fazer check-out" significa que você pega qualquer commit do repositório e recria o estado do arquivo associado e da árvore de diretório no diretório de trabalho.

Quando você faz check-out de um commit que não é um branch head (por exemplo git checkout HEAD~2), você está em uma chamada cabeça separada . Você pode criar commits aqui, mas assim que mudar para um branch diferente, esses commits não serão recuperáveis ​​por um nome de branch e podem até mesmo ser removidos pelo coletor de lixo depois de algum tempo.

Michael Wild
fonte