Git, ich möchte alles rückgängig machen! Fehlerkorrekturbefehle

Bild



Git ist ein handliches, aber komplexes System. Die Schwierigkeit besteht zuallererst darin, dass Sie durch Nachlässigkeit einen Fehler machen können, der dann schwer oder sogar unmöglich zu korrigieren ist. Die Git-Dokumentation enthält Beschreibungen vieler Befehle, mit denen Sie einen Fehler beheben können.



Um das Problem zu beheben, müssen Sie jedoch den genauen Namen des Befehls kennen. Und hier haben wir das typische Henne-Ei-Problem. Dieser Artikel beschreibt die Befehle, mit denen Sie Problemsituationen lösen können.



Verdammt, ich habe etwas falsch gemacht. Gib mir eine magische Zeitmaschine!



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
      
      





Bild



Mit diesem Befehl können Sie versehentlich gelöschte Daten wiederherstellen, indem Sie die Zusammenführung, die den Fehler verursacht hat, zurücksetzen. refLog wird sehr oft verwendet - sagen wir Danke, dass Sie vorgeschlagen haben, diesen Befehl hinzuzufügen.



Ich habe ein Commit gemacht, aber sofort einen Fehler bemerkt, der behoben werden muss!



# 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
      
      





Der Befehl ermöglicht es, unangenehme Kleinigkeiten zu korrigieren - wenn Sie etwas begangen haben und dann ein Problem wie ein fehlendes Leerzeichen nach dem "=" - Zeichen gesehen haben. Ja, es ist möglich, Änderungen mit einem neuen Commit vorzunehmen, indem beide mit rebase -i kombiniert werden. Aber es ist noch ein langer Weg.



NB! Ändern Sie niemals Commits in einer öffentlichen Filiale. Verwenden Sie den Befehl nur für Commits in der lokalen Verzweigung, da sonst Probleme auftreten.



Ich möchte die Nachricht des letzten Commits ändern!



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





Es ist nur ... dumme Posting-Anforderungen.



Ich habe mich versehentlich zum Master verpflichtet, obwohl es in einem neuen Zweig hätte sein sollen!



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





Wenn Sie sich bereits für einen öffentlichen Thread entschieden haben, funktionieren die Befehle nicht. In diesem Fall setzt git HEAD @ {anstelle von HEAD ~ die Anzahl der Commits zurück, auf die zurückgegriffen werden soll} zurück.



Nun, ich habe mich fälschlicherweise dem falschen Zweig verschrieben



# 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
      
      





Es gibt eine andere Möglichkeit, wie viele Entwickler Cherry-Pick verwenden.



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
      
      





Ich muss diff ausführen, aber nichts funktioniert.



Wenn Sie sicher sind, dass die Änderungen vorgenommen wurden, das diff jedoch leer ist, haben Sie die Änderungen möglicherweise über add indiziert. Daher lohnt es sich, eine spezielle Flagge zu verwenden.



git diff --staged



Im Allgemeinen ist dies kein Fehler, sondern eine Funktion, aber es ist verdammt offensichtlich. ¯ \ _ (ツ) _ / ¯



Ich muss dringend ein Commit rückgängig machen, das vor 5 Commits durchgeführt wurde



# 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
      
      





Glücklicherweise müssen Sie nicht 5 Commits zurückgehen, indem Sie alte und neue Dateien kopieren und einfügen. Sie können dies alles mit Zurücksetzen rückgängig machen.



Darüber hinaus können Sie nicht nur das Commit, sondern die gesamte Datei zurücksetzen. Es stimmt, dies sind bereits andere Befehle ...



Machen Sie Änderungen in der Datei rückgängig.



Und hier sind diese anderen Befehle.



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





Als ich diese Gelegenheit zum ersten Mal fand, war es COOL, COOL, K-R-U-T-O. Aber wenn Sie darüber nachdenken - warum ist das Auschecken die beste Option, um Änderungen in einer Datei zu verwerfen? : shakes-fist-at-linus-torvalds:



Alles, ich gebe auf



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





Vielen Dank an Eric V. Für diese Methode. Und richten Sie alle Beschwerden über die Verwendung von Sudo an ihn.



Wenn Sie die Änderungen auf Null setzen und vollständig auf die Originalversion zurücksetzen müssen, können Sie genau das versuchen. Aber denken Sie daran - diese Befehle sind destruktiv und irreversibel.



# 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
      
      





Beachtung! Dieser Artikel ist nicht als umfassende Anleitung gedacht. Und ja, es gibt andere Möglichkeiten, dasselbe zu tun, und noch besser. Aber ich habe diese Optionen durch Ausprobieren gefunden. Dann hatte ich eine verrückte Idee, meine Erkenntnisse zu teilen. Nimm es oder geh!



Bild



Expertenkommentar



Daniil Pilipenko , Direktor des Rekrutierungszentrums für IT-Spezialisten bei SymbioWay und Evangelist des Skillbox Online-Universitäts-Backends, fügte seine Meinung zu Git und seiner Relevanz für Entwickler hinzu.



Git erschien 2005 und es dauerte lange, bis der Markt übernommen wurde. Ich erinnere mich, als wir 2008 SVN im Entwicklungsteam implementierten. Und selbst im Jahr 2012 hat ein Unternehmen in meiner Nähe Mercurial stark umgesetzt. Im Laufe der Jahre wurde vielen klar, dass Git das beste Versionskontrollsystem ist und mittlerweile von fast allen Entwicklern verwendet wird.



Wenn Sie ein Anfänger sind, der einen Job suchen, sollten Sie unbedingt Git lernen! Sie sollten wissen, was ein Versionskontrollsystem ist und warum es benötigt wird, was ein Commit, eine Verzweigung ist, wie ein Repository geklont und die vorgenommenen Änderungen an den Server gesendet werden, wie neue Änderungen vom Server abgerufen werden, wie zusammengeführt wird und welche Arten von "Zurücksetzen" vorhanden sind. Auf den ersten Blick mag Ihnen dieses Thema unverständlich und schwierig erscheinen, aber Sie müssen sich nur an die Verwendung von Git gewöhnen, und Sie werden es nicht entwöhnen können.



All Articles