DEV Community

Cover image for Fiz um push sem checar as alterações do repositório, e agora?
Nicolas Evangelista
Nicolas Evangelista

Posted on

Fiz um push sem checar as alterações do repositório, e agora?

*Este artigo foi escrito em conjunto com @donadonf *

Dentro de uma equipe de desenvolvimento nos deparamos com algumas demandas que são desenvolvidas por pares, alguns casos utilizam até a mesma branch para desenvolver a tarefa e fazem com que os desenvolvedores trabalhem 2 habilidades muito importantes: A comunicação e o versionamento de código. Neste artigo iremos tratar de uma situação que pode ser comum, podemos chamá-la de “Fiz um push e não sabia que a branch havia mudado, e agora?”.

Ao tentar fazer um push, provavelmente recebeu de volta uma mensagem indicando um conflito de branches, sendo a branch local em que está trabalhando e a branch remota, para onde irá o commit feito.

[rejected] master -> master (fetch first)
error: failed to push
Enter fullscreen mode Exit fullscreen mode

Bom, teremos um longo caminho pela frente, mas fique tranquilo porque há uma solução!

Primeiramente, devemos verificar os commits que já estão na branch remota e qual o nosso status em relação a ela, para isso podemos executar o comando:

git status
Enter fullscreen mode Exit fullscreen mode

Receberá uma informação sobre o status das branch em que está trabalhando, dessa forma:

On branch nome-da-branch
Your branch and 'origin/nome-da-branch' have diverged,
and have 1 and 1 different commits each, respectively.
Enter fullscreen mode Exit fullscreen mode

Isso indica que sua branch local está com um commit a ser enviado, mas está com um commit atrasado em relação a branch remota, nesse cenário é necessário puxar os dados da branch remota antes de realizar o push para que não tenha um conflito de versões de código.

Começaremos a solução do conflito entre as branches checando os logs dos commits feitos com o comando:

git log
Enter fullscreen mode Exit fullscreen mode

Vamos pegar o ID do último commit feito, porque aqui estaremos visualizando um histórico dos commits feitos. Com esse ID iremos executar um hard reset na branch atual e retirar o commit do HEAD com outro comando, então a sequência de comandos será a seguinte:

git reset --hard ID-do-commit

git reset HEAD~1
Enter fullscreen mode Exit fullscreen mode

Novamente, vamos checar o status das versões que estamos trabalhando com comando git status, veremos que alguns arquivos estão marcados como Changes not staged for commit, isso significa que o commit foi resetado corretamente e as alterações feitas não foram perdidas. Devemos então armazenar essas mudanças dentro do stash para que possamos fazer o commit mais tarde com o comando:

git stash
Enter fullscreen mode Exit fullscreen mode

Caso a operação ocorra bem, a mensagem será a seguinte:

Saved working directory and index state WIP on nome-da-branch: ID-do-commit-atual-da-branch 
Enter fullscreen mode Exit fullscreen mode

Devemos então executar o comando que irá mostrar a quantidade de arquivos que estão salvos no último stash feito.

git stash show
Enter fullscreen mode Exit fullscreen mode

Como os arquivos estarão salvos no stash e branch terá voltado ao mesmo estágio da branch remota, podemos dar sequência ao procedimento padrão de um commit. Iremos checar o status da branch remota com o git status e depois executar um git pull para receber as alterações feitas na branch remota.

Por fim, podemos retirar os arquivos do stash porque iremos utilizá-los agora:

git stash pop
Enter fullscreen mode Exit fullscreen mode

Isso irá trazer de volta as alterações feitas no commit que não conseguimos realizar o push. Caso esteja apavorado com a situação, poderá repetir o fluxo de visualizar o status da branch remota com git status e ver se há mais atualizações, poupando uma possível dor de cabeça. Caso não tenha nenhuma alteração, podemos seguir com o commit normalmente:

git commit -m "feat: texto-do-commit"

git push
Enter fullscreen mode Exit fullscreen mode

Dessa forma, podemos solucionar os conflitos de versões de uma forma simples e objetiva utilizando apenas o terminal do git.
É chegado o grande momento, podemos dormir tranquilos com as versões atualizadas e organizadas em nossas respectivas branches.

Top comments (1)

Collapse
 
luizmirand4 profile image
Luiz Miranda 👨🏻‍💻

Muito bom! Eu gosto de usar o git log com a flag --oneline