Git: como voltar no tempo

O objetivo desse guia é ensinar você a voltar no tempo em um projeto que esteja sendo versionado com o Git. Eu vou usar como exemplo o meu projeto pomointer. Eu quero refaze-lo do zero e não quero criar um repositório novo para isso, apenas criar uma branch que aponte para o primeiro commit.

O comando que iremos usar será esse(não insira o $ que está no inicio de cada exemplo):

$ git branch <nome> <commit>

Onde <nome> é o nome(bruh) e <commit> será todo(ou parte) do hash do commit para o qual desejamos voltar. Pense no hash do commit como sendo um id. Todo commit possui o seu e é unico. Para visualizar o histórico ou log de commits, use o seguinte comando:

$ git log
    
commit 8729e5cef0ede2a26b05b41cfeecbdc5f5e28d0c (HEAD -> master, origin/master, origin/HEAD)
Author: José Isac <joseisac@tutamail.com>
Date:   Sat Feb 14 13:25:48 2026 -0300

    Makefile: fix error while installing man pages

    Before, if directories didn't exist, it would gives an error while
    installing and wouldn't install the man pages.

commit e33c13f3dfbdb358fd9a1e93141b636aabcadc1c
Author: José Isac <joseisac@tutamail.com>
Date:   Thu Feb 5 01:17:04 2026 -0300

    doc: add pdf  versions of the manual  
    
...
# CONTINUA

O hash é aquela comprida sequência de caracteres após a palavra "commit". A menos que o commit para o qual você deseja voltar esteja perto do topo, procurar por ele será um saco(e verboso). Tem como melhorar. Primeiro vamos filtrar essa saída para conter apenas as informações que precisamos: o hash e o título do commit.

$ git log --pretty=oneline
    
8729e5cef0ede2a26b05b41cfeecbdc5f5e28d0c (HEAD -> master, origin/master, origin/HEAD) Makefile: fix error while installing man pages
e33c13f3dfbdb358fd9a1e93141b636aabcadc1c doc: add pdf  versions of the manual
952cdde5d998a42c1e34ebb89a29746000255c8f (tag: v1.0.1) Makefile: update version number to v1.0.1
52cc90fdcadac5be3843fe72b9cb29024296b4e3 doc: replace section names
a10fed4edb519bc9ec362e0da11c31431cb8404b (tag: v1.0) Makefile: add rule dist and use 
VERSION variable
...
# CONTINUA

Se você assim como eu coloca a mensagem do primeiro commit algo como "Initial commit" você pode ir direto ao ponto executando algo como:

$ git log --pretty=oneline --grep="Initial"
    
99d25430a158114a2c52702b13ac9ab487691f5b Initial commit

Ou você pode exibir a saida em ordem inversa:

$ git log --pretty=oneline --reverse

99d25430a158114a2c52702b13ac9ab487691f5b Initial commit
4bd972bbfb8591647ce571ca6a04609362a87e81 docs: create TODO file
20953673a8487c9b809220e3d271f21b41e0c406 feat(util.h): create header with some util 
functions
c930f5ff503687e224e4b0369e099476302ef7f6 feat(example2.txt): add a basic example
ce479817af41a56c3c39bbee0e0dc6a7d71d38dd feat(util.h): function to strip strings
...
# CONTINUA

Você também pode exibir commits após/antes de dia ou hora.

$ git log --pretty=oneline --after="28/01/2026" --before="03/02/2026"

4724811bf8dafe9e1a871a60c6d5b03fd3fd3e4a README: update indtruction to run a example
ee6c1e52068329a69286f982dc698e8c53438048 README: include full name of the program
594ace73288f30969a181fb314b70f09dad89591 README: remove blank line
6aba61699c8b9161fa3e2cacfc252acc340ebced README: create README file
74a2391df52d0650a25290e8b30627c38d2a51dc pomofile.c: fix bug of not printing hours and minutes
...
# CONTINUA

Leia git-log(1) para mais opções de filtragem. Depois que você encontrou o commit, é só pegar seu hash e executar aquele comando que mostrei no inicio, nomeando a branch da maneira que você achar melhor.

$ git branch remake 99d25430a158114a2c52702b13ac9ab487691f5b

Mudando de branch:

$ git checkout remake
Switched to branch 'remake'

$ ls
Makefile
examples
src

Pronto, agora é só programar.

Há uma forma mais rápida de criar a branch se você conseguiu fazer a saida do git log ter somente uma linha. Vou usar a minha saida por exemplo. Substitua o comando antes de '|' pelo seu se e somente se sua saída tiver tido somente uma linha.

$ git branch remake $(git log --pretty=oneline --grep="Initial" | cut -f 1 -d ' ' -)

O comando cut -f 1 -d ' ' - retorna a primeira coluna da string usando um espaço como delimitador de colunas e usando stdin como arquivo(o hifen sozinho ao final) a ser processado.