Oeps, Git!?!

Git is moeilijk: fouten maken is veel te simpel en uitzoeken hoe je die vervelende fouten moet herstellen is bijkans onmogelijk. Git documentatie werkt niet, want omdat je toch al helemaal niet weet hoe je uit die ellende moet komen, weet je toch ook niet waar je naar moet zoeken om de gemaakte fouten op te lossen?

Daarom staan hier wat problemen beschreven waar ik tegenaan gelopen ben en hoe ik me hier uiteindelijk uit heb weten te redden in versimpeld Nederlands.

Oeps, ik maakte het enorm kapot, alsjeblieft, zeg me dat git een teletijdmachine heeft!?!

git reflog
# je krijgt een lijst te zien van alles wat
# je hebt gedaan in git, over alle branches heen.
# ze hebben allemaal een index HEAD@{index}
# vind degene van net voor je het allemaal
# stuk maakte
git reset HEAD@{index}
# teletijdmachine!

Je kan hiermee terug naar dingen die je per ongeluk verwijderd hebt, of om terug te draaien wat je hebt gedaan wat de repository kapot maakte, of om te herstellen van een foute merge, of gewoon om terug te gaan naar het moment dat git nog wel werkte.

Ik gebruik reflog VAAK. Ontzettend bedankt aan de vele vele vele vele vele individuen die reflog aan me hebben aangedragen.

Oeps, ik deed commit realiseerde me dat ik nog 1 kleine wijziging moet doen!

# Maak je wijziging
git add . # or add individual files
git commit --amend --no-edit
# Nu heeft je laatste commit de wijziging!
# LET OP: Pas nooit publieke commits aan!!

Dit overkomt me meestal als ik iets commit, en dan tests/linters uitvoer. "Oeps, vergeet ik weer een spatie na een = ...." - Je kan de wijziging ook als nieuwe commit doen, en ze dan met git rebase -i samenvoegen, maar dit is miljoenmiljard keer sneller.

  • Waarschuwing: pas nooit commits aan die je naar een publieke of gedeelde branch gepusht hebt!! Pas alleen commits aan in je lokale repository tenzij je behoefte aan een beroerde tijd hebt. *

Oeps, ik moet het commit bericht van de laatste commit aanpassen!

git commit --amend
# volg de stappen om het bericht aan te passen

Vervelende commit bericht opmaak vereisten!

Oeps, ik heb op master gecommit en dat moest naar een nieuwe branch!

# Maak een nieuwe branch met de status van master
git branch some-new-branch-name
# rol de laatste commit op de master branch terug
git reset HEAD~ --hard
git checkout some-new-branch-name
# je commit leeft nu in deze branch! :)

Let op: Dit werkt niet als je de commit naar een publieke of gedeelde branch hebt gecommit. Als je al andere dingen geprobeerd hebt, moet je misschien een git reset HEAD@{number-of-commits-back} doen in plaats van HEAD~.

Erg vervelend. Allerlei suggesties zijn aangeleverd door mensen die graag meedenken om dit sneller te doen dan ik dan kon. Dank allemaal! :)

Oeps, ik heb op de verkeerde branch gecommit!

# rol de laatste commit terug, maar behoud de wijzigingen.
git reset HEAD~ --soft
git stash
# Ga naar de juiste branch
git checkout name-of-the-correct-branch
git stash pop
git add . # or add individual files
git commit -m "your message here"
# Nu zitten je wijzigingen in de juiste branch

Een boel mensen hebben voorgesteld om cherry-pick te gebruiken in deze situatie. Ook een goede mogelijkheid, dus kies wat in jouw situatie de beste oplossing is!

git checkout name-of-the-correct-branch
# pak de laatste commit op master
git cherry-pick master
# verwijder het uit master
git checkout master
git reset HEAD~ --hard

Oeps, ik deed een diff en er gebeurde niks!

Als je zeker weet dat je bestanden hebt aangepast, maar diff geeft geen output, dan heb je je wijzigingen waarschijnlijk toegevoegd (add) aan je locale staging omgeving. Dat kan je zien met dit vlaggetje.

git diff --staged

Sla op onder: ¯\_(ツ)_/¯

(Ja, ik weet dat dit een functionaliteit is en geen bug maar het is bijzonder en de eerste keer dat je dit nodig hebt is dit zeker niet helder)

Oeps, ik moet een commit terugdraaien van zeker 5 commits terug!

# vindt de commit die je wil terugdraaien
git log
# scroll op en neer door de history
# als je de commit gevonden heb, copieer de hash
git revert [gecopieerde hash]
# git zal een nieuwe commit maken die die oude terugdraait.
# volg de prompts om een commit bericht te schrijven
# of sla gewoon op en commit

Het is helemaal niet nodig om je oude bestand terug te vinden. Dat zit gewoon nog in git. Als je een bug gecommit hebt, kan je de commit terugdraaien en zo je oude inhoud terugkrijgen met revert.

Je kunt ook alleen een specifiek bestand terugdraaien, in plaats van een hele commit die wellicht vele files omvat. Maar goed, zoals het git betaamt, is dat een totaal andere set van git commando's ..

Oeps, ik moet de wijzigingen in een bestand terugdraaien!

# vind een hash voor een commit voordat het bestand is veranderd.
git log
# scroll op en neer door de history
# als je de commit gevonden heb, copieer de hash
git checkout [saved hash] -- hele/pad/naar/bestand
# de oude versie van het bestand zal in je index staan
git commit -m "Super, je hoeft niet het oude bestand te knipplakken!"

Toen ik dit uitgezocht had was ik blij. BLIJ. S-U-P-E-R-B-L-I-J.

Maar op welke planeet is checkout -- een slimme optie om een bestand terug te draaien?! :toont-vuist-aan-linus-torvalds:

Vergeet het maar, ik geef het op.

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

Dank je wel Eric V. hiervoor. Alle klachten over het gebruik van sudo in deze grap mag je aan hem sturen.

Maar goed, als je branch zo kapot is is dat je echt niks meer met je repo kan en je terug wil naar de status van de remote repo, in een "git-goedgekeurde" manier, probeer dit dan. Wees je bewust dat dit definitieve en destructieve acties zijn!

# haal de laatste status op
git fetch origin
git checkout master
git reset --hard origin/master
# delete untracked files and directories
git clean -d --force
# herhaal checkout/reset/clean voor elke kapotte branch

*Disclaimer: Deze site is zeker niet bedoeld als uitgebreide referentie. En ja, er zijn betere manieren om dezelfde dingen te bereiken die theoretisch gezien zeker kloppen. Ik ben met vallen met vallen en opstaan, en het einde van vele toetsenborden, tot deze stappen gekomen en heb besloten deze te delen. Ik doe dat met een gezonde dosis zelfhumor en besef dat het beter kan. Maak er gebruik van als je wilt, zo niet: ook goed!

Dank aan iedereen heeft geholpen de site in andere talen om te zetten: jullie heersen! Michael Botha (af) · Khaja Md Sher E Alam (bn) · Eduard Tomek (cs) · Moritz Stückler (de) · Franco Fantini (es) · Hamid Moheb (fa) · Senja Jarva (fi) · Michel (fr) · Alex Tzimas (gr) · Elad Leev (he) · Aryan Sarkar (hi) · Ricky Gultom (id) · fedemcmac (it) · Meiko Hori (ja) · Zhunisali Shanabek (kk) · Gyeongjae Choi (ko) · Rahul Dahal (ne) · Martijn ten Heuvel (nl) · Łukasz Wójcik (pl) · Davi Alexandre (pt_BR) · Catalina Focsa (ro) · Daniil Golubev (ru) · Nemanja Vasić (sr) · Björn Söderqvist (sv) · Kitt Tientanopajai (th) · Taha Paksu (tr) · Andriy Sultanov (ua) · Tao Jiayuan (zh) . Ook hebben Allie Jones · Artem Vorotnikov · David Fyffe · Frank Taillandier · Iain Murray · Lucas Larson · Myrzabek Azil geholpen.

Als je ook een vertaling naar jouw taal wil toevoegen, stuur dan een PR op GitHub