Dangit, Git!?!

Git is moeilik: om 'n gemors te maak is maklikik, maar om uit te vind hoe om dit reg te maak is onmoontlik. Git dokumentasie het 'n probleem waar jy nie kan soek hoe om jouself uit die gemors te kry nie, behalwe as jy klaar die naam ken wat van die ding wat jy oor moet weet om die probleem te kan oplos.

So hier is 'n paar slegte situasies waarin ek myself bevind het en hoe ek op die ou ent van die dag myself daaruit gekry het in eenvoudige afrikaans.

Dangit, ek het iets groots verkeerd gedoen, vertel asseblief vir my git het 'n magiese tydmasjien!?!

git reflog
# hier sal jy 'n lys sien van alles 
# wat jy in git gedoen het, in alle takke!
# elke een het 'n indeks HEAD@{indeks}
# vind die een net voordat jy alles gebreek het
git reset HEAD@{index}
# magiese tydmasjien

Jy kan dit gebruik om dinge terug te kry wat jy per ongeluk geskrap het, of net goed te verwyder wat jy probeer het en die repo daarmee gebreek het, of om te herstel ná 'n slegte merge, of net om terug te gaan na 'n tyd wanneer dinge werklik gewerk het. Ek gebruik BAIE 'reflog'. Massiewe knik van die hoed vir die baie baie baie baie mense wat voorgestel het om dit by te voeg!

Dangit, Ek het commit en onmiddelik besef ek moet een klein verandering maak!

# maak jou verandering
git add . # of voef individuele leêrs by
git commit --amend --no-edit
# nou bevat jou laaste commit die verandering!
# WAARSKUWING: moet nooit openbare commits wysig nie

Dit gebeur gewoonlik met my as ek commit en dan toetse/linters uitvoer... en dan sien jy dat jy vergeet het om 'n spasie voor die isgelykaanteken te sit. Jy kan ook die verandering maak as 'n nuwe commit en dan 'n rebase -i doen om albei saam te smelt, maar hierdie is baie vinniger.

Waarskuwing: Jy moet nooit commits wat tot gestoot om 'n openbare/gedeel tak wysig! Wysig slegs commits wat slegs in jou plaaslike kopie voorkom, of anders gaan dit na slegte tye lei.

Dangit, ek moet die boodskap op my laaste commit verander!

git commit --amend
# volg die aanwysings om die commit boodskap te verander

Simpel vereistes vir commit boodskappe.

Dangit, ek het perongeluk iets commit aan die meester tak wat op 'n splinter nuwe tak moes gewees het!

# maak 'n splinter nuwe tak vanuit die huidige 
# toestand can die meester tak
git branch nuwe-tak-naam
# verwyder die commit van die meester tak
git reset HEAD~ --hard
git checkout nuwe-tak-naam
# jou commit leef nou in die nuwe tak :)

Nota: hierdie sal nie werk as jy klaar die verandering aan 'n openbare/publieke tak gestoot het nie, en as jy ander dinge eers probeer het sal jy dalk dinge moet herstel met git reset HEAD@{hoeveelheid-commits-terug} in plaas daarvan om van HEAD~ gebruik te maak. Dit lei tot oneindige hartseer. Baie baie baie mense het ook 'n fantastiese manier voorgestel wat hierdie baie korter maak wat ek nie self geken het nie. 'n Groot dankie aan almal.

Dangit, ek het perongeluk na die verkeerde tak commit!

# maak die laaste opdrag ongedaan, 
# maar laat die wysigings beskikbaar
git reset HEAD~ --soft
git stash
# skuif na die regte tak
git checkout naam-van-regte-tak
git stash pop
git add . # of voef individuele leêrs by
git commit -m "jou boodskap hier"
# nou is jou wysigings op die regte tak

Baie mense het voorgestel om cherry-pick vir die geval ook te gebruik. Gebruik maar wat beste vir jou werk!

