Hyvänen aika, Git!?!

Git on vaikea ohjelma: mokaaminen on helppoa, ja sen keksiminen miten virheet korjataan, on suorastaan mahdotonta. Git:in dokumentaatioon turvautuminen on varsinainen muna-kana-ongelma: et voi hakea korjausta sotkuusi ellet tiedä jo tiedä sitä termiä jota olet etsimässä jotta saat ongelmasi ratkaistua.

Tässä on jotain esimerkkejä niistä tilanteista joihin olen joutunut, ja ohjeet selkellä suomella siitä miten sain itseni niistä ulos.

Hyvänen aika, tein jotain väärin, kai tässä ohjelmassa on joku aikakone!?!

git reflog
# Näet listan kaikesta mitä olet
# tehnyt git:ssä kaikissa haaroissa!
# Jokaisella haaralla on indeksi osoitteessa HEAD@{index}
# etsi se kohta jossa kaikki toimi, ennen kuin rikoit kaiken
git reset HEAD@{index}
# maaginen aikakone

Voit käyttää tätä komentoa saadaksesi takaisin jotain jonka poistit vahingossa, tai siirtääksesi kamaa jota kokeilit ennen kuin rikoit repon, tai toipuaksesi pahasta mergestä, tai muuten vaan palataksesi kohtaan jossa asiat oikeasti toimivat. Käytän reflog-komentoa PALJON. Iso hatunnosto niille monille monille monille monille monille ihmisille, jotka ehdottivat tämän komennon lisäämistä!

Hyvänen aika, tein commitin ja huomasin heti että pitää tehdä vielä yksi muutos!

# tee tarvitsemasi muutos
git add . # tai lisää yksittäiset tiedostot
git commit --amend --no-edit
# nyt viimeisin committisi sisältää sen muutoksen!
# VAROITUS! älä ikinä käytä --amend komentoa julkisille commiteille

Tämä tapahtuu usein kun ajan testejä ja linttereitä... ja yh, silloin kun unohdan laittaa välimerkin yhtäsuuruusmerkin perään. Saman muutoksen voisi tehdä omana committinaan ja sitten ajaa komennon rebase -i jotta puristat commitit yhteen, mutta tämä on miljoona kertaa nopeampaa.

Varoitus: Älä ikinä käytä amend-komentoa commiteille jotka on jo puskettu julkiseen/jaettuun haaraan! Käytä amend-komentoa vain muutoksiin jotka ovat lokaalissa ympäristössäsi tai muuten tulee ongelmia.

Hyvänen aika, haluan muuttaa edellisen commitin viestiä!

git commit --amend
# seuraa ohjeita commit-viestin muokkaamiseen

Typerät commit-viestin muotoiluvaatimukset.

Hyvänen aika, committasin päähaaraan jotain jonka olisi pitänyt olla toisessa haarassa!

# luodaan uusi haara päähaaran nykyisestä tilasta
git branch uuden-haaran-nimi
# poistetaan uusin commit päähaarasta
git reset HEAD~ --hard
git checkout uuden-haaran-nimi
# uusin committisi on nyt uudessa haarassa :)

Huomio: tämä ei toimi jos olet jo puskenut muutokset julkiseen/jaettuun haaraan, ja jos olet kokeillut jo muita temppuja, voi olla että joudut käyttämään komentoa git reset HEAD@{näin-monta-committia-taaksepäin} komennon HEAD~ sijaan. Voi surku. Myös, kiitos monille monille monille ihmisille, jotka ehdottivat upen tavan tehdä tämän lyhyemmin kuin mitä itse käytin. Kiitos teille!

Hyvänen aika, commitoin vahingossa väärään haaraan!

# perutaan uusin commit, mutta jätetään muutokset saataville
git reset HEAD~ --soft
git stash
# siirrytään oikeaan haaraan
git checkout name-of-the-correct-branch
git stash pop
git add . # tai lisää yksittäisiä tiedostoja
git commit -m "viestisi tähän"
# nyt muutoksesi ovat oikeassa haarassa

Monet ihmiset ovat ehdottaneet cherry-pick-komennon käyttämistä tässä tilanteessa, joten voit käyttää sitäkin valitaksesi mitkä muutokset haluat!

git checkout oikean-haaran-nimi
# napataan uusin commit päähaaraan
git cherry-pick master
# poistetaan se päähaarasta
git checkout master
git reset HEAD~ --hard

Hyvänen aika, yritin ajaa `diff`-komennon, mutta tuloste on tyhjä?!

Jos tiedät että olet tehnyt muutoksia tiedostoihin, muuta diff-komennon tuloste näyttää tyhjää, olet luultavasti siirtänyt tiedostot jo add-komentolla valmistelualueelle (staging), ja nähdäkseksesi muutokset, joudut lisäämään erityisen option.

git diff --staged

Sarjassamme omituista ¯\_(ツ)_/¯ (ja kyllä, tiedän että tämä on toiminnallisuus, ei virhetilanne, mutta se on hämmentävää ja epäintuitiivista kun törmäät tähän ensimmäisen kerran!)

Hyvänen aika, haluan poistaa commitin ennen 5 tuoreinta committia!

# etsi commit jonka haluat poistaa
git log
# käytä nuolinäppäimiä mennäksesi eteen- ja taaksepäin historiassa
# kun löydät haluamasi commitin, tallenna sen hash
git revert [tallennettu hash]
# git lisää uuden commitin joka poistaa kyseisen commitin
# seuraa ohjeita muokataksesi commit-viestiä 
# tai vain tallenna ja committaa

Kävi ilmi että ei tarvisekaan kopioida ja liittää tiedoston vanhaa sisältöä muokataksesi tehtyjä muutoksia! Jos olet tehnyt bugin, voit peruuttaa commitissa olevat muutokset kerralla käyttämällä revert-komentoa.

Voit myös käyttää revert-komentoa yhteen tiedostoon yhden commitin sijaan! Mutta tietenkin, git-mäiseen tapaan, sen tekeminen onkin sitten aivan eri komentosarja...

Hyvänen aika, haluan poistaa muutokseni yhteen tiedostoon!

# etsi hash tai commit ajalta ennen kuin teit muutoksia tiedostoon
git log
# käytä nuolinäppäimiä mennäksesi eteen- ja taaksepäin historiassa
# kun löydät haluamasi commitin, tallenna sen hash
git checkout [tallennettu hash] -- polku/tiedostoon
# tiedoston vanha versio on nyt indeksissä
git commit -m "Vau, ei tarvii kopioida-ja-liittää tiedoston muutoksia"

Kun viimein löysin tämän, se oli HUIKEAA. HUIKEAA. HUI-KE-AA. Mutta vakavasti ottaen, miten ihmeessä checkout -- on mukamas järkevin komento peruuttaa tiedoston muutokset? :pui-nyrkkiä-linus-torvaldsille:

Unohda tämä sotku, luovutan kokonaan.

cd ..
sudo rm -r typerä-git-repo-kansio
git clone https://joku.github.url/typerä-git-repo-kansio.git
cd typerä-git-repo-kansio

Kiitokset Eric V:lle tästä. Kaikki valitukset sudo-komennon käyttämisestä voi ohjata hänelle.

Mutta oikeasti, jos haarasi on niin sekaisin että ainoa vaihtoehto on nollata reposi tila samaan tilanteeseen kuin repon remote-versio, ja haluat tehdä tämän "git-hyväksytyllä" tavalla, kokeile tätä. Mutta muista että seuraukset ovat tuhoisat ja peruuttamattomat!

# haetaan origin-haaran uusin tila
git fetch origin
git checkout master
git reset --hard origin/master
# poista ei-seuratut tiedostot ja kansiot
git clean -d --force
# toista checkout/reset/clean-komennot jokaiselle sotkuiselle haaralle

*Huomio: Tämän sivuston ei ole tarkoitus olla tyhjentävä dokumentaatio. Ja kyllä, on olemassa tapoja tehdä nämä samat asiat teoreettisesti puhtaammin tai jollain muulla tavalla, mutta monen yrityksen ja erehdyksen jälkeen, kiroillen ja heittäen pöytiä, olen todennut näiden ohjeiden toimivan. Sain hullun päähänpiston jakaa ne maailmalle sopivan kevytmielisesti. Ota tai jätä!

Kiitos paljon seuraaville henkilöille, jotka ovat vapaaehtoisesti kääntäneet tämän sivuston eri kielille! Olette upeita! 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) . Mukana ovat myös olleet Allie Jones · Artem Vorotnikov · David Fyffe · Frank Taillandier · Iain Murray · Lucas Larson · Myrzabek Azil

Jos haluat auttaa tämän sivuston kääntämisessä, tee PR täällä GitHub