O comando git commit captura um instantâneo das mudanças preparadas do projeto no momento. Os instantâneos com commit podem ser considerados versões "seguras" de um projeto, o Git nunca os altera, a menos que você peça a ele. Antes da execução de git commit, o comando git add é usado para promover ou "preparar" mudanças no projeto que são armazenadas em um commit. Estes dois comandos git commit e git add estão entre os mais usados.

Git commit versus SVN commit

Embora compartilhem o mesmo nome, o git commit não tem semelhanças com o svn commit. Este termo compartilhado pode ser motivo de confusão para os iniciantes no Git que têm experiência em svn, e é importante enfatizar a diferença. Comparar o git commit ao svn commit é comparar um modelo de aplicação centralizado (svn) com um modelo de aplicação distribuído (Git). No SVN, um commit realiza mudanças a partir do cliente SVN local até um repositório SVN compartilhado e centralizado. No Git, os repositórios são distribuídos, o commit dos instantâneos é feito no repositório local, e isso não requer interação alguma com outros repositórios do Git. Os commits podem ser realizados mais tarde em repositórios remotos arbitrários.

Como funciona

Em um nível alto, o Git pode ser considerado um utilitário de gerenciamento da linha do tempo. Os commits são as unidades estruturais de uma linha do tempo de projeto Git. Os commits podem ser considerados instantâneos ou marcos ao longo da linha do tempo de um projeto Git. Os commits são criados com o comando git commit para capturar o estado de um projeto naquele momento. O commit dos instantâneos do Git sempre é feito no repositório local, muito diferente do SVN, no qual se faz o commit de uma cópia do trabalho no repositório central. Já o Git não força você a interagir com o repositório central até que você esteja pronto. Assim como a área de staging é um intermediário entre o diretório de trabalho e o histórico do projeto, o repositório local de cada desenvolvedor é um intermediário entre as respectivas contribuições e o repositório central.

Assim, o modelo de desenvolvimento básico para os usuários do Git muda. Em vez de fazer uma alteração e seu commit no repositório central, os desenvolvedores do Git podem acumular commits nos repositórios locais, o que apresenta muitas vantagens em relação à colaboração no estilo SVN: facilita a divisão de um recurso em commits menores, mantém commits relacionados agrupados e limpa o histórico local antes de as publicar no repositório central. Com isso, os desenvolvedores também podem trabalhar em um ambiente isolado, adiando a integração até estarem em um ponto conveniente para mesclar com outros usuários. Embora o isolamento e integração adiada sejam benéficos em caráter individual, é de interesse da equipe integrar com frequência e em unidades pequenas. Para mais informações sobre as melhores práticas de colaboração da equipe Git, leia sobre como as equipes estruturam os próprios fluxos de trabalho do Git.

Instantâneos, não diferenças

Além das distinções práticas entre o SVN e o Git, a implementação subjacente também segue filosofias de design com total divergência. Enquanto o SVN monitora as diferenças de um arquivo, o modelo de controle de versão do Git é baseado em instantâneos. Por exemplo, um commit do SVN consiste em uma diferença em comparação ao arquivo original adicionado ao repositório. Por outro lado, o Git registra todo o conteúdo de cada arquivo em cada commit.

Tutorial do Git: Instantâneos, não diferenças

Isto torna muitas operações de Git bem mais rápidas do que o SVN, uma vez que uma versão específica de um arquivo não precisa ser "montada" a partir das diferenças, a revisão completa de cada arquivo fica disponível de imediato no banco de dados interno do Git.

O modelo de instantâneo do Git tem um impacto mais profundo em quase todos os aspectos do modelo de controle de versão, afetando tudo, desde as ferramentas de branch e mesclagem, até os fluxos de trabalho colaborativos.

Opções comuns

 git commit

Faça o commit do instantâneo preparado, o que abre um editor de texto solicitando a você uma mensagem de commit. Depois de escrever a mensagem, salve o arquivo e feche o editor para criar o commit real.

 git commit -a

Faça o commit de um instantâneo de todas as alterações no diretório de trabalho, apenas com as modificações nos arquivos monitorados (aqueles que foram adicionados com git add em algum momento do histórico).

 git commit -m "commit message"

