Skip to content

Instantly share code, notes, and snippets.

@renatoapcosta
Last active November 27, 2022 22:10
Show Gist options
  • Save renatoapcosta/966a37599d8b706f46b58672b756b7d4 to your computer and use it in GitHub Desktop.
Save renatoapcosta/966a37599d8b706f46b58672b756b7d4 to your computer and use it in GitHub Desktop.
GIT

GIT

INSTALL

linux

sudo apt-get install git-core git-svn ssh

windows

msysgit git for windows versão preview 

mac

sudo port install git-core +svn
brew install git

AMBIENTE

keys ssh

ssh-keygen -t rsa
	rsa é o algoritmo
	~/.ssh/ pasta dos arquivos
	id_rsa     - chave privada
	id_rsa.pub - chave publica

estabelecendo uma identidade nos commits

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]"

.gitconfig

[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'

crie o arquivo .bash_profile

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\] $ "

Comandos

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é

estrutura

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

Navegando pelos HEAD

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

Stashes

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

Branch

* 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

Deletando branch

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.

Rebase

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

Repositório Remoto Repositório Centralizado

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>

Tags

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

Exemplos

Fazer um merge

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

Fazer um rebase para resolver conflito

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

Fazer um merge para resolver conflito

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

Como contribuir sem pull request

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

Criar alias de comando

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

Apagar branch remoto

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

Apaga um commit executado somente no local, sem push

git reset HEAD~1 --soft

Copiando um repositorio

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

Ignorando final de linha

git config --global core.autocrlf true

Problemas SSL no git

git config http.sslVerify "false"

Helps

Commit com push foi realizado e uma tag tb foi criada, como desfazer

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"

Coloquei mais arquivos no staged e commitei sem push

Ai preciso desfazer o ultimo commit

git reset HEAD~1

Todos os arquivos voltam para o staged area para fazer o commit certo.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment