Guia Rápido de comandos git (lado usuário)

Configurações básicas e globais


Usuário e email para serem exibidos nos commites:
git config --global user.name "[seu nome]"
git config --global user.email [seu e-mail]

Cache local para credenciais de autenticação (Usuário/Senha):
Você pode armazenar em cache suas credenciais de autenticação, evitando assim redigitar o nome de usuário e a senha toda vez que você realizar um commit.
git config --global credential.helper cache

Desabilitar verificação de Certificado digital
Durante a execução
GIT_SSL_NO_VERIFY=true git clone https://username@git.example.com/scm/repository.git
Global
git config --global http.sslVerify false
Redefinir tempo de expiração do registro de log (reflog):
Global
git config --global gc.reflogExpire 180.days.ago
Sistema
git config --system gc.reflogExpire 12.months.ago
Projeto
git config gc.reflogExpire never

Tratamento de espaços em branco
git config --global apply.whitespace nowarn
git config --global core.whitespace nowarn


Definição de cores para o modo console:
git config --global color.branch auto
git config --global color.diff auto
git config --global color.status auto
git config --global color.interactive auto


Personalização individual de projeto para o diretório de git hooks
git config core.hooksPath .git-hooks


Personalização de permissões do sistema de arquivos para o diretório de projeto git
Atenção
core.fileMode não é a melhor prática e deve ser usada com cuidado. Essa configuração abrange apenas o bit de modo executável e nunca os bits de leitura / gravação. Em muitos casos, tem-se a ilusão de necessitar dessa configuração porque executou comandos para tornar todos os seus arquivos executáveis, como chmod -R 777. Mas na maioria dos projetos, a maioria dos arquivos não precisa e não deve ser executável por motivos de segurança. A maneira correta de resolver esse tipo de situação é manipular a permissão de pasta e arquivo separadamente, com algo como:
find . -type d -exec chmod a+rwx {} \; # Make folders traversable and read/write
find . -type f -exec chmod a+rw {} \;  # Make files read/write
Estes comandos são melhores indicados, e na maioria dos casos não será necessário utilizar core.fileMode, exceto em ambientes extremamente raros.
Definido falso para o projeto ativo
git config core.fileMode false
O parametro -c pode ser usado para definir esta opção em comandos únicos:
git -c core.fileMode=false diff
E o --global fará com que seja o comportamento padrão para o usuário conectado.
git config --global core.fileMode false


Definição Global de encode para Graphic User Inteface (GUI)
git config --global gui.encoding utf-8


Definir editor de texto padrão para o diretório de trabalho:
git config --global core.editor "vim";

Outros editores
Atom  $ git config --global core.editor "atom --wait"
nano  $ git config --global core.editor "nano -w"
BBEdit (Mac, with command line tools)  $ git config --global core.editor "bbedit -w"
Sublime Text (Mac)  $ git config --global core.editor "/Applications/Sublime\ Text.app/Contents/SharedSupport/bin/subl -n -w"
Sublime Text (Win, 32-bit install)  $ git config --global core.editor "'c:/program files (x86)/sublime text 3/sublime_text.exe' -w"
Sublime Text (Win, 64-bit install)  $ git config --global core.editor "'c:/program files/sublime text 3/sublime_text.exe' -w"
Notepad++ (Win, 32-bit install)  $ git config --global core.editor "'c:/program files (x86)/Notepad++/notepad++.exe' -multiInst -notabbar -nosession -noPlugin"
Notepad++ (Win, 64-bit install)  $ git config --global core.editor "'c:/program files/Notepad++/notepad++.exe' -multiInst -notabbar -nosession -noPlugin"
Kate (Linux)  $ git config --global core.editor "kate"
Gedit (Linux)  $ git config --global core.editor "gedit --wait --new-window"
Scratch (Linux)  $ git config --global core.editor "scratch-text-editor"
Emacs  $ git config --global core.editor "emacs"
VS Code  $ git config --global core.editor "code --wait"


