https://github.com/abril/git-course
Baseado em http://git-scm.com/book/pt-br
Navege com as setas
Celestino Ferreira Gomes
.git na raíz de cada projeto.git/config.git/hooks.git/objects.git/refs.git
|-- COMMIT_EDITMSG # última mensagem de commit
|-- HEAD # referência atual do checkout
|-- config # arquivo de configuração do repositório
|-- description # arquivo de descrição do repositório
|-- hooks # diretório com arquivos de gatilhos
| |-- ...
|-- index # mudanças para commit
|-- info
| |-- exclude # configuração de arquivos p/ ñ versionamento
| +-- refs # lista de branches e suas referências
|-- logs
| |-- ... # arquivos de log das mudanças
|-- objects
| |-- info
| │ +-- packs # informações sobre pacotes
| +-- pack
| |-- ... # pacotes e indices
|-- packed-refs
|-- refs
|-- heads
+-- tags
Todos os objetos se registram da mesma forma.
conteudo
header + conteudo
"2e6f9b0d5885b6010f9167787445617f553a735f"
zlib(header + conteudo)
.git/objects/2e/6f9b0d5885b6010f9167787445617f553a735f
def put_raw_object(content, type)
size = content.length.to_s
LooseStorage.verify_header(type, size)
header = "#{type} #{size}\0"
store = header + content
sha1 = Digest::SHA1.hexdigest(store)
path = @directory + '/' + sha1[0...2] + '/' + sha1[2..40]
if !File.exists?(path)
content = data - scale = 2Zlib::Deflate.deflate(store)
FileUtils.mkdir_p(@directory+'/'+sha1[0...2])
File.open(path, 'wb') do |f|
f.write content
end
end
return sha1
end
| type | size |
| data | |
| blob | size |
| file data | |
2e6f9b0d5885b6010f9167787445617f553a735f
| tree | size |
|
040000 tree 1a2b3c... / 100644 blog 2e6f9b... Rakefile ... |
|
ob772ec8eb9ae8952c3c1e56a9ffbe49385cc83a
| commit | size |
|
tree ob772e... parent 12cb23... author Someone <aliress> commiter Someone <aliress> commit message ... |
|
7216b02627bc3d6ef57008f7ff67f0f8f13f488e
| tag | size |
|
object 7216b0... tag tag-name ... |
|
0bc9a42eb66d7ae36bf44af8ff5a3888e8a02d12
Acessar o site oficial do Git e fazer o download de acordo com seu sistema operacional.
$ git help
usage: git <command> [<args>]
The most commonly used git commands are:
add Add file contents to the index
bisect Find by binary search the change that introduced a bug
branch List, create, or delete branches
checkout Checkout a branch or paths to the working tree
clone Clone a repository into a new directory
...
tag Create, list, delete or verify a tag object signed with GPG
See 'git help <command>' for more information on a specific command.
Sintaxe:
$ git config [<options>] [<key> <value>]
Sistema --system: /etc/gitconfig
$ git config --system
Global --global: ~/.gitconfig
$ git config --global user.name "Celestino Gomes"
$ git config --global user.email "celestino.gomes@abril.com.br"
Repositório --local: ./.git/config Esse somente em um repositório ;)
$ git config [--local] core.ignorecase true
$ git config user.name # Imprime "Celestino Gomes"
$ git config --list # Lista as chaves configuradas para o repo atual
git init: Cria um repositório a partir do diretório atual.
git clone: Cria um repositório a partir de um outro repositório já existente.
$ cd repos
$ git clone https://github.com/abril/git-course.git
$ cd repos
$ git clone https://github.com/abril/git-course.git curso-de-git
Abaixo uma imagem que explica o ciclo de vida dos arquivos em um repositório git.

