Alguém pode me dizer a diferença entre HEAD, árvore de trabalho e índice, no Git?
Pelo que entendi, todos são nomes para ramos diferentes. Minha suposição está correta?
Editar
Eu achei isto
Um único repositório git pode rastrear um número arbitrário de ramificações, mas sua árvore de trabalho está associada a apenas uma delas (a ramificação "atual" ou "com saída") e o HEAD aponta para essa ramificação.
Isso significa que HEAD e árvore de trabalho são sempre as mesmas?
git
version-control
Joyce Babu
fonte
fonte
HEAD
é o commit na ponta da ramificação atual. Se você acabou de verificar a ramificação, ou seja, não possui arquivos modificados, seu conteúdo corresponde à árvore de trabalho. Assim que você modifica algo, ele não corresponde mais.Staging Area
a essa lista. O que éHEAD
,Working Tree
,Index
e umStaging Area
Respostas:
Algumas outras boas referências sobre esses tópicos:
(observação: como comentado por Timo Huovinen , essas setas não são o que as confirmações apontam, é a ordem do fluxo de trabalho , basicamente mostrando as setas como
1 -> 2 -> 3 -> 4
onde1
está o primeiro commit e4
o último)fonte
A diferença entre HEAD (ramificação atual ou último estado confirmado na ramificação atual), índice (também conhecido como área de preparação) e árvore de trabalho (o estado dos arquivos no checkout) é descrita na seção "Os três estados" do "1.3 Git Basics " capítulo do livro Pro Git de Scott Chacon (licença Creative Commons).
Aqui está a imagem que ilustra este capítulo:
Na imagem acima, "diretório de trabalho" é o mesmo que "árvore de trabalho", "área de preparação" é um nome alternativo para git "index", e HEAD aponta para a ramificação com check-out atualmente, cujo ponto de ponta é o último commit no " diretório git (repositório) "
Observe que
git commit -a
isso prepararia mudanças e confirmaria em uma etapa.fonte
working tree
parece ser preferidoworking directory
hoje em dia. Veja github.com/git/git/commit/…Sua árvore de trabalho é o que realmente está nos arquivos nos quais você está trabalhando atualmente.
HEAD
é um ponteiro para a ramificação ou confirmação que você fez check-out pela última vez e que será o pai de uma nova confirmação, se você fizer isso. Por exemplo, se você estiver nomaster
ramo,HEAD
apontará paramaster
, e quando você confirmar, esse novo commit será um descendente da revisãomaster
apontada emaster
será atualizado para apontar para o novo commit.O índice é uma área de preparação onde a nova confirmação é preparada. Essencialmente, o conteúdo do índice é o que entrará no novo commit (embora, se você fizer
git commit -a
isso, isso adicionará automaticamente todas as alterações nos arquivos que o Git conhece no índice antes de confirmar, para confirmar o conteúdo atual da sua árvore de trabalho )git add
adicionará ou atualizará arquivos da árvore de trabalho no seu índice.fonte
git commit -a
(é necessário adicioná-losgit add
), para que sua árvore de trabalho possa ter arquivos extras que seu índice, seu repositório local ou seu repo remoto não possui.HEAD
refere-se à confirmação mais recente; portanto, ao confirmar, você está atualizandoHEAD
para a nova confirmação, que corresponde ao índice. Empurrar não tem muito a ver com isso - ele cria ramificações nas ramificações de correspondência remota no seu repositório local.Árvore de trabalho
Sua árvore de trabalho são os arquivos nos quais você está trabalhando no momento.
Índice Git
O git "index" é onde você coloca os arquivos que deseja confirmar no repositório git.
O índice também é conhecido como o cache , cache de diretório , cache do diretório atual , área de preparação , encenado arquivos .
Antes de "confirmar" (fazer check-in) os arquivos no repositório git, você precisa primeiro colocar os arquivos no "index" git.
O índice não é o diretório ativo: você pode digitar um comando como
git status
, e o git informará quais arquivos no seu diretório ativo foram adicionados ao índice git (por exemplo, usando ogit add filename
comando).O índice não é o repositório git: arquivos no índice git são arquivos que o git confirmaria no repositório git se você usasse o comando git commit.
fonte
reset --hard HEAD
para garantir que seu índice == sua árvore de trabalho. an then:mkdir history && git checkout-index --prefix history/ -a
O resultado é uma duplicação de toda a sua árvore de trabalho no seuhistory/
diretório. Ergo git index> = diretório de trabalho gitecho untracked-data > untracked-file
, antes ou depois das etapasgit reset --HARD
egit checkout-index
. Você descobrirá que o arquivo não rastreado não está nohistory
diretório Você também pode modificar o índice e a árvore de trabalho de forma independente, embora a modificação do índice sem primeiro tocar na árvore de trabalho seja difícil (requer usogit update-index --index-info
).