Esta é uma pergunta recorrente: “Por que manter o índice go GIt (index)?” ou “O índice do Git (index) é um truque de desempenho?”

Na verdade, o índice do git é uma área de staging (preparação). Todo SCM (Source Code Manager) tem, a diferença é que o git mostra para você, e o usa efetivamente.

Git staging area

Quando você faz:

git add some.file
git commit -m 'message'

O primeiro comando, git add some.file não confirma (commit) o arquivo, certo? Para onde então o arquivo foi? Resposta: na área de preparação.

Com o segundo comando, git commit -m "message", você finalmente confirma (commit) os arquivos preparados. Mas o que acontece com os outros arquivos modificados que não estavam na área de preparação? Eles estão comprometidos? Resposta: não, a última revisão é atualizada com a nova versão de some.file, “que estava na área de staging”, e então confirmada.

Assim, o índice vem naturalmente quando você executa: git add some.file, agora, o arquivo está no índice.

Existe um caso especial:

git commit some.file

Nesse caso, o git supõe que você deseja criar uma área de preparação temporária a partir do topo da ramificação atual (“HEAD”), atualizar some.file e confirmar (commit) o estado resultante. Depois de confirmar esse estado, a área de preparação é restaurada como era antes dessa confirmação.

Esta operação (“salvar a área de preparação atual, construir uma nova, confirmá-la e restaurar a área de preparação”) parece um pouco ilógica, já que você normalmente espera apenas uma área de preparação. Porém, na prática acontece com bastante frequência quando você dá um tapa na testa, porque se esqueceu de alterar algo muito importante. Então, apenas edite os respectivos arquivos, confirme apenas estes e continue com o que estava fazendo antes de se auto flagelar.

O que é o índice (index) do Git?

Em essência: o índice (index) do Git é uma área de teste (stage) para o próximo commit, mas por conveniência, passar nomes de arquivos explicitamente para git commit cria uma área de preparação temporária a partir da revisão mais recente e da versão atual dos arquivos fornecidos antes de confirmar esse estado.

Git Merges e o índice (index)

Normalmente, um usuário git raramente será exposto ao índice, se ele/ela não estiver submetendo uma revisão. Mas há uma exceção notável: merge.

Quando você mescla o trabalho de outras pessoas, às vezes acontecem conflitos. Esses conflitos são colocados no arquivo index.

Isso significa que toda a mesclagem é feita dentro do índice inserindo a versão atual, a versão da ramificação a ser mesclada e a base da mesclagem (antepassado comum) no índice e mesclando-os usando um método de três vias diff (comparação de diferenças). Se não houver conflitos, essas três entradas serão mescladas em uma única entrada. Caso contrário, as três entradas permanecem lá, com o ancestral comum sendo substituído pelo resultado da mesclagem.

Novamente, o git é inteligente sobre o que mostrar a você em um diff do git: as entradas que foram mescladas de forma limpa já estão atualizadas na área de preparação. É improvável que você queira ver essas diferenças agora, porque precisa resolver os conflitos - se houver algum. Portanto, um git diff mostrará a você um diff combinado, ou seja, um diff simultâneo do arquivo mesclado com conflitos em relação à versão atual e à versão no ramo a ser mesclado.

Conclusões

O índice Git é bom para você 😉