$ git status
# On branch master
nothing to commit (working directory clean)
$ echo 'conteudo' > README
$ git status
# On branch master
# Untracked files:
# (use "git add ..." to include in what will be committed)
#
# README
nothing added to commit but untracked files present (use "git add" to track)
git add <path>
Exemplo:
$ git add README
$ git status
# On branch master
#
# Initial commit
#
# Changes to be committed:
# (use "git rm --cached ..." to unstage)
#
# new file: README
#
$ cat .gitignore
É comum usar para ignorar arquivos temporários, log e configurações locais.
$ echo '*.log' >> .gitignore
git diff [--cached] [[--] <path>]
Exemplo:
$ git diff
diff --git a/README b/README
index 0cfbf08..bcaa3b0 100644
--- a/README
+++ b/README
@@ -1 +1,2 @@
2
+conteudo
git commit [<options>]
-m - mensagem de commit-a - inclui todos as mudanças de conteúdo$ git commit -m 'meu primeiro commit no git \o/'
Se não passar -m com uma mensagem, o git commit vai abrir o editor padrão configurado para o sistema.
git config --global core.editor vi
git rm [-r] <path>
git mv <current_path> <new_path>
Exemplo
$ git mv README LEAIAME
É a mesma coisa que:
$ mv README LEIAME
$ git rm README
$ git add LEIAME
git log [<options>] [<since>..<until>] [[--] <path>...]
-<N> - Para listar os N últimos commits.--pretty=<format> - Formato de apresentação dos commit, podendo ser: oneline, short, medium (default), full, fuller, email, raw e formato definido pelo usuário.--graph - Imprime de formato "gráfico" os commits$ git log --oneline --graph
git show <commit>
git commit --amend
Use apenas em seu repositório local, antes de integrar com outros repos
$ git reset HEAD
$ git checkout -- arquivo
$ git init # git clone <repo>
$ git add .
$ git commit -m 'Primeiro commit'
git config --global alias.st 'status'
git config --global alias.one 'log --oneline'
git config --global alias.oneg 'log --oneline --graph'
git config --global alias.ci 'commit'
git config --global alias.cim 'commit -m'
No git, estamos sempre trabalhando em um branch. O nome do branch padrão é o master. Mas o que é um branch no git?
$ git branch
* master
O branch é nada mais que uma referência (ponteiro) móvel para um commit. Logo:

$ git branch testing vai criar um novo branch, apontando para a referência atual.

Como o git sabe o branch em que você está atualmente? Ele tem um ponteiro especial chamado HEAD.

Para mudar de branch, use git checkout <branch-name>
$ git checkout testing

Como juntar as coisas? Existem duas estratégia, sendo elas merge ou rebase
$ git merge <commit>

$ git checkout -b iss53
$ git add .
$ git commit -m 'c3'
$ git add .
$ git commit -m 'c5'
# ------------------
$ git checkout master
$ git add .
$ git commit -m 'c4'
$ git merge iss53
git rebase <base> <destino>
$ git checkout -b experiment
$ git add .
$ git commit -m 'c3'
# ------------------
$ git checkout master
$ git add .
$ git commit -m 'c4'
# ------------------
$ git checkout experiment
$ git rebase master
Então é só fazer a atualização do master para o experiment.
$ git checkout master
$ git merge experiment

git config --global alias.br 'branch'
git config --global alias.co 'checkout'
git config --global alias.rb 'rebase'
git config --global alias.rbc 'rebase --continue'
git config --global alias.rbs 'rebase --skip'
git config --global alias.rba 'rebase --abort'
Para listas as tags existes
git tag
Para criar uma nova tag
git tag <tagname> <commit>
São referências ao estado de seus branches no seu repositório remoto. Quando se cria um repositório através do comando git clone, nosso repositório fica com uma referência para este repositório remoto, e é identificado pela chave origin.
$ cd ~/curso
$ git clone ~/curso/repo-remoto celestino
$ cd meu-repo
$ git remote -v
origin ~/curso/repo-remoto (fetch)
origin ~/curso/repo-remoto (push)

Para adicionar um repositório remoto ao seu repositório local, use:
git remote add <name> <repositorio>
Exemplo:
$ cd ~/curso
$ mkdir joao ; cd joao
$ git init
$ git remote add celestino ~/meu-repo
Antes de integrar com um branch remoto, é muito importante atualizar as referências remotas de nosso repositório.
git fetch <repo>

