O ciclo de commit


Digamos que você esteja trabalhando no weather-app nos últimos vinte minutos. Você corrigiu um bug real em src/index.js (a conversão de temperatura estava errada) e, enquanto estava lá, também começou a reestilizar o styles.css, mas essa mudança está pela metade e não está pronta para outras pessoas verem. Você quer salvar a correção do bug como um checkpoint próprio agora mesmo, sem arrastar junto a estilização inacabada.
É exatamente para isso que existe o ciclo de commit. Se você ainda não configurou um repositório, Seu primeiro repositório mostra passo a passo o git init e a clonagem. A partir daqui, este capítulo assume que você já tem um repositório aberto.
As três paradas: diretório de trabalho, área de staging, commit
Toda mudança que você faz no Git passa por três paradas antes de se tornar histórico permanente. Seu diretório de trabalho é o projeto exatamente como ele está no disco agora, os arquivos que você está editando ativamente. A área de staging é um local temporário onde você coloca exatamente as mudanças que quer salvar a seguir. Um commit é o próprio instantâneo salvo, depois que você o registra, junto com a mensagem que o descreve.
Imagine se preparar para uma mudança de casa. Sua casa inteira é o diretório de trabalho: tudo que você possui, no estado em que estiver. As caixas que você já embalou e fechou com fita perto da porta são a área de staging: só o que você escolheu deliberadamente levar. O caminhão de mudança saindo com essas caixas é o commit: um registro exato do que saiu, naquele momento, com uma etiqueta do lado de fora dizendo o que tem dentro.
Veja esse modelo mental aparecendo em um terminal de verdade. Depois de editar os dois arquivos no weather-app, o git status lê o estado atual sem mudar nada:
$ git status
On branch main
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: src/index.js
modified: styles.css
no changes added to commit (use "git add" to commit)Os dois arquivos aparecem como "not staged" porque editar um arquivo só altera o seu diretório de trabalho. Nada é movido para a área de staging até você dizer ao Git para colocá-lo lá com git add, que é o assunto da próxima seção.
É aqui que fica claro para que a área de staging existe. A área de staging permite que você escolha exatamente o que vai entrar no seu commit, independentemente do que ainda está editado no seu diretório de trabalho. Sem ela, salvar um checkpoint obrigaria você a levar todas as mudanças do disco de uma vez, prontas ou não.
Com ela, você pode colocar em staging a correção já concluída em src/index.js, deixar de fora o styles.css pela metade, e fazer commit apenas da parte que realmente está pronta. Esse detalhe, o de que o staging e o seu diretório de trabalho podem conter coisas diferentes ao mesmo tempo, confunde quase todo mundo na primeira semana. Depois que isso faz sentido, o resto do fluxo diário do Git fica muito mais claro.
git add, e é isso que permite salvar uma mudança concluída deixando outra pela metade de fora. Colocando mudanças em staging: git add
O git add move uma mudança do seu diretório de trabalho para a área de staging. Aponte-o para o arquivo cujas mudanças você quer no próximo commit:
$ git add src/index.js
$ git status
On branch main
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
modified: src/index.js
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: styles.cssO src/index.js foi movido para "Changes to be committed": a correção do bug está em staging e pronta. O styles.css continua listado em "not staged", exatamente onde você quer que fique enquanto a reestilização não termina. Executar também git add styles.css colocaria esse arquivo em staging; executar git add . coloca em staging todos os arquivos alterados na pasta atual de uma vez, o que é conveniente quando você confia que tudo no disco realmente está pronto para seguir.
git add <arquivo> move as mudanças atuais desse arquivo para a área de staging, prontas para o próximo commit. Arquivos que você ainda não adicionou ficam de fora, então você pode terminar uma coisa e deixar outra pela metade. git add . coloca em staging todos os arquivos alterados de uma vez, útil quando tudo realmente já está pronto. Salvando um instantâneo: git commit
Quando a área de staging contém o que você quer, o git commit salva isso como um instantâneo permanente, com a flag -m (abreviação de "message") fornecendo a descrição que acompanha o commit:
$ git commit -m "Fix temperature conversion in Celsius-to-Fahrenheit formula"
[main 4f2a1c9] Fix temperature conversion in Celsius-to-Fahrenheit formula
1 file changed, 1 insertion(+), 1 deletion(-)Só o src/index.js entrou, porque foi só isso que você colocou em staging. O styles.css continua editado no seu diretório de trabalho, intocado, esperando o momento em que a reestilização for concluída. O id curto, 4f2a1c9, identifica exatamente esse commit, e o capítulo Histórico mostra como ler a lista completa de commits de um projeto, como esse.
git commit -m "mensagem" salva o que estiver em staging no momento como um instantâneo permanente, com a mensagem que você fornecer. Qualquer coisa que você não colocou em staging fica de fora e continua editável. Mantenha a mensagem curta e clara sobre o que o commit faz, o seu eu do futuro vai lê-la de novo mais vezes do que você imagina. 
