Godver, Git!?!

Git is moeilijk: fouten maken is verrot simpel en uitzoeken hoe je die kut fouten moet herstellen is godsonmogelijk. Git documentatie werkt niet, want omdat je verdomme niet weet hoe je uit die ellende moet komen, weet je ook niet waar je naar moet zoeken om die klerefouten op te lossen

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

Kut, alles is 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 waardoor de repo kapot is gegaan, 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 betweters die reflog aan me hebben aangedragen.

Verdomme, ik commit en realiseer me dat ik nog een 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. "... 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 veel 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 zure tijd hebt. *

Hoe moet ik het commit bericht van de laatste commit aanpassen?! Spuugzat word ik ervan.

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

Stomme kut commit bericht opmaak klote vereisten!!

Oh fuck, ik heb op master gecommit maar dat moest in zo'n kloterige 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 met je stomme hoofd de commit naar een publieke of gedeelde branch hebt gecommit. Als je al een tijdje hebt zitten prutsen, moet je misschien een git reset HEAD@{number-of-commits-back} doen in plaats van HEAD~.

Eeuwige klerezooi dat git.

Allerlei betweters hebben trouwens suggesties aangeleverd om dit nog sneller te doen dan ik dat kon. Dank allemaal! :)

Oh shit, ik heb op de verkeerde branch gecommit!

# undo the last commit, but leave the changes available
# rol de laatste commit terug, maar behoudt 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, sukkel

De betweters hebben om cherry-pick te gebruiken in deze situatie. Kies zelf even at wat voor jou 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

Argh kut, 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 een vlaggetje.

git diff --staged

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

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

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

# 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

Het is goddome helemaal niet nodig om het originele bestand terug te vinden! Dat zit gewoon nog in die kut 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 je die hele kut commit die allerlei andere files beslaat. Maar goed, zoals het git betaamt, is dat natuurlijk een totaal andere klerecombo van git commando's ..

Klote, ik moet één bestandje terugkrijgen!!

# 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, niet het oude bestand knipplakken!"

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

Maar op welke door god verlaten planeet is checkout -- een slimme optie om een bestand terug te draaien?! :steekt-middelvinger-op-naar-linus-torvalds:

Vergeet het maar, klotegit.

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

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

Maar goed, als je branch zo naar de knoppen 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. Ja, er zijn zeker betere manieren om dezelfde dingen te bereiken die theoretisch gezien zeker kloppen. Ik ben met vallen en opstaan, met veel te veel vloeken, 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! Moritz Stückler (de) · Daniil Golubev (ru) · Łukasz Wójcik (pl) · fedemcmac (it) · Michel (fr) · Andriy Sultanov (ua) · Meiko Hori (ja) · Alex Tzimas (gr) · Martijn ten Heuvel (nl) · Elad Leev (he) · Franco Fantini (es) · Catalina Focsa (ro) · Davi Alexandre (pt_BR) · Nemanja Vasić (sr) · Tao Jiayuan (zh) · Eduard Tomek (cs) · Ricky Gultom (id) . Ook hebben Iain Murray · Frank Taillandier · David Fyffe · Lucas Larson geholpen.

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