Tá, mas como eu integro os branches?
git merge <repo/branch>
Ah, então, seu eu quero atualizar meu master com o remoto...
git merge origin/master ou git rebase origin/master
A atualização do seu branch com o remoto pode ser mais fácil. git pull <repo> <branch>
git pull == git fetch origin; git merge origin/master
Tá, mas eu prefiro fazer rebase.
git pull --rebase = git fetch origin; git rebase origin/master
:)
Quero trabalhar em um branch remoto, como faz?
git checkout -b <branch-local> <repo>/<branch-remoto>
Exemplo:
$ git checkout -b fix origin/fix
Branch fix set up to track remote branch origin/fix.
Switched to a new branch "fix"
$ git branch
master
* fix
git push <repo> [<branch-origem>:]<branch-destino>
$ git push origin master
Se seu branch está "seguindo (tracking)" um branch remoto...
$ git push
Quando se faz um clone, normalmente seu branch master local está seguindo o origin/master
git push <repo> :<branch-destino>
Sim, é um push, porém o branch-origem é NADA, ele apaga o branch no repositório remoto.
Assim como os branches, sempre é necessário atualizar as referências das tags
git fetch --tags
Para enviar uma tag criada no repositório local para o remoto.
git push origin <tagname>
Para enviar todas as tags locais
git push origin --tags
Stash é um "branch local" do git que você pode colocar suas mudanças do seu diretório de trabalho, sem perder, e voltar seu branch para um estado estável. Funciona como uma pilha.
git stash
Listar os stashes disponíveis:
git stash list
Para voltar as mudanças para seu diretório de trabalho.
git stash apply [<stash-index>]
Pode ser que, no momento de voltar seu trabalho do stash, o arquivo original não esteja no mesmo estado do seu conteúdo stashed, então, uma forma de tentar reaplicar as mudanças é adicionando a opção --index
git stash apply --index
Você pode remover um stash sem aplicar.
git stash drop [<stash-index>]
Você pode aplicar e remover um stash ao mesmo tempo.
git stash pop [<stash-index>]
Criar um branch do stash
git stash branch <nome-do-branch>
Pode ser que você precise descobrir quem escreveu aqui no arquivo.
git blame <commit-ref> [-L <linhasouregexp>] <arquivo>
Exemplo:
$ git blame README
$ git blame -L 4,8 README
$ git blame -L 4,+5 README
$ git blame -L '/conteudo/',+5 README
$ git blame v1.0.. -- README
Você precisa descobri em que ponto no histórico de commits algum bug foi introduzido
$ git log
$ git checkout <commit-ref>
# verificar se está ok ou não
$ git checkout <commit-ref>
# verificar se está ok ou não
$ git checkout <commit-ref>
# verificar se está ok ou não
...
O_o
git bisect start [<bad-commit>] [<good-commit>]
Exemplo:
$ git log --oneline
817a46d (HEAD, master) atualizando README
28b3818 usando class com prefixo padrao
ec466bb passando o numero da pagina atual
==> 6a178b5 colocando link para obter mais comentarios
1110218 rota para listar comentarios por pagina
fb240bb paginando comentarios no model
291b8ef (tag: v0.0.2-7) Merge branch 'master'
638116b Configurando ambiente
$ git bisect start HEAD v0.0.2-7
Bisecting: 2 revisions left to test after this (roughly 2 steps)
[6a178b5...] colocando link para obter mais comentarios
Declarar o estado do commit
git bisect <bad|good>
Voltar ao estado atual do branch
git bisect reset
Automático
git bisect run <script>
git init / git clone <repo_path>
git config
git add <path>
git rm [-r] <path>
git mv <current_path> <new_path>
git commit [-m <commit_message>]
git merge <branch>
git rebase <branch>
git fetch [<repo>]
git pull [<repo> [<branch>]] # == fetch + merge
git push [<repo> [<local_branch>][[:]<remove_branch>]]
git config --global alias.st 'status'
git config --global alias.one 'log --oneline'
git config --global alias.oneg 'log --oneline --graph'
git config --global alias.ci 'commit'
git config --global alias.cim 'commit -m'
git config --global alias.br 'branch'
git config --global alias.co 'checkout'
git config --global alias.rb 'rebase'
git config --global alias.rbc 'rebase --continue'
git config --global alias.rbs 'rebase --skip'
git config --global alias.rba 'rebase --abort'