git checkout naam-van-regte-tak
# gryp die laaste commit na die meester tak
git cherry-pick master
# wis dit uit van die meester tak
git checkout master
git reset HEAD~ --hard

Dangit, ek probeer diff hardloop, maar niks gebeur nie?!

As jy weet dat jy wel veranderinge gemaak het, maar die 'diff' is leeg, het jy 10 teen 1 jou leêrs ge-add na staging en moet dus 'n speciale vlag gebruik.

git diff --staged

Liasseer dit onder ¯\_(ツ)_/¯ (ja, ek weet dit is 'n funksie en nie 'n gogga nie, maar dis vreemd en nie voor die hand liggend nie, wanneer dit die eerste keer met jou gebeur)

Dangit, Ek moet 'n commit ongedaan maak van soos 5 commits gelede!

# vind die commit wat jy ongedaan moet maak
git log
# gebruik jou sleutelbord pyljies om op 
# en af in geskiedenis te beweeg
# wanneer jy jou commit gevind het, stoor die hash
git revert [gestoorde hash]
# git sal 'n nuwe commit skep wat die ander een ongedaan maak
# volg die aanwysings om die commit boodskap te wysig 
# of stoor en commit net

Dit blyk dat jy nie die ou lêerinhoud in die bestaande lêer hoef op te spoor en te kopieer om die veranderinge ongedaan te maak nie! As jy 'n fout begaan het, kan jy die commit op een slag ongedaan maak met 'revert'.

Jy kan ook 'n enkele lêer terugstel in plaas van 'n volledige commit! Maar natuurlik, op die ware git manier, is dit 'n heel ander stel opdragte...

Dangit, ek moet my veranderinge aan 'n leêr terugkeer!

# vind 'n hash vir 'n commit voordat die lêer verander is
git log
# gebruik jou sleutelbord pyljies om op 
# en af in geskiedenis te beweeg
# wanneer jy jou commit gevind het, stoor die hash
git checkout [gestoorde hash] -- path/to/file
# die ou weergawe van die leêr is nou in jou indeks
git commit -m "Wow, geen knip en plak om terug te keer nie"

Toe ek hierdie uiteindelik uitgevind het was fantasties. FANTASTIES. Maar in alle erns, op watter planeet maak checkout -- sin as die beste manier om 'n leêr terug te keer? :wys-middelfinger-vir-linus-torvalds:

Vergeet van die, ek gee op.

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

Dankie aan Eric V. vir die ene. Alle klagtes oor die gebruik van sudo in hierdie grap kan op hom gerig word.

In alle erns, indien jou tak so stukkend is dat jy die toestand van jou repo moet herstel om dieselfde te wees as jou remote repo in 'n "git-goedgekeurde" manier, probeer dit. Pasop alhoewel, dit is vernietigende en onterugkeerbare aksies!

# kry die nuutste toestand van die oorsprong
git fetch origin
git checkout master
git reset --hard origin/master
# skrap untracked leêrs and gidse
git clean -d --force
# herhaal checkout/reset/clean vir elke stukkende tak

*Vrywaring: Hierdie webwerf is nie bedoel as 'n volledige verwysing nie. En ja, daar is ander maniere om dieselfde dinge met meer teoretiese suiwerheid of wat ook al, maar ek het hierdie stappe bewerkstellig deur middel van baie probeer, vloekery en tafels omgooi. Ek het hierdie mal idee gehad om dit met 'n gesonde dosis van lewendigheid te deel. Vat dit soos jy wil!

Baie dankie aan almal wat vrywillig die webwerf in nuwe tale vertaal het, julle is fantasties! 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) . Met additionele hulp van Allie Jones · Artem Vorotnikov · David Fyffe · Frank Taillandier · Iain Murray · Lucas Larson · Myrzabek Azil

As jy wil help om 'n vertaling in jou taal by te voeg, dien 'n pull request in by GitHub