Git, quero desfazer tudo! Comandos de correção de erros

imagem



Git é um sistema prático, mas complexo. A dificuldade, em primeiro lugar, é que por descuido você pode cometer um erro, que é difícil ou mesmo impossível de corrigir. A documentação do Git fornece descrições de muitos comandos para ajudá-lo a corrigir um bug.



Mas o fato é que, para resolver o problema, você precisa saber o nome exato do comando. E aqui temos o típico problema do ovo e da galinha. Este artigo descreve os comandos que ajudam a resolver situações problemáticas.



Droga, fiz algo errado. Dê-me uma máquina do tempo mágica!



git reflog
# you will see a list of every thing you've
# done in git, across all branches!
# each one has an index HEAD@{index}
# find the one before you broke everything
git reset HEAD@{index}
# magic time machine
      
      





imagem



Este comando permite que você recupere dados excluídos acidentalmente revertendo a mesclagem que causou o problema. refLog é usado com freqüência - digamos, obrigado por sugerir a adição deste comando.



Fiz um commit, mas imediatamente notei um erro, ele precisa ser consertado!



# make your change
git add . # or add individual files
git commit --amend --no-edit
# now your last commit contains that change!
# WARNING: never amend public commits
      
      





O comando torna possível corrigir pequenas coisas desagradáveis ​​- quando você cometeu algo e então viu um problema como a falta de um espaço após o sinal "=". Sim, é possível fazer alterações com um novo commit combinando os dois com rebase -i. Mas é um longo caminho a percorrer.



NB! Nunca mude commits em uma agência pública. Use o comando apenas para commits no branch local, caso contrário, você terá problemas.



Eu quero mudar a mensagem do último commit!



git commit --amend
# follow prompts to change the commit message
      
      





É apenas ... requisitos de postagem estúpidos.



Eu acidentalmente cometi a master, embora devesse estar em um novo galho!



# create a new branch from the current state of master
git branch some-new-branch-name
# remove the last commit from the master branch
git reset HEAD~ --hard
git checkout some-new-branch-name
# your commit lives in this branch now :)
      
      





Se você já se comprometeu com um tópico público, os comandos não funcionarão. Neste caso, git reset HEAD @ {especifica o número de commits para reverter} ao invés de HEAD ~.



Bem, eu cometi por engano com o ramo errado



# undo the last commit, but leave the changes available
git reset HEAD~ --soft
git stash
# move to the correct branch
git checkout name-of-the-correct-branch
git stash pop
git add . # or add individual files
git commit -m "your message here";
# now your changes are on the correct branch
      
      





Há uma outra maneira que muitos desenvolvedores usam para escolher.



git checkout name-of-the-correct-branch
# grab the last commit to master
git cherry-pick master
# delete it from master
git checkout master
git reset HEAD~ --hard
      
      





Preciso executar o diff, mas nada funciona.



Se você tem certeza de que as alterações foram feitas, mas o diff está vazio, pode ser que você tenha indexado as alterações via add. Portanto, vale a pena usar um sinalizador especial.



git diff --staged



Em geral, isso não é um bug, mas um recurso, mas é muito óbvio ¯ \ _ (ツ) _ / ¯



Eu preciso desfazer com urgência um commit que foi feito 5 commits atrás



# find the commit you need to undo
git log
# use the arrow keys to scroll up and down in history
# once you've found your commit, save the hash
git revert [saved hash]
# git will create a new commit that undoes that commit
# follow prompts to edit the commit message
# or just save and commit
      
      





Felizmente, você não precisa voltar 5 commits copiando e colando arquivos novos e antigos. Você pode desfazer tudo isso com reverter.



Além disso, você pode reverter não apenas o commit, mas o arquivo inteiro. Verdade, esses já serão outros comandos ...



Desfazer alterações no arquivo



E aqui estão, esses outros comandos.



# find a hash for a commit before the file was changed
git log
# use the arrow keys to scroll up and down in history
# once you've found your commit, save the hash
git checkout [saved hash] -- path/to/file
# the old version of the file will be in your index
git commit -m "Wow, you don't have to copy-paste to undo"
      
      





Quando eu encontrei esta oportunidade pela primeira vez, era COOL, COOL, K-R-U-T-O. Mas se você pensar sobre isso - por que o checkout é a melhor opção para descartar as alterações em um arquivo? : shakes-fist-at-linus-torvalds:



Tudo, eu desisto



cd ..
sudo rm -r fucking-git-repo-dir
git clone https://some.github.url/fucking-git-repo-dir.git
cd fucking-git-repo-dir
      
      





Obrigado a Eric V. por este método. E dirija todas as reclamações sobre o uso de sudo com ele.



Se você precisar zerar as alterações e reverter completamente para a versão original, pode tentar fazer exatamente isso. Mas lembre-se - esses comandos são destrutivos e irreversíveis.



# get the lastest state of origin
git fetch origin
git checkout master
git reset --hard origin/master
# delete untracked files and directories
git clean -d --force
# repeat checkout/reset/clean for each borked branch
      
      





Atenção! Este artigo não pretende ser um guia completo. E sim, existem outras maneiras de fazer o mesmo, e ainda melhor. Mas eu vim com essas opções por tentativa e erro. Então, tive uma ideia maluca de compartilhar minhas descobertas. Pegue ou vá!



imagem



Comentário do especialista



Daniil Pilipenko , diretor do centro de recrutamento de especialistas em TI da SymbioWay e evangelista do back-end da universidade online Skillbox, acrescentou sua opinião sobre o Git e sua relevância para os desenvolvedores.



O Git apareceu em 2005 e demorou muito para dominar o mercado. Lembro-me de quando estávamos implementando o SVN na equipe de desenvolvimento em 2008. E mesmo em 2012, uma empresa próxima a mim estava implementando fortemente o Mercurial. Com o passar dos anos, ficou claro para muitos que o Git é o melhor sistema de controle de versão e agora é usado por quase todos os desenvolvedores.



Se você é um desenvolvedor iniciante procurando por um emprego, certifique-se de aprender Git! Você deve saber o que é um sistema de controle de versão e por que ele é necessário, o que é um commit, um branch, como clonar um repositório e enviar as mudanças feitas ao servidor, como obter novas mudanças do servidor, como mesclar, que tipos de “reset” existem. A princípio, este tópico pode parecer incompreensível e difícil para você, mas você só precisa se acostumar a usar o Git e não será capaz de desmamar.



All Articles