🔍 Sumário
🚀 > Criando um projeto.
🚀 > Conferindo o status do repositório.
🚀 > Fazendo modificações.
🚀 > Adicionando modificações ao stage.
🚀 > Colocando em stage e fazendo commits.
🚀 > Fazendo commit das modificações.
🚀 > Modificações, não arquivos.
🚀 > Histórico.
mkdir hello
cd hello
touch hello.html
Crie um diretório vazio chamado "pasta". Então, crie um arquivo hello.html dentro dele com o conteúdo indicado abaixo.
mkdir hello
cd hello
touch hello.html
Então você tem um diretório que tem um arquivo. Execute o comando git init para criar um repositório do git a partir desse diretório.
git init
resultado:
$ git init
Initialized empty Git repository in /Users/alex/Documents/Presentations/githowto/auto/hello/.git/
Agora vamos adicionar a página “Hello, World” ao repositório com git add
git add hello.html
git commit -m "First Commit"
você verá …
$ git add hello.html
$ git commit -m "First Commit"
[master (root-commit) 911e8c9] First Commit
1 files changed, 1 insertions(+), 0 deletions(-)
create mode 100644 hello.html
Use o comando git status para checar o estado atual do repositório. Execute:
git status
resultado:
$ git status
# On branch master
nothing to commit (working directory clean)
O comando confere o status e reporta que não existe nada para fazer um commit, o que quer dizer que o repositório está com o atual estado do diretório de trabalho e não existem modificações a serem gravadas.
Nós usaremos o git status para continuar monitorando os estados de ambos o diretório de trabalho e o repositório.
Vamos adicionar algumas tags HTML para a nossa saudação. Modifique os conteúdos do arquivo para:
<h1>Hello, World!</h1>
Confira o status do diretório de trabalho com git status. Execute:
git status
resultado:
$ git status
# On branch master
# Changes not staged for commit:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: hello.html
#
no changes added to commit (use "git add" and/or "git commit -a")
O primeiro aspecto importante aqui é que o git sabe que o arquivo hello.html foi modificado, mas essas modificações ainda não sofreram commit para o repositório.
Outro aspecto é que a mensagem de status oferece dicas sobre o que fazer em seguida. Se você quiser adicionar essas modificações para o repositório, use git add. Para desfazer as modificações use git checkout.
Agora mande o git adicionar as modificações ao stage com git add. Confira o status com git status. Execute:
git add hello.html
git status
você verá …
$ git add hello.html
$ git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# modified: hello.html
#
Modificações no hello.html foram adicionadas ao stage. Isso quer dizer que o git sabe da modificação, mas não é permanente no repositório. O próximo commit incluirá as modificações que estão no stage.
Se você decidir não fazer commit da modificação, o comando git status vai te lembrar que você pode usar o comando git reset para remover essas mudanças do stage.
Adicionar algo ao stage no git permite que você continue fazendo modificações no seu diretório de trabalho e, quando decidir que quer interagir com o controle de versão, permite que guarde as mudanças em pequenos commits.
Pense que você editou três arquivos (a.html, b.html e c.html). Depois disso você tem que fazer commit de todas as modificações para que as mudanças em a.html e b.html sejam um único commit, enquanto as mudanças em c.html, que não são lógicamente relacionadas com as duas outras mudanças nos outros dois arquivos, sejam enviadas em um commit diferente.
Em teoria, você pode fazer o seguinte:
git add a.html
git add b.html
git commit -m "Changes for a and b"
git add c.html
git commit -m "Unrelated change to c"
Separando a adição ao stage e o commit, você pode customizar o que vai em cada commit.
Quando você usou o comando git commit anteriormente para fazer commit da primeira versão do hello.html para o repositório, você incluiu a flag -m que permite um comentário na linha de comando. O comando de commit permite edição interativa de comentários para o commit. Agora, vamos ver como isso funciona.
Se você omitir a flag -m da linha de comando, o git vai abrir o editor da sua escolha, a partir dessa lista (em ordem de prioridade):
Variável de ambiente GIT_EDITOR ;
Definição de configuração core.editor ;
Variável de ambiente VISUAL ;
Variável de ambiente EDITOR .
Execute:
git commit
Resultado:
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# modified: hello.html
#
Na primeira linha, escreva o comentário: “Added h1 tag”. Salve o arquivo e saia do editor (para fazer isso no editor padrão, pressione ESC e então escreva :wq e aperte Enter).
Resultado:
git commit
Waiting for Emacs...
[master 569aa96] Added h1 tag
1 files changed, 1 insertions(+), 1 deletions(-)
"Waiting for Emacs…" é obtido pelo programa emacsclient estar enviando o arquivo para um programa emacs em execução e esperando para ele ser fechado. O resto das informações é a mensagem padrão de commits.
No final, vamos conferir o status.
Execute:
git status
Resultado:
$ git status
# On branch master
nothing to commit (working directory clean)
O diretório de trabalho está limpo, você pode continuar trabalhando.
Entender que o git trabalha com as modificações, não com os arquivos. A maioria dos sistemas de controle de versão trabalham com arquivos. Você adiciona o arquivo no controle de código e o sistema acompanha as mudanças a partir daquele momento. O Git se concentra nas mudanças de um arquivo, não no arquivo em si. Um comando git add file não fala para o git adicionar o arquivo no repositório, mas para perceber o atual estado do arquivo para que ele seja parte de um commit depois.
Mude a página “Hello, World” de maneira que ela passe a ter as tags padrão < html > e < body >.
<html>
<body>
<h1>Hello, World!</h1>
</body>
</html>
Agora adicione essa modificação para o stage do git.
git add hello.html
Agora adicione os headers (< head > section) na página “Hello, World”.
<html>
<head>
</head>
<body>
<h1>Hello, World!</h1>
</body>
</html>
git status
Você verá …
$ git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# modified: hello.html
#
# Changes not staged for commit:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: hello.html
#
Note que o arquivo hello.html está listado duas vezes no status. A primeira mudança (a adição das tags padrão) está no stage e pronta para um commit. A segunda mudança (adição dos headers) não está no stage. Se você fizesse um commit agora, os headers não teriam sido salvos no repositório.
Faça um commit das mudanças que estão no stage (as tags padrão) e então confira novamente o status.
git commit -m "Added standard HTML page tags"
git status
Você verá …
$ git commit -m "Added standard HTML page tags"
[master 8c32287] Added standard HTML page tags
1 files changed, 3 insertions(+), 1 deletions(-)
$ git status
# On branch master
# Changes not staged for commit:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: hello.html
#
no changes added to commit (use "git add" and/or "git commit -a")
O comando status diz que o arquivo hello.html tem modificações não gravadas, mas não está mais em buffer.
Adicione a segunda modificação ao stage, depois execute o comando git status.
git add .
git status
Nota: O diretório atual (‘.’) vai ser nosso arquivo a adicionar. Essa é a maneira mais conveniente de adicionar todas as mudanças dos arquivos do diretório atual e suas pastas. Mas como ele adiciona tudo, é uma boa ideia conferir o status antes de fazer um add ., para ter certeza que você não adicione nenhum arquivo que não deveria ser adicionado.
Eu queria que você visse o truque do “add .”, mas nós vamos continuar adicionando os arquivos explicitamente no futuro, por via das dúvidas.
Você verá …
$ git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# modified: hello.html
#
A segunda modificação está no stage e pronta para um commit.
git commit -m "Added HTML header"
Conseguir uma lista das modificações feitas é uma função do comando git log.
git log
Você verá...
$ git log
commit fa3c1411aa09441695a9e645d4371e8d749da1dc
Author: Alexander Shvets <alex@githowto.com>
Date: Wed Mar 9 10:27:54 2011 -0500
Added HTML header
commit 8c3228730ed03116815a5cc682e8105e7d981928
Author: Alexander Shvets <alex@githowto.com>
Date: Wed Mar 9 10:27:54 2011 -0500
Added standard HTML page tags
commit 43628f779cb333dd30d78186499f93638107f70b
Author: Alexander Shvets <alex@githowto.com>
Date: Wed Mar 9 10:27:54 2011 -0500
Added h1 tag
commit 911e8c91caeab8d30ad16d56746cbd6eef72dc4c
Author: Alexander Shvets <alex@githowto.com>
Date: Wed Mar 9 10:27:54 2011 -0500
First Commit
Aqui está uma lista de todos os quatro commits do repositório, que nós fizemos até agora.
Você controla completamente o que o log mostra. Eu gosto do formato de linha única.
git log --pretty=oneline
Você verá …
$ git log --pretty=oneline
fa3c1411aa09441695a9e645d4371e8d749da1dc Added HTML header
8c3228730ed03116815a5cc682e8105e7d981928 Added standard HTML page tags
43628f779cb333dd30d78186499f93638107f70b Added h1 tag
911e8c91caeab8d30ad16d56746cbd6eef72dc4c First Commit
Existem muitas opções para escolher quais entradas aparecem no log. Brinque um pouco com os parâmetros a seguir:
git log --pretty=oneline --max-count=2
git log --pretty=oneline --since='5 minutes ago'
git log --pretty=oneline --until='5 minutes ago'
git log --pretty=oneline --author=<your name>
git log --pretty=oneline --all
Detalhes são fornecidos nas instruções do git-log.
Isso é como eu faço para rever as modificações feitas na última semana. Eu adiciono --author=alex se eu quero ver apenas as modificações que eu fiz.
git log --all --pretty=format:"%h %cd %s (%an)" --since='7 days ago'
Com o tempo, eu descobri que o seguinte formato é o mais adequado.
git log --pretty=format:"%h %ad | %s%d [%an]" --graph --date=short
Ele fica assim:
$ git log --pretty=format:"%h %ad | %s%d [%an]" --graph --date=short
* fa3c141 2011-03-09 | Added HTML header (HEAD, master) [Alexander Shvets]
* 8c32287 2011-03-09 | Added standard HTML page tags [Alexander Shvets]
* 43628f7 2011-03-09 | Added h1 tag [Alexander Shvets]
* 911e8c9 2011-03-09 | First Commit [Alexander Shvets]
Vamos olhar os detalhes:
- --pretty="..." define o formato da saída
- %h é o hash abreviado do commit
- %d mostra decorações do commit (ex.: head de branches ou tags)
- %ad é a data do commit
- %s é o comentário
- %an é o nome do autor =
- --graph fala para o git mostrar a árvore de commits no formato de um gráfico de ASCII
- --date=short mantém o formato de data pequeno e simples
Então, toda vez que você quiser ver um log, você terá que digitar muito. Felizmente, nós aprenderemos sobre aliases na próxima lição.
Ambos gitx (para Mac) e gitk (para qualquer plataforma) ajudam a explorar o histórico.