Um comando de atalho que cria de imediato um commit com uma mensagem de commit transmitida. Por padrão, git commit abre o editor de texto configurado no local e solicita que uma mensagem de commit seja escrita. Transmitir a opção -m vai pular a solicitação do editor de texto em favor de uma mensagem integrada.

 git commit -am "commit message"

Um comando de atalho de usuário experiente que combina as opções -a e -m. Essa combinação cria de imediato um commit de todas as alterações preparadas e gera uma mensagem de commit integrada.

 git commit --amend

Essa opção adiciona outro nível de funcionalidade ao comando commit. A transmissão dessa opção modifica o último commit. Em vez de criar um novo commit, as mudanças preparadas são adicionadas ao commit anterior. Esse comando abre o editor de texto configurado no sistema e solicita a mudança da mensagem de commit especificada mais cedo.

Exemplos

Salvar alterações com um commit

O exemplo a seguir supõe que você editou algum conteúdo em um arquivo chamado hello.py no branch atual e está pronto para fazer o commit no histórico do projeto. Primeiro, você precisa preparar o arquivo com git add, depois, pode fazer o commit do instantâneo preparado.

 git add hello.py

Esse comando adiciona hello.py à área de staging do Git. A gente pode examinar o resultado desta ação usando o comando git status.

 git status No branch principal Commits para fazer nas seguintes alterações: (use "git reset HEAD ..." para despreparar) new file: hello.py 

O novo arquivo verde resultante: hello.py indica que hello.py vai ser salvo com o próximo commit. A partir do commit, ele é criado com a execução de:

git commit

Isto abre um editor de texto (personalizável pelo git config) solicitando uma mensagem de registro do commit, junto com uma lista do que está sendo objeto do commit:

 #Insira a mensagem de commit das alterações. Linhas que começam # com "#" são ignoradas e uma mensagem em branco aborta o commit. # No branch principal # Commits a fazer nas alterações: # (use "git reset HEAD ..." para despreparar) # #modified: hello.py

O Git não exige que as mensagens de commit sigam restrições específicas de formatação, porém o formato canônico é resumir o commit todo na primeira linha em menos de 50 caracteres. deixar uma linha em branco e, então, escrever uma explicação detalhada do que está sendo alterado. Por exemplo:

 Alterar a mensagem exibida por hello.py
- Atualizar a função sayHello() para exibir o nome do usuário - Alterar a função sayGoodbye() para uma mensagem mais simpática

É uma prática comum usar a primeira linha da mensagem de commit como uma linha de assunto, semelhante a um e-mail. O resto da mensagem de registro é considerado o corpo e usado para comunicar os dados do conjunto de mudanças do commit. Observe que muitos desenvolvedores também gostam de usar o presente nas mensagens de commit, o que faz com que eles as leiam como ações no repositório e torna muitas das operações de regravação de histórico mais intuitivas.

Como atualizar (emendar) um commit

Para continuar o exemplo do hello.py acima, a gente vai fazer mais atualizações em hello.py e executar o seguinte:

 git add hello.py git commit --amend

Isso abre outra vez o editor de texto configurado. No entanto, desta vez ele é preenchido com a mensagem de commit inserida antes. Isso indica que a gente não está criando um novo commit, mas editando a última.

Resumo

O comando git commit é uma das funções principais do Git. Antes de usar o comando git add é necessário selecionar as alterações que vão ser preparadas para o próximo commit. Então, git commit é usado para criar um instantâneo das alterações preparadas em uma linha do tempo de um histórico de projetos do Git. Saiba mais sobre o uso de git add na página de acompanhamento. O comando git status pode ser usado para explorar o estado da área de staging e o commit pendente.

O modelo de commit do SVN e do Git são muito diferentes, porém são confundidos por causa da terminologia em comum. Se você vai usar o Git, mas já usou o SVN, é bom saber que no Git, os commits são simples e devem ser usados com frequência. Enquanto os commits no SVN são uma operação complexa e fazem solicitação remota, os commits do Git são feitos no local e com um algoritmo mais eficiente.

Pronto para aprender sobre o Git?

Experimente este tutorial interativo.

Comece agora mesmo