Definir ferramenta de merge
git config --global merge.tool vimdiff
Definir arquivos a serem ignorados
git config --global core.excludesfile ~/.gitignore
Listar configurações de sessão
git config --list 
git config --list --show-origin
Remover configurações
git config --global --unset gui.encoding
Editar configurações através do arquivo
git config --global --edit
Configuração de case para gitignore no repositório ativo
git config core.ignorecase true


Configuração global de case para gitignore
git config --global core.ignorecase true


Listar todas as configurações definidas:
git config --global --list


Alias

Com o alias, você pode criar atalhos aos comando do GIT.

Criar Atalhos de comando:
  git config --global alias.co checkout;
  git config --global alias.br branch;
  git config --global alias.ci commit;
  git config --global alias.st status;
  git config --global alias.ls "log --stat";
  git config --global alias.lg 'log --graph --oneline --decorate --all';


# Logs detalhados em modo gráfico
git config --global alias.lsg "log --stat --graph";


# Pull tags
git config --global alias.pt '!git tag -l | xargs git tag -d && git fetch -t';

# Desfaz modificações de stash
git config --global alias.stash-unapply '!git stash show -p | git apply -R';

# Exibe os aliases configurados para sessão do usuário
git config --global alias.aliases "config --get-regexp alias";

Para usar o atalho de comando, digite por exemplo:
git st
git co
git lg
git stash-unapply
git aliases
Exibir git status modo curto:
git st --short
Definir configuração para git status modo curto:
Também é válido por projeto, bastando remover a diretiva --global
git config --global status.short true
Definir configuração para git status modo default:
git config --global status.short false


Limpar arquivos untracked do workdir
Git 2.11 and newer versions:
git clean -d -f .
Older versions of Git:
git clean -d -f ""

Trabalhando com Repositórios

Criar repositório
mkdir [dir]
cd dir
git init

Cópia de trabalho de um repositório remoto
git clone [origin] [nova pasta]

Cópia de trabalho de branch específico em um repositório remoto
git clone -b [branchname] [remote-url]
Cópia de trabalho parcial de um repositório remoto
parametro --depth define níveis a serem considerados.
git clone --depth [depth] [remote-url]
Desfazer git clone --depth
git fetch --update-shallow   # ou

git fetch --depth=[level] [remote-url]; # ou
git fetch --unshallow


# Acessar todos os branches
git config remote.origin.fetch "+refs/heads/*:refs/remotes/origin/*" git fetch origin
Cópia de trabalho parcial de um ramo específico em um repositório remoto
git clone [remote-url] --branch [name] --single-branch [folder]

Cópia de branch para outro repositório remoto

git push url://to/new/repository.git branch-to-move:new-branch-name

 

Acrescentando +uma URL remota ao diretório local

git remote add <alias-da-url> <url-do-projeto-original>

Adicionar arquivo(s) específicos ao próximo commit:
git add [arquivo1] [arquivo2] ...
git add -f [arquivo1]
ou para adicionar todos aquivos apresentados no git status ao próximo commit:
git add .

Remover arquivo do controle do repositório remoto:
git rm --cached [ARQUIVO]

Remover arquivo(s) do diretório de trabalho e do versionamento:
git rm [ARQUIVO]
git rm incolumepy/*.log

Renomear arquivo:
git mv [FILE_OLD_NAME] [FILE_NEW_NAME]

Mover arquivo(s):
git mv main.py incolumepy/
git mv *.log loggin/

Persistir as mudanças (commit)
git commit -m "[mensagem]"
git commit -m "[título mensagem]" -m "[descrição mensagem]"
git commit -m "[título mensagem]" -m "[descrição mensagem]" -m "[desfecho mensagem]"

Corrigir mensagem do ultimo commit
git commit --amend
git commit --amend -m "[mensagem]"
Adicionar alterações ao ultimo commit
git add alterações/esquecidas.txt
git commit --amend --no-edit


Editar timestamp do ultimo commit
git commit --amend --date="Wed Feb 16 14:00 2011 +0100" --no-edit

git commit --amend --date="2024/04/01 12:34:56.789 -0300" --no-edit

GIT_COMMITTER_DATE="Wed Feb 16 14:00 2011 +0100" git commit --amend --no-edit

GIT_COMMITTER_DATE="2024/04/01 12:34:56.789 -0300" git commit --amend --no-edit


Copiar commit específico para branch ativo
git cherry-pick -X ours "[hash do commit]"
git cherry-pick -X theirs "[hash do commit]"

Copiar um conjunto de commits para branch ativo
cherry pick permite que você informe o ID do commit inicial e o ID commit final, que aqui chamarei de A e B, respectivamente.
git cherry-pick A^..B # inclui o primeiro commit
git cherry-pick A..B # exclui o primeiro commit
Também permite que você informe o hash do commit inicial e final.
git cherry-pick [hash do primeiro commit]^..[hash do ultimo commit] #inclui o primeiro commit
git cherry-pick [hash do primeiro commit]..[hash do ultimo commit] # exclui o primeiro commit
Também permite que você informe a posição relativa ao branch inicial e final.
git cherry-pick master~4 master~2



Atualizar repositório local
git pull

Enviar atualizações ao repositório remoto
git push [origin] [branch]

Visualizar status do repositório local
git status

Verificar mudanças em arquivos no workspace
git diff

Verificar mudanças em arquivos adicionados em staged
git diff --staged

Verifica mudanças entre commits
git diff [ID1] [ID2]

git diff HEAD~..


Histórico dos commits
git log

Histórico dos commits em modo gráfico
git log --graph

Histórico dos commits em uma linha
git log --oneline

Histórico dos commits: Verificar mudanças aplicadas
git log -p

Histórico dos commits em uma linha (5 últimos)
git log --oneline -n5

Histórico dos commits em uma linha modo gráfico
git log --oneline --graph

Histórico dos commits detalhado
git log --stat

Histórico dos commits detalhado em modo gráfico
git log --stat --graph


Verificar mudanças em um commit específico
git show [ID]


Verificar mudanças em um arquivo de um commit
git show [ID] [arquivo]

Verificar mudanças em uma atualização
git show -U1


Rollback do commit atual
  • 1º modo: O ponteiro HEAD será movido para o commit anterior e as áreas de stage e working não serão alteradas.
    $ git reset --soft HEAD~
  • 2º Modo: O ponteiro HEAD será movido para o commit anterior ao atual, a área de stage terá o mesmo conteúdo do commit apontado pelo HEAD e o diretório de working não será modificado.
    $ git reset HEAD~
    ou
    $ git reset --mixed HEAD~
    
  • 3º Modo: O ponteiro HEAD será movido para o commit anterior e as áreas de stage e working serão revertidas para o mesmo estado do commit apontado pelo HEAD descartando completamente todas as modificações realizadas. Cuidado com esse procedimento pois não há como recuperar!
    git reset --hard HEAD

Voltando ao commit anterior, mas criando um novo commit
git revert HEAD

Voltando a um commit específico, e criando um novo commit
git revert --no-edit HEAD e27242bd40b9





Criando um workspace a partir de um novo repositório

echo "# a" >> README.md
git init
git add README.md
git commit -m "first commit"
git branch -M main #main ou master
git remote add origin git@github.com:britodfbr/a.git # github, gitlab, bitbucket, ou qualquer outro.
git push -u origin main




Adicionando um repositório remoto vazio em um workspace que contém commits

git remote add origin git@github.com:britodfbr/a.git
git branch -M main #main ou master
git push -u origin main




Adicionando um repositório remoto não vazio em um workspace que contém commits

git remote add origin git@github.com:britodfbr/a.git
git branch -M main #main ou master
git pull origin main --allow-unrelated-histories
git push -u origin main




Patches

Criando e aplicando vários patch de um branch
git checkout [branch]
git format-patch --stdout master > patch
git am --whitespace=nowarn patch




Trabalhando com Branches


Listar Branches disponíveis
git branch
git branch -a

Tornar Branches ativos
Somente um dos branches listados de cada vez.
git co branchname

Renomear um Branch
git branch -M [branchname] [newbranchname]
git co branchname
git branch -M [newbranchname]

Criar um Branch
git branch [branchname]

Criar e tornar ativo o novo branch
git checkout -b [branchname]

Criar um branch baseado em um ID de versionamento específico
git branch [branchname] [ID]

Persistir os branches criados no servidor remoto
git push --all

Persistir específicamente um branch criado no servidor remoto
git push [urlserver|aliasserver] [branchname]

Exemplos:
git push origin frontend

Trocar de Branch
git checkout [branchname]

Verificar o branch atual
git branch

Verificar detalhes de branches
git branch -v

Deletar um branch local
Remove o branch local somente se foi publicado (push) e mescardo(merge) com seu branch remoto
git branch -d [branchname]

Equivalente ao --delete --force, não há garantias e não poderá ser recuperado.
git branch -D [branchname]

Deletar um branch remoto
git push [remote_name] --delete [branchname]
git push origin :frontend

Mesclar de branches [branch1] ao [branch2]
git checkout [branch2]
git merge [branch1]
git checkout [branch2]
git merge --no-ff --autostash [branch1]

Copiar arquivos entre branches
git restore --source branch_name dir0/b.txt dir1/c.txt
git restore -s branch_name dir0/b.txt dir1/c.txt
git checkout branch_name -- dir0/b.txt dir1/c.txt
git checkout branch_dst
git diff branch_dst..branch_src -- dir0/a.txt dir1/c.txt|git apply

Copiar diretórios entre branches
git restore --source branch_name dir0/ dir1/
git restore -s branch_name dir0/ dir1/
git checkout branch_name diretorio/a/ser/copiado/


Trabalhando com Tags


Para listar TAG existentes
git tag -ln

Para criar uma TAG
git tag [tagname]

Exemplo tag chamada v0.01 no commit atual execute:
git tag v0.01

Para criar uma TAG referente ao commit específico
git tag [tagname] [ID]
exemplo tag v0.01 referente ao commit 4b8ef995de6d77:
git tag v0.01 4b8ef995de6d77
Para criar uma TAG com comentário e referente ao commit específico
git tag -f -a [tagname] -m 'comentario' [ID]
Exemplo:
git tag -f -a buildout_plone255 -m 'ambiente plone-2.5.5 com supervisor + haproxy' 87b29a

Para submete-la para o servidor remoto
git push --tags [alias-da-url] [branchname]
Exemplo:
git push --tags origin master

Para atualizar a informação de uma TAG local execute:

git push --tags [remoto][tagname] -f
git push --tags origin Unreleased -f

Para deletar uma TAG local execute:
git tag -d tagname

Para deletar uma TAG remota, execute uma das opções:
git push origin :tagname
git push -d origin tagname
git push --delete origin tagname
git push origin :refs/tags/tagname

Para voce mover para o commit da TAG execute:
git checkout v0.01

Para voce atualizar a listagens das TAG execute:
git pull --tags origin master

Para voce renomear TAG execute:
git tag new old
git tag -d old
git push origin :refs/tags/old
git push --tags

Estudo de caso Branch + Clone

git clone https://rbrito1978@code.google.com/p/templates-buildout/
git checkout p255
git branch -v
ou
git clone -o origin -b p255 https://rbrito1978@code.google.com/p/templates-buildout/


Clone parcial da árvore

Baixar apenas ultimo nó da árvore

git clone https://rbrito1978@code.google.com/p/templates-buildout/ --depth 1

Restaurar todos os nós da árvore

git fetch --unshallow


Rebase de Branch no Master

  • git co 1460729321
  • git branch
    * 1460729321
      master
    
  • git pull --rebase origin master
  • git co master
  • git merge origin/1460729321

Trabalhando com stash

Detalhes podem ser acompanhados em Git: stash.
O comando stash cria um Work In Progress (WIP), do estado atual do branch ativo, retornando-o para o momento anterior em que não havia alterações.
Isto é útil em situações em que há a necessidade de criar novos branches sem perder a codificação atual.
Criar stash:

  • git stash
Listar stash(es):
  • git stash list
Ativar último stash:
  • git stash apply
Ativar stash específico:
  • git stash apply stash@{2}
Ativar stash com Changes not staged:
  • git stash apply --index
Remover stash da pilha:
  • git stash drop
    $ git stash list
    stash@{0}: WIP on master: 049d078 added the index file
    stash@{1}: WIP on master: c264051... Revert "added file_size"
    stash@{2}: WIP on master: 21d80a5... added number to log
    
    $ git stash drop stash@{0}
    Dropped stash@{0} (364e91f3f268f0900bc3ee613f9f733e82aaed43)
    
Revert o último stash:
  • git stash show -p | git apply -R
Revert um stash específico:
  • git stash show -p stash@{0} | git apply -R
Criar um branch a partir de um stash:
  • git stash branch
Visualizar as diferenças do último stash:
  • git stash show -p
Visualizar as diferenças do um stash específico:
  • git stash show -p stash@{1}
Remover todos os stash(es):
  • git stash clear
stash parcial:
git stash -p
Com este comando abrirá um subterminal, equivalente ao git add -i, com as seguintes opções:
 
   y - stash this hunk
   n - do not stash this hunk
   q - quit; do not stash this hunk or any of the remaining ones
   a - stash this hunk and all later hunks in the file
   d - do not stash this hunk or any of the later hunks in the file
   g - select a hunk to go to
   / - search for a hunk matching the given regex
   j - leave this hunk undecided, see next undecided hunk
   J - leave this hunk undecided, see next hunk
   k - leave this hunk undecided, see previous undecided hunk
   K - leave this hunk undecided, see previous hunk
   s - split the current hunk into smaller hunks
   e - manually edit the current hunk
   ? - print help
   
git stash push -p -m "my commit message" ## ou
git stash push -m "My partial stash" -- app.config

reflogs - Registros Log de referência


O parametro reflog, permite gerenciar todo e qualquer tipo de alteração realizada no ponteiro HEAD. Exibir reflogs
git reflog show
Alterar período de reflogs em 180 dias
git config gc.reflogExpire 180.days.ago
Alterar período de reflogs em 18 meses
git config gc.reflogExpire 18.months.ago

Alterar período de reflogs para ilimitado
git config gc.reflogExpire never


Git hooks

Git hooks são scripts que rodam automaticamente cada vez que você realiza alguma ação específica no repositório Git. Eles permitem modificar o comportamento original dos comandos Git e adicionar funcionalidades personalizadas em vários estados do ciclo de desenvolvimento.

Os Git Hooks são bastante aplicados para encorajar políticas de commit, alterar algo do ambiente dependendo do estado do repositório ou implementar fluxos para workflow de Integração Contínua.

Os scripts git hooks originais, que podem servir como modelo, estão disponívels em todo workdir de projeto, em .git/hooks. Para ativar uma configuração customizada por projeto, faz-se necessários algumas personalizações.

Definir git hooks personalizado para o projeto

Os scripts para githooks devem estar presentes no ambiente de workdir, para surtir o efeito esperado. E para garantir que estejam em todos os ambientes do projeto, deve-se redefinir o hooksPath.

mkdir .git-hooks;
git config core.hooksPath .git-hooks;
cd .git-hooks;
touch README.txt;
git add . ;
git ci -m "Directory Custom githooks for the project";

Acrescentar git hooks

Atenção
A permissão de execução dos git hooks devem ser concedidas antes de seu respectivo commit, para preservação do filemode no repositório remoto.
A partir dos scripts de exemplo
cp -v .git/hooks/commit-msg.sample .git-hooks/commit-msg;
chmod +x .git-hooks/*;
git ci -m "githook commit-msg adding.";
A partir de outra origem
curl https://raw.githubusercontent.com/incolumepy-prospections/incolumepy.gwa/main/.git-hooks/commit-msg -o .git-hooks/commit-msg;
chmod +x .git-hooks/*;
git ci -m "githook commit-msg adding.";
githook para mensagem de commit personalizada
curl https://raw.githubusercontent.com/incolumepy-prospections/incolumepy.gwa/main/.git-hooks/commit-msg -o .git-hooks/commit-msg
chmod +x .git-hooks/*;
git ci -m "githook commit-msg adding.";
githook para validação do branchname
Com este hook, pode-se forçar que os nomes de branches possuam uma padronização. Impedido que sejam criados branchnames com nomes inadequados, ou que dificultem filtragem de registros.
curl https://raw.githubusercontent.com/incolumepy-prospections/incolumepy.gwa/main/.git-hooks/pre-commit -o .git-hooks/pre-commit
chmod +x .git-hooks/*;
git ci -m "githook commit-msg adding.";
githook para validação de mensagem de commit

Este githook força a utilização do Conventional Commits.

O que é a especificação do Conventional Commits? é uma convenção simples para utilizar nas mensagens de commit. Ela define um conjunto de regras para criar um histórico de commit explícito, o que facilita a criação de ferramentas automatizadas baseadas na especificação. Esta convenção se encaixa com o SemVer - Versionamento Semântico, descrevendo os recursos, correções e modificações que quebram a compatibilidade nas mensagens de commit.

A especificação completa pode ser acessada inglês ou em português brasileiro.

curl https://raw.githubusercontent.com/incolumepy-prospections/incolumepy.gwa/main/.git-hooks/prepare-commit-msg -o .git-hooks/prepare-commit-msg
chmod +x .git-hooks/*;
git ci -m "githook commit-msg adding.";

Troubleshooting



Conflito em atualização

Manter versão remota
git pull -X theirs
Manter versão local
git pull -X ours
Erro no processo de clonagem
Solução aumentar o buffer http
>>> fatal: the remote end hung up unexpectedly
git config --global http.postBuffer 524288000 # 500M
git config http.postBuffer 524288000 #500M
git config --global http.postBuffer 2048M #tamaho do buffer
git config --global http.maxRequestBuffer 1024M # tamanho máximo de requisição do buffer
git config --global core.compression 9 # compressão máxima para transmissão
git config --global pack.windowMemory 256m # Tamanho da janela de frame
git config --global pack.packSizeLimit 256m # Tamanho limite do frame

Recuperar commits/branches removidos acidentalmente

Para efeito de elucidação e esclarecimento, será utilizado a arvore abaixo:
* ade0441 (HEAD -> bugfix#7) update file 2021-12-01 11:05:47
| * 0af46cb (bugfix#8) update file 2021-12-01 11:03:49
| * 3b142e0 update file 2021-12-01 10:23:50
| * 103e1ba update file
|/  
* 8f1b741 (1638270076) teste em andamento
| * 5c9d60e (origin/enhancement#4, enhancement#4) Acrescimo do ambiente Python3.10 em teste automatos
| * 57fbae1 Tratativa em manter ambientes com versões fixadas pelo poetry.lock
| * 162de0d Tratativa em emover ambientes poetry
|/  
| * 00d8120 (origin/enhancement#5, enhancement#5) Test file to metrics
| * a86438d Metrics applied
|/  
* 73c56cf (origin/dev, dev) Bumping version from 0.2.3 to 0.2.4-alpha.0
*   09a3cc0 Merge branch 'enhancement#6' into dev

Observe que o bugfix#7 e bugfix#8 existem somente no Workdir.
Recuperar commits removidos acidentalmente
$ git st
No ramo bugfix#7
nothing to commit, working tree clean

$ git reset --hard HEAD~
HEAD is now at 8f1b741 teste em andamento

$ git lg
* 0af46cb (bugfix#8) update file 2021-12-01 11:03:49
* 3b142e0 update file 2021-12-01 10:23:50
* 103e1ba update file
* 8f1b741 (HEAD -> bugfix#7, 1638270076) teste em andamento
| * 5c9d60e (origin/enhancement#4, enhancement#4) Acrescimo do ambiente Python3.10 em teste automatos
| * 57fbae1 Tratativa em manter ambientes com versões fixadas pelo poetry.lock
| * 162de0d Tratativa em emover ambientes poetry
|/  
| * 00d8120 (origin/enhancement#5, enhancement#5) Test file to metrics
| * a86438d Metrics applied
|/  
* 73c56cf (origin/dev, dev) Bumping version from 0.2.3 to 0.2.4-alpha.0
*   09a3cc0 Merge branch 'enhancement#6' into dev
Suponha que durante o desenvolvimento, foi percebido que havia um erro, e em vez de executar "git checkout" foi executado "git reset". E o commit com todo o trabalho no branch bugfix#7 desapareceu da existência!!!
  • Localizar o hash do commit removido
    git reflog
          8f1b741 (HEAD -> bugfix#7, 1638270076) HEAD@{0}: reset: moving to HEAD~
          ade0441 HEAD@{1}: Branch: renamed refs/heads/recover2 to refs/heads/bugfix#7
          ade0441 HEAD@{3}: checkout: moving from ade0441fa047b661aa52a10deb0b59586ab37e3b to recover2
          ade0441 HEAD@{4}: checkout: moving from 1638270076 to ade0441
          8f1b741 (HEAD -> bugfix#7, 1638270076) HEAD@{5}: reset: moving to 8f1b741
          ade0441 HEAD@{6}: commit: update file 2021-12-01 11:05:47
          8f1b741 (HEAD -> bugfix#7, 1638270076) HEAD@{7}: reset: moving to 8f1b741
          0af46cb (bugfix#8) HEAD@{8}: commit: update file 2021-12-01 11:03:49
          
  • Copiar commit com hash encontrado para o branch ativo (bugfix#7)
    git cherry-pick ade0441
    git lg
        * 77916df (HEAD -> bugfix#7) update file 2021-12-01 11:05:47
        | * 0af46cb (bugfix#8) update file 2021-12-01 11:03:49
        | * 3b142e0 update file 2021-12-01 10:23:50
        | * 103e1ba update file
        |/  
        * 8f1b741 (1638270076) teste em andamento
        | * 5c9d60e (origin/enhancement#4, enhancement#4) Acrescimo do ambiente Python3.10 em teste automatos
        | * 57fbae1 Tratativa em manter ambientes com versões fixadas pelo poetry.lock
        | * 162de0d Tratativa em emover ambientes poetry
        |/  
        | * 00d8120 (origin/enhancement#5, enhancement#5) Test file to metrics
        | * a86438d Metrics applied
        |/  
        * 73c56cf (origin/dev, dev) Bumping version from 0.2.3 to 0.2.4-alpha.0
        *   09a3cc0 Merge branch 'enhancement#6' into dev
          
  • Recuperado =D
Recuperar branches removidos acidentalmente
$ git st
No ramo dev
Your branch is up to date with 'origin/dev'.

nothing to commit, working tree clean

git br -D bugfix#8
Deleted branch bugfix#8 (was 0af46cb).


$ git lg
* 85f238c (bugfix#7) update file 2021-12-01 11:05:47
* 8f1b741 (1638270076) teste em andamento
| * 5c9d60e (origin/enhancement#4, enhancement#4) Acrescimo do ambiente Python3.10 em teste automatos
| * 57fbae1 Tratativa em manter ambientes com versões fixadas pelo poetry.lock
| * 162de0d Tratativa em emover ambientes poetry
|/  
| * 00d8120 (origin/enhancement#5, enhancement#5) Test file to metrics
| * a86438d Metrics applied
|/  
* 73c56cf (HEAD -> dev, origin/dev) Bumping version from 0.2.3 to 0.2.4-alpha.0
*   09a3cc0 Merge branch 'enhancement#6' into dev

Ao remover o branch, em vez de "bugfix#7" foi executado "bugfix#8". E o branch bugfix#8 desapareceu da existência!!!
  • Localizar o hash do commit removido
    git reflog
            73c56cf (HEAD -> dev, origin/dev) HEAD@{0}: checkout: moving from dev to dev
            73c56cf (HEAD -> dev, origin/dev) HEAD@{1}: checkout: moving from bugfix#7 to dev
            85f238c (bugfix#7) HEAD@{2}: cherry-pick: update file 2021-12-01 11:05:47
            8f1b741 (1638270076) HEAD@{3}: reset: moving to 8f1b741
            77916df HEAD@{4}: cherry-pick: update file 2021-12-01 11:05:47
            8f1b741 (1638270076) HEAD@{5}: reset: moving to HEAD~
            ade0441 HEAD@{6}: Branch: renamed refs/heads/recover2 to refs/heads/bugfix#7
            ade0441 HEAD@{8}: checkout: moving from ade0441fa047b661aa52a10deb0b59586ab37e3b to recover2
            ade0441 HEAD@{9}: checkout: moving from 1638270076 to ade0441
            8f1b741 (1638270076) HEAD@{10}: reset: moving to 8f1b741
            ade0441 HEAD@{11}: commit: update file 2021-12-01 11:05:47
            8f1b741 (1638270076) HEAD@{12}: reset: moving to 8f1b741
            0af46cb HEAD@{13}: commit: update file 2021-12-01 11:03:49
            3b142e0 HEAD@{14}: commit: update file 2021-12-01 10:23:50
            103e1ba HEAD@{15}: commit: update file
            8f1b741 (1638270076) HEAD@{16}: rebase (finish): returning to refs/heads/1638270076
            8f1b741 (1638270076) HEAD@{17}: rebase (pick): teste em andamento
            73c56cf (HEAD -> dev, origin/dev) HEAD@{18}: rebase (start): checkout dev
          
  • Recriar o branch bugfix#8 com hash encontrado
    git co -b bugfix#8 0af46cb
    git lg
            * 85f238c (bugfix#7) update file 2021-12-01 11:05:47
            | * 0af46cb (HEAD -> bugfix#8) update file 2021-12-01 11:03:49
            | * 3b142e0 update file 2021-12-01 10:23:50
            | * 103e1ba update file
            |/  
            * 8f1b741 (1638270076) teste em andamento
            | * 5c9d60e (origin/enhancement#4, enhancement#4) Acrescimo do ambiente Python3.10 em teste automatos
            | * 57fbae1 Tratativa em manter ambientes com versões fixadas pelo poetry.lock
            | * 162de0d Tratativa em emover ambientes poetry
            |/  
            | * 00d8120 (origin/enhancement#5, enhancement#5) Test file to metrics
            | * a86438d Metrics applied
            |/  
            * 73c56cf (origin/dev, dev) Bumping version from 0.2.3 to 0.2.4-alpha.0
            *   09a3cc0 Merge branch 'enhancement#6' into dev
    
          
  • Recuperado =D


Atualizações

  • 01/03/2013 09:20
  • 04/11/2013 09:15
  • 22/05/2018 11:47
  • 20/11/2018 11:33
  • 01/01/2019 09:25
  • 23/03/2019 07:56
  • 28/03/2019 09:35
  • 31/03/2019 21:19
  • 18/04/2019 16:28
  • 03/06/2019 15:11
  • 22/11/2019 15:34
  • 20/12/2019 11:07
  • 03/02/2020 23:00
  • 23/02/2020 08:52
  • 30/03/2020 08:25
  • 14/04/2020 11:41
  • 27/04/2020 09:53
  • 03/08/2020 10:30
  • 12/08/2020 00:21
  • 18/08/2020 16:04
  • 30/11/2020 13:23
  • 01/12/2020 06:31
  • 01/12/2020 21:45
  • 11/12/2020 14:58
  • 02/02/2021 10:41
  • 15/05/2021 09:29
  • 22/07/2021 08:53
  • 19/10/2021 09:52
  • 29/11/2021 22:06
  • 30/11/2021 08:42
  • 02/12/2021 07:29
  • 02/01/2022 09:50
  • 06/01/2022 08:09
  • 07/01/2022 09:49
  • 25/01/2022 08:34
  • 26/01/2022 08:05
  • 10/03/2022 15:51
  • 22/04/2022 11:13
  • 26/04/2022 14:13
  • 20/03/2023 15:07
  • 24/10/2023 11:28
  • 23/11/2023 06:48
  • 24/12/2023 09:14

Referências

  • https://stackoverflow.com/a/5017265/5132101

Comentários