O que significa realmente "adicionar ao Ãndice" no Git?
basicamente, o que significa a acção conhecida como "adicionar ao Ãndice" no Git? Eu entendo assim:
se para qualquer arquivo git calcula a soma SHA - 1, Então, basicamente, adicionar ao Ãndice significa que ele calcula a soma SHA - 1 e Adicionar arquivo para a área de teste.
Estou correcto?2 answers
"adicionar um ficheiro ao Ãndice", "encenar um ficheiro", "adicionar um ficheiro à área de encenação" são todos sinónimos.
Pessoalmente, prefiro o termo área de preparação ao Ãndice porque se presta a uma metáfora útil. Se cometer é semelhante a "tirar uma fotografia", encenar {[33] } é sobre " compor a imagem ". Imagina-te como um fotógrafo profissional prestes a tirar uma fotografia de turma.: você reúne todos os seus assuntos e prepará-los para a foto, você se certificar de que eles estão todos lá e que não há intrusos, que tudo de importância está na moldura, etc. Entao... Snap! É claro, se você perceber, logo após tirar a foto, que muitas crianças tinham seus olhos fechados (ou que um garoto estava dando orelhas de coelho à professora!), você pode querer raspar essa primeira foto e tirar outra, melhor; em Git, que corresponderia a que altera a última autorização. Mas estou a divagar...O que acontece quando adiciona um ficheiro (novo) ao Ãndice
Para encenar alguma coisa, usarias o comando de alto nÃvel ("porcelana")git add
... ou o equivalente exato git stage
(introduzido por Scott Chacon em torno de Git v1.6) que eu acho muito mais intuitivo, mas não parece tão popular.
Quando se adiciona um novo ficheiro à área de preparação, acontecem três coisas:
- o conteúdo do ficheiro é hashed,
- o conteúdo do ficheiro é armazenado na base de dados do seu repositório,
- o conteúdo do ficheiro na sua árvore de trabalho está registado no ficheiro
.git/index
.
Adicionar um ficheiro ao Ãndice com comandos de canalização
Como uma experiência, para corrigir ideias, você pode usar comandos Git de baixo nÃvel ("canalização") para reproduzir o que {[[7]} faz nesse caso simples. Iniciar a partir de um repositório novinho em folha:
$ cd ~/Desktop
$ mkdir teststage
$ cd teststage
$ git init
Antes de fazer qualquer outra coisa, vá em frente e olhe para o .git/objects
pasta.
$ ls -la .git/objects
Verá que só contém duas sub-sub-direcções (vazias): info
e pack
. Criar um ficheiro, digamos README.md
:
$ printf "hello\n" > README.md
Agora vamos encenar um passo de cada vez. Primeiro, use o comando lower-level git hash-object
para (1) hash o conteúdo de README.md
e (2) Escreva este último na base de dados do repositório.
$ git hash-object -w README.md
27728344ab3ae5b8aa334418d1e1b0f5be0ea0cc
(-w
significa escrever, aqui.)
Agora, se você olhar para a pasta .git/objects
, Você vai ver que o novo objeto (um blob) foi adicionado ao base de Dados:
$ tree -la .git/objects/
.git/objects
├── 27
│  └── 728344ab3ae5b8aa334418d1e1b0f5be0ea0cc
├── info
└── pack
Resta uma coisa para completar a encenação de ... Precisamos (3) registrar o conteúdo do arquivo no Ãndice. Dê uma olhada lá dentro, não deve haver nenhum arquivo chamado index
nele, ainda. Agora, se fugires
$ git update-index --add --info-only README.md
E então dê outra olhada dentro .git
, Você verá que um arquivo binário index
foi criado.
$ git status
On branch master
Initial commit
Changes to be committed:
(use "git rm --cached <file>..." to unstage)
new file: README.md
Agora podes fazer o teu primeiro compromisso, Se quiseres.
Quando adiciona um ficheiro, está a marcar isso como um ficheiro que irá enviar assim que executar o comando git commit. Um atalho para adicionar todos os ficheiros modificados automaticamente é persistir com o git commit-A. outro atalho se estiver a adicionar vários ficheiros novos ao mesmo tempo é correr o git add-A.