Git reflog, salvador de emprego da sexta feira da maldade

Primeiro a historinha

Era uma bela quarta feira e não era dia de maldade. Meu colega backender me avisa que eu podia retomar uma tela em que ambos estávamos trabalhando e me disse que ele já tinha terminado a parte dele (sim, onde trabalho os backenders mexem no HTML e JS =P).

Eu tinha parado de trabalhar na tela quinze dias atrás, já que o backender estava enroscado em um bug do IE9 (sim, nós ainda damos suporte =|).

Como de costume e meio no automático, checkoutei a branch dele e fiz update (fetch e pull) dos arquivos em todas as pastas (pequenos projetos independentes) que fazem parte do projeto grande (tudo automatizado num shellzinho básico).

Enquanto pensava na imortalidade do caranguejo, fiquei olhando as mensagens do git pra ver se tinha dado tudo certo e… tudo deu certo! (ufa! shellzinho salvador) =]

Como sou gata escaldada (e por logica tenho medo de agua fria), queria confirmar se estava realmente tudo OK, então entrei na primeira pasta dei aquele git status básico de todos os dias e tudo tava OK. =D

Entrei na segunda pasta, outro git status e tudo OK também. Então entrei na pasta dos arquivos estáticos (onde efetivamente ia mexer), dei o git status básico (só pra descargo de consciência) e pronto! o git me diz que minha pasta estava 1 commit a frente do repositorio remoto. WTF!?

Eu em minha sã consciência pensei: – “A $%#&* do shell fez caca e acabou fazendo algum merge errado”. Detalhe para o fato de que eu uso esse script todos os dias e isso nunca aconteceu, mas vai sabe né, sempre tem uma primeira vez pra tudo (até para minha estupidez kkk).

Então, ainda no semiautomático, fui lá, checkoutei o master, excluí a branch local cagada (-.-‘) e checkoutei a branch do meu colega de novo. Dei um git status e para a minha felicidade tudo zerado, lindo e maravilhoso (oh paz! #sqn).

Buildei o projeto inteiro (backend + frontend) e iniciei o servidor (weblogic). Abri o browser, acessei a tela em questão e… páh! o layout estava errado (O.o). Faltava aproximadamente um dia de trampo que eu tinha certeza absoluta que tinha feito.

Admito que fiquei com cara de pastel por uns dez minutos. Como tinha duas pessoas trabalhando na branch, perguntei pro meu colega se tinha dado algum problema no merge das coisas dele com as minhas e ele disse que não. Expliquei que estava faltando todo um pedaço da tela que eu tinha feito e ele disse que sim, que tinha percebido, e que não tinha entendido nada pois eu tinha falado que estava pronto.

Bom, no primeiro momento de pânico pensei: “estou ficando louca e imaginei que fiz o componente”. Só que o sentimento de “tem algo errado” continuava comigo. É aí que lembrei do commit “sobrando” e tudo começou a fazer sentido… Eu não tinha feito push do meu commit =~[ e pra melhorar a coisa, eu tinha deletado mais de um dia de trabalho.

Lembram que falei que sou gata escaldada? então, já tive minha cota de cagadas erros com git e a muiiito tempo atrás, perdi quase uma semana de trabalho, não lembro exatamente porque, mas meu colega (monstrão de git), tinha me falado que se eu não tivesse feito uma cagada encima de outra tentado arrumar teria dado pra recuperar, lembrando disso decidi não digitar mais nada e fui pesquisar no pai dos burros Google.

Após varias pesquisas, leituras e fracassos, já estava desistindo quando encima do parágrafo que eu estava lendo, vi duas palavras que me trouxeram uma vaga lembrança, dizia algo sobre o git reflog.

Vamos ao que realmente interessa =P

O reflog (vem de reference logs) é um comando do git que gerencia um “log diferentão” ou “histórico de referências salvador da humanidade” para os mais íntimos.

Reference logs, or “reflogs”, record when the tips of branches and other references were updated in the local repository.
Documentação do git

Ou seja, o reflog é um lugar mágico onde o git registra silenciosamente onde está sua cabeça o HEAD cada vez que você faz alguma mudança nele. Cada vez que você fizer um commit, trocar uma branch por outra, excluir arquivos (e commitar), fizer um reset –hard (é, também isso é registrado), ou qualquer outra mudança, o reflog é atualizado.

Pronto! eu estava salva (teoricamente), pois só precisava ver se isso (o arquivo reflog) realmente existia e se eu conseguia fazer funcionar (eis aí a grande questão ;P).

Visualizando o log chiquérrimo

Visualizar o reflog é tão simples quanto digitar

Ao digitar esse comando (dentro do seu projeto e na branch em questão, claro) vai aparecer uma lista tipo esta:

git-reflog

Nessa lista basicamente estarão todas as alterações do seu HEAD até este momento, listadas em ordem inversa (formato de pilha), ou seja, a última alteração é a primeira da lista ou HEAD@{0}. Lindo, né!?

Como eu sou foda gata escaldada (=D) costumo colocar mensagens de commit que fazem sentido e são ligeiramente explicativas (ou seja, nada de mensagens tipo “alterações” ou “correções” só), então foi relativamente fácil achar o momento específico em que fiz a cagada cometi meu deslize e recuperar foi relativamente simples.

Detalhe para o fato de que eu só aprendi a escrever mensagens ligeiramente decentes depois de ter que fazer um git bisect (cagando vivendo e aprendendo) em um projeto gigante que tinha mais de seis meses de desenvolvimento e quase dez pessoas estavam trabalhando nele (foi hard :|).

Recuperando a cabeça o emprego

Assim que achei o que desejava recuperar, pegar de volta meu emprego commit foi bem simples.

Bastou digitar:

Onde n corresponde ao número daquele momento fatídico que se deseja recuperar.

Observação de utilidade pública

Recomendo que criar uma branch (partindo da branch em que está rolando a parada toda) para a recuperação, e só depois fazer o reset. Afinal de contas é um reset e se tiver mais commits depois daquele momento que se quer recuperar, com o reset vai se perder tudo.

Fim da tortura

Depois de fazer o reset é só “commitar” e fazer um merge desta branch de recuperação pra dentro da branch em que estava trabalhando. Com o merge das branchs, tanto os commits perdidos e recuperados quanto os commits atuais ficarão lindos e juntinhos. Sexta feira da maldade salva!!! =D

E para finalizar

Bom, como devem ter percebido, tudo correu perfeitamente bem e ninguém viu (se ninguém viu, não aconteceu kkkk), então foi só seguir o dia de trabalho normalmente e com a maior felicidade possível.

Fiquei tão feliz que decidi escrever este post e retomar o blog. Com um pouco de sorte escreverei mais semana que vem, sobre o que? só (coloque aqui a sua deidade favorita) sabe.

Até a próxima e façam bom uso do reflog!

PD: A frase que deu título ao post veio do mano Willian Martins no slack do ABC-dev quando comentei sobre o que tinha me acontecido, palmas para ele!