O loop de commit


Digamos que você está trabalhando no weather-app há 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 reformatar styles.css, mas essa mudança está meio terminada e não está pronta para ninguém ver. Você quer salvar a correção do bug como seu próprio ponto de controle agora, sem arrastar o estilo inacabado junto com ele.
É exatamente para isso que serve o loop de commit. Se você ainda não configurou um repositório, Seu primeiro repositório mostra como usar git init e clonar primeiro. A partir daqui, este capítulo assume que você tem um aberto.
Os três estágios: diretório de trabalho, área de staging, commit
Toda mudança que você faz no Git passa por três estágios antes de se tornar histórico permanente. Seu diretório de trabalho é o projeto como ele está no disco agora, os arquivos que você está editando ativamente. A área de staging é um espaço de espera onde você coloca exatamente as mudanças que quer salvar em seguida. Um commit é o snapshot salvo em si, uma vez que você o escreve, mais a mensagem que o descreve.
Imagine fazer as malas para uma mudança. Sua casa inteira é o diretório de trabalho: tudo o que você possui, em qualquer estado que esteja. As caixas que você embalou e fechou na porta da frente são a área de staging: apenas o que você deliberadamente escolheu levar. O caminhão de mudança saindo com essas caixas é o commit: um registro do exatamente o que saiu, naquele momento, com um rótulo na parte externa dizendo o que está dentro.
Aqui está esse modelo mental aparecendo em um terminal real. Depois de editar ambos os arquivos em weather-app, 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)Ambos os arquivos aparecem como "não staged" porque editar um arquivo apenas muda seu diretório de trabalho. Nada se move para a área de staging até você dizer ao Git para colocar lá com git add, que é a próxima seção.
É aqui que toda a razão de ser da área de staging fica clara. A área de staging permite que você escolha exatamente o que entra no seu commit, independentemente do que mais ainda está editado no seu diretório de trabalho. Sem ela, salvar um ponto de controle forçaria você a pegar toda mudança no disco de uma vez, pronta ou não.
Com ela, você pode fazer staging da correção de bug terminada em src/index.js, deixar o styles.css meio-terminado de fora, e fazer commit apenas da parte que está realmente pronta. Esse detalhe, de que staging e seu diretório de trabalho podem conter coisas diferentes ao mesmo tempo, confunde quase todo mundo na primeira semana. Uma vez que clica, o resto do fluxo de trabalho diário do Git faz muito mais sentido.
git add, e é isso que permite que você salve uma mudança terminada enquanto deixa uma meio-feita de fora. Fazendo staging de mudanças: git add
git add move uma mudança do seu diretório de trabalho para a área de staging. Aponte-o para o arquivo cuja mudança 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.csssrc/index.js se moveu para "Changes to be committed", a correção de bug está staged e pronta. styles.css ainda está listado sob "not staged", exatamente onde você quer enquanto o reformatting está inacabado. Executar git add styles.css também o faria staging; executar git add . faz staging de cada arquivo alterado na pasta atual de uma vez, o que é conveniente uma vez que você confia que tudo no disco está realmente pronto para ir.
git add <file> move as mudanças atuais desse arquivo para a área de staging, pronto 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 meio-editada. git add . faz staging de cada arquivo alterado de uma vez, prático uma vez que tudo está realmente pronto. Salvando um snapshot: git commit
Uma vez que a área de staging contém o que você quer, git commit o salva como um snapshot permanente, com a flag -m (abreviação de "message") fornecendo a descrição que viaja com ele:
$ 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(-)Apenas src/index.js entrou, porque é tudo o que você fez staging. styles.css ainda está editado no seu diretório de trabalho, intocado, esperando por sempre que o reformatting estiver terminado. O id curto, 4f2a1c9, nomeia esse commit exato, e o capítulo History cobre a leitura da lista completa de commits de um projeto como este.
git commit -m "message" salva o que está atualmente staged como um snapshot permanente, com a mensagem que você fornece. Qualquer coisa que você não fez staging fica de fora e permanece editável. Mantenha a mensagem curta e clara sobre o que o commit faz, você mesmo futuro a lerá de volta mais vezes do que espera. 
