Git, je veux tout défaire! Commandes de correction des erreurs

image



Git est un système pratique mais complexe. La difficulté, tout d'abord, est que par négligence, vous pouvez faire une erreur, qui est alors difficile voire impossible à corriger. La documentation Git fournit des descriptions de nombreuses commandes pour vous aider à corriger un bogue.



Mais le fait est que pour résoudre le problème, vous devez connaître le nom exact de la commande. Et ici, nous avons le problème typique de la poule et de l'œuf. Cet article décrit les commandes qui vous aident à résoudre les problèmes.



Merde, j'ai fait quelque chose de mal. Donnez-moi une machine à voyager dans le temps!



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
      
      





image



Cette commande vous permet de récupérer des données supprimées accidentellement en annulant la fusion à l'origine du problème. refLog est utilisé très souvent - disons merci d'avoir suggéré d'ajouter cette commande.



J'ai fait un commit, mais j'ai tout de suite remarqué une erreur, elle doit être corrigée!



# 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
      
      





La commande permet de corriger de petites choses désagréables - lorsque vous avez commis quelque chose, puis vu un problème comme un espace manquant après le signe "=". Oui, il est possible d'apporter des modifications avec un nouveau commit en combinant les deux avec rebase -i. Mais c'est un long chemin à parcourir.



NB! Ne modifiez jamais les commits sur une branche publique. Utilisez la commande uniquement pour les validations sur la branche locale, sinon vous aurez des problèmes.



Je veux changer le message du dernier commit!



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





C'est juste ... des exigences de publication stupides.



Je me suis accidentellement engagé à master, même si cela aurait dû être sur une nouvelle branche!



# 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 :)
      
      





Si vous vous êtes déjà engagé dans un thread public, les commandes ne fonctionneront pas. Dans ce cas, git reset HEAD @ {spécifier le nombre de commits vers lesquels revenir} au lieu de HEAD ~ vous aidera.



Eh bien, je me suis commis par erreur dans la mauvaise branche



# 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
      
      





Il existe une autre façon dont de nombreux développeurs utilisent la sélection de cerises.



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
      
      





J'ai besoin de lancer diff, mais rien ne fonctionne.



Si vous êtes sûr que les modifications ont été apportées, mais que le diff est vide, il se peut que vous ayez indexé les modifications via add. Par conséquent, il vaut la peine d'utiliser un drapeau spécial.



git diff --staged



En général, ce n'est pas un bogue, mais une fonctionnalité, mais c'est sacrément évident ¯ \ _ (ツ) _ / ¯



J'ai un besoin urgent d'annuler un commit qui a été fait il y a 5 commits



# 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
      
      





Heureusement, vous n'avez pas à revenir 5 commits en arrière en copiant et en collant les anciens et les nouveaux fichiers. Vous pouvez annuler tout cela avec revert.



De plus, vous pouvez annuler non seulement la validation, mais le fichier entier. C'est vrai, ce seront déjà d'autres commandes ...



Annuler les modifications dans le fichier



Et les voici, ces autres commandes.



# 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"
      
      





Quand j'ai trouvé cette opportunité pour la première fois, c'était COOL, COOL, K-R-U-T-O. Mais si vous y réfléchissez, pourquoi l'extraction est-elle la meilleure option pour annuler les modifications d'un fichier? : shakes-fist-at-linus-torvalds: Tout, j'abandonne







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





Merci à Eric V. pour cette méthode. Et lui adresser toutes les plaintes concernant l'utilisation de sudo.



Si vous devez annuler les modifications et revenir complètement à la version d'origine, vous pouvez essayer de le faire. Mais rappelez-vous - ces commandes sont destructrices et irréversibles.



# 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
      
      





Attention! Cet article n'est pas destiné à être un guide complet. Et oui, il existe d'autres moyens de faire de même, et même mieux. Mais j'ai proposé ces options par essais et erreurs. Ensuite, j'ai eu une idée folle de partager mes découvertes. Prends-le ou pars!



image



Commentaire d'expert



Daniil Pilipenko , directeur du centre de recrutement de spécialistes IT de SymbioWay et évangéliste du backend universitaire en ligne Skillbox, a ajouté son avis sur Git et sa pertinence pour les développeurs.



Git est apparu en 2005 et il a fallu beaucoup de temps pour conquérir le marché. Je me souviens de la mise en œuvre de SVN dans l'équipe de développement en 2008. Et même en 2012, une entreprise proche de moi mettait fortement en œuvre Mercurial. Au fil des ans, il est devenu évident pour beaucoup que Git est le meilleur système de contrôle de version et qu'il est maintenant utilisé par presque tous les développeurs.



Si vous êtes un développeur débutant et que vous souhaitez postuler à un emploi, assurez-vous d'apprendre Git! Vous devez savoir ce qu'est un système de contrôle de version et pourquoi il est nécessaire, qu'est-ce qu'un commit, une branche, comment cloner un référentiel et envoyer les modifications apportées au serveur, comment obtenir de nouvelles modifications du serveur, comment fusionner, quels types de «réinitialisation» sont là. Au début, ce sujet peut vous sembler incompréhensible et difficile, mais il vous suffit de vous habituer à utiliser Git et vous ne pourrez pas le sevrer.



All Articles