O que significa realmente "adicionar ao índice" no Git?

Tenho uma pergunta sobre o básico do 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?

 27
git
Author: jub0bs, 2014-08-17

2 answers

Uma metáfora útil.

"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!

enter image description here

É 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:
  1. o conteúdo do ficheiro é hashed,
  2. o conteúdo do ficheiro é armazenado na base de dados do seu repositório,
  3. 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.

É isso. Encenaste. Está pronto para o próximo commit. Verifique você mesmo:
$ 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.
 55
Author: jub0bs, 2017-05-23 11:45:46

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.

 0
Author: Acey, 2014-08-17 16:57:49