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.