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
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á!
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.