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 com o 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 e o commit dos instantâneos é feito no repositório local, o que não requer interação alguma com outros repositórios do Git. Os commits do Git 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 de cronograma. Os commits são as unidades estruturais de um cronograma de projeto Git. Podem ser considerados instantâneos ou marcos ao longo do cronograma de um projeto Git. 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.

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 uma captura de tela 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 na ramificação 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 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
On branch main
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)
   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

Assim vai ser aberto 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:

# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
# On branch main
# Changes to be committed:
# (use "git reset HEAD ..." to unstage)
#
#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:

Change the message displayed by hello.py

- Update the sayHello() function to output the user's name
- Change the sayGoodbye() function to a friendlier message

É 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 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(a) para aprender Git?

Tente este tutorial interativo.

Comece agora mesmo