sudo apt-get install git-core git-svn ssh
msysgit git for windows versão preview
sudo port install git-core +svn
brew install git
ssh-keygen -t rsa
rsa é o algoritmo
~/.ssh/ pasta dos arquivos
id_rsa - chave privada
id_rsa.pub - chave publica
Existe 3 nivel de config
git config --system
Configuração para toda máquina e qualquer usuário
git config --global
Configuração para o seu usuário
git config --local
Configuração para o seu projeto
Vamos editar essa configuração com qualquer editor:
git config --global core.editor vim
git config --global --edit
Podemos configurar o vscode como editor
git config --global core.editor code
git config --global --edit
.gitconfig
[core]
editor = code --wait
$ git config --global user.name "renatoapcosta"
$ git config --global user.email "[email protected]"
[user]
name = renatoapcosta
email = [email protected]
[color]
status = auto
branch = auto
interactive = auto
diff = auto
Criando alias
[alias]
s = !git status -s
c = !git add -all && git commit -m
l = !git log --pretty=format:'%C(blue)%h%C(red)%d %C(white)%s - %C(cyan)%cn,%C(green)%cr'
parse_git_branch() {
git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/ (\1)/'
}
export PS1="\u@\h \[\033[32m\]\w\[\033[33m\]\$(parse_git_branch)\[\033[00m\] $ "
git remote show origin
#Consulta detalhes do repositorio remoto
git init
#Cria uma pasta .git
git status
#mostra o nome da branch atual
#mostra os arquivos untracked ( arquivos não gerenciado pelo git)
#mostra os arquivos para ser comitados.
#proximos comandos a ser executados
git add <file>
#Coloca arquivos na area de indice ou stage.
git add <file> -f
#Adiciona um arquivo de forçadamente na área de stage, msmo arquivos ignorados.
git rm --cached <file>
#Remove arquivos novos da área de indice ou stage.
git reset HEAD <file>
#Remove arquivos modificados do índice ou stage
git checkout
#reverte edição de um arquivo gerenciado pelo git
git help <comando>
#Ajuda
git commit -m "init commit"
#Envia os arquivos da área stage/index e envia para repositório
git commit -m "Refazendo um commit" --amend
#Refazer um commit que não foi encaminhado para servidor remoto
#Indicado para remendar um commit que não foi enviado para o remote
git ommit -a -m "comentario"
#O -a adiciona arquivos modificados da working area ara o indice antes de fazer o commit.
#Somente os arquivos gerenciados pelo git é adicionado no stage, para ser commitado
git log
#Para ver os commits realizado
#Informa também o sha1 (chave)
git log --graph
Lista os commits com uma linha das sequencias
git log --stat
Mostra também os arquivos modificados e o que mudou
git log --pretty=oneline
Mostra de forma resumida
git log --pretty=format:"[%an %ad] %h - %s"
%an - nome autor
%ad - data
%h - hash abreviado
%s - assunto
git log --pretty=format:"[%an %ad] %h - %s" --graph
git log --since=30.minutes
30.minutes - desde 30 minuto
1.hours - desde 1 hora
git log --since=4.hours --until=3.hours
since = desde
until = até
O git possui 3 areas:
* repositorio ( o proprio diretorio )
* working area - directory ( diretorio de trabalho )
* stage/indice - ( area temporaria, reservada para armazenar os arquivos antes do commit.
Um arquivo pode estar no estados:
untracked ( não gerenciado pelo git ) -> stage -> repositório
posso retirar do index/stage com git rm --cached
posso passar do index/commit para repositório usando commit
modified ( gerenciado pelo git )
posso retirar do index/stage com git reset HEAD e depois git checkout
posso passar do index/commit para repositório usando commit
.gitignore
Este arquivo contém informações para o git ignorar pastas e arquivos
git reset HEAD~1 --hard
Volta ao HEAD anterior, voltando n commits para traz.
Neste caso voltou um commit para traz
git reset HEAD~1 --soft
Ele volta os commits, mas não as modificações atuais.
git clean -f
Limpa arquivos que não foram comitados, limpando o diretorio de trabalho
git clean -f -d
Limpa toda branch eliminando diretorio e arquivos
git reflog
Lista todos commit realizado
git merge <sha1>
Reverte para a versão especificada pela chave sh1
Aprendemos que o git possui 3 áreas:
working area ( diretorio atual)
index/stage ( área pré commit )
repositório ( pasta .git )
Mas ainda existe outra área chamada: stash
Esta área de stash salva tudo que está na área de stage/index, retirando do stage
para usar o stage:
primeiro movo tudo para área de indice
git stash
Não utilize muito stash, pois é uma área temporaria
git stash
Move arquivos do indice para uma nova área
git stash save "nome do stash"
Move arquivos do indice para uma nova área nomeada
Podemos criar diversas áreas de stages
git stash list
Lista todos arquivos que estão na área de stash
git stash apply
Retorna os arquivos da área de stash para index novamente
Retorna a stash atual
git stash apply stash@{0}
Retorna o stash especificado
git stash pop
Retorna o stash atual para área de stage e remove o stash
git stash clear
Limpa a área de stash
git stash drop <codigo>
Apaga stash designado pelo código
* Não trabalhe na branch master
git branch
Para checar nosso branch atual
git checkout -b desenvolvimento
Cria uma nova branch com nome desenvolvimento
git checkout -b temp <sha1>
Cria um branch com nome temp apartir de um commit <sha1>
git checkout master
Volta para a branch master
git merge <nome-branch>
unifica o nome-branch com o branch atual
Exemplo, a branch master vai ser mergiada com os dados de develop
Entro na branch master e executo
git merge develop
git rebase <nome-branch>
mescla o branch atual com o branch especificado <nome-branch>
git merge <nome-branch> --squash
faz o merge agrupando todos os commits em um
Excluir branch local
git branch -d <nome-branch>
Para remover uma branch local
git branch -D <nome-branch>
Remove um branch local mesmo que não foi feito merge
Excluir branch remota
git push origin --delete <nome-branch>
Para remover uma branch remota
ou
git push origin :<nome-branch>
Tente sincronizar sua lista de branches:
git fetch -p
A flag -p
significa "prune" (remover). Depois de fazer o fetch, os branches que já não existem mais remotamente serão excluídos.
Branch foi feito para ser usado
git rebase --continue
Commita o merge manualmente
git rebase --skip
Para nao aplicar o commit de desenvolvimento, onde perde
git rebase --abort
Para eu poder pensar no que faze
O git é baseado em arquivos
Então posso fazer um clone de uma pasta
git clone pastaprojeto/.git novapasta
Nesta nova pasta criada
git remote
origin
git remote show origin
Mostra o local de onde fez o clone
Assim como master é a convenção para o primeiro branch local
origin é a convenção para o primeiro branch remoto
git branch
mostra somente o branch master
git branch -a
mostra o branch master e os outros branch remoto
Ele não traz os outros branches
Para recriar os outros branch
git checkout -b desenvolvimento origin/desenvolvimento
Mude um arquivo a.txt e commit
Envie as modificaçoes
git push origin desenvolvimento
Neste caso eu posso empurrar da novapasta para pastaprojeto
mas posso ir na pasta pastaprojeto e
git remote add origin ../novapasta/.git
Neste momento tenho mão dupla
git remote show origin
git branch -a
para puxar o branch desenvolvimento
git pull origin desenvolvimento
Vá em novapasta
Altere e commit um arquivo na branch desenvolvimento
Vá na pasta pastaprojeto
git pull origin desenvolvimento
A alteração vai ser baixada
Vamos criar uma pasta repos/demo.git
git init --bare
Cria neste diretório oque estaria dentro da pasta .git
Cria sem uma área de trabalho
Vá na pasta ~/.ssh
Vai no arquivo authorized_keys
Copie a chave publica
Em outras máquinas crie dois projeto e sincronize
git remote add usuario_server@host_server:repos/demo.git
git checkout -b desenvolvimento origin/desenvolvimento
git checkout -b desenv origin/desenv
git checkout -b develop origin/develop
modifique um arquivo e commit
git fetch origin
Para atualizar o local com dados do remote
ele não sobrescreve os branch locais ( origin/desenvolvimento )
git rebase origin/desenvolvimento
Ele vai dar o conflito
Edit e conserte o conflito
git add arquivo_em_conflito
git rebase --continue
git push origin desenvolvimento
O usuario 2
git pull
### Repositório Remoto Repositório Central ###
git fetch origin master
Baixa do servidor remote para origin/master
Mas não altera master local
git merge origin/master
Mergeia do origin/master para master
git rebase origin/master
git push
fork
pull_request
git diff <nome-branch>
Lista tags local
git tag -l
Lista as tags remoto
git ls-remote --tags origin
Cria uma tag do branch corrente
git tag v1.0
Envia a tag para servidor remoto
git push origin v1.0
Envia todas as tags para servidor remote
git push --tags
Crie uma branch apartir da master
git checkout -b temp
Vá para a branch temp
git checkout temp
Faça um merge com a branch desenvolvimento
git merge desenvolvimento --squash
Faça um commit com o nome desejado
git commit -m "Nome de todas as funcionalidade squash"
Volte para a branch master
git checkout master
Mergeie o temp no master
git merge temp
Apague o branch desenvolvimento com -D
git branch -D desenvolvimento
Crie uma nova branch apartir do master
git checkout -b desenvolvimento
Vá para branch desenvolvimento
git checkout desenvolvimento
Altere um arquivo a.txt
vim a.txt
Commit a alteração
git commit -a -m "simulando conflito 1"
Volte para branch master
git checkout master
Altere o mesmo arquivo
vim a.txt
Commit o alteração
git commit -a -m "simulando conflito 2"
Vá para a branch desenvolvimento
git checkout desenvolvimento
Use sempre o master como referencia, traga o master para desenvolvimento
git rebase master
Vai dar menssagem de conflito, neste momento estou em outra branch
Nesta branch o git sugere 3 opções:
git rebase --continue
git rebase --skip
git rebase --abort
Abra o arquivo conflitante e mergeie manualmente
vim a.txt
Adicione este arquivo no indice/stage
git add a.txt
Agora execute o rebase continue
git rebase --continue
O rebase vai deixar somente um linha no historico linear
O commit de junção vai ser alterado e pode dar problemas se o mesmo estiver remoto
Crie uma nova branch apartir do master
git checkout -b desenvolvimento
Vá para branch desenvolvimento
git checkout desenvolvimento
Altere um arquivo a.txt
vim a.txt
Commit a alteração
git commit -a -m "simulando conflito 1"
Volte para branch master
git checkout master
Altere o mesmo arquivo
vim a.txt
Commit o alteração
git commit -a -m "simulando conflito 2"
Faça um merge com desenvolvimento
git merge desenvolvimento
ELe vai indicar conflito, resolva
vim a.txt
Adicione o arquivo no stage
git add a.txt
Commit tudo
git commit -m "Conflito com merge"
O ruim dessa forma é que a linha principal fica com as branchs
Esse é ideal se voce quisar manter o historico dessas branches
Faça um fork
git format-patch master --stdout > ova_funcionalidade.diff
Cria um arquivo com o commit
Crie um branch para receber este diff
git am /tmp/nova_funcionalidade.diff
Abra o ~/.gitconfig
[alias]
ll = log --pretty=format:"%C(yellow)%h%Cred%d\\ %Creset%s%Cblue\\ [%cn]" --decorate --numstat
Depois digite git ll
Ele vai mostrar os arquivos alterados dentro de cada log
Em sua branch local volte um commit
git reset HEAD~1 --hard
Depois as modificações para o remoto
git push --force origin feature/nome_branch
Se a branch não existe ainda use
git push --set-upstream origin develop
git reset HEAD~1 --soft
Crie o novo repositorio
git clone repositorio-old
Após clonar entre neste repositorio:
git remote set-url origin link-repositorio-novo
Agora o repositorio local estará apontando para o repositorio novo
git push -u origin master
git -c filter.lfs.smudge= -c filter.lfs.required=false -c diff.mnemonicprefix=false -c core.quotepath=false --no-optional-locks clone https://[email protected]/sulamericaic/reembolso-lista.git C:\Users\RAC0518\Documents\reembolso-lista
git config --global core.autocrlf true
git config http.sslVerify "false"
Voltar o commit
git reset --hard <hash>
Ele apaga aqui na maquina
Removendo a tag no servidor
git push --delete o 2.0.0
Remover a tag local
git tag -d "2.0.0"
Verificar as tags criada
git tag
Fazer novos commits e push, mas precisa forçar
git commit -m 'novo commit'
git push o master -f
// Precisamos do -f pq o servidor está com um commit a mais, ele iria pedir para eu dar pull, mas não queremos isso
Agora criar a nova tag novamente
git tag -a "2.0.0" -m "2.0.0"
Ai preciso desfazer o ultimo commit
git reset HEAD~1
Todos os arquivos voltam para o staged area para fazer o commit certo.