Git on vaikea ohjelma: mokaaminen on helppoa, ja sen keksiminen miten virheet korjataan, on jumalauta 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.
Voi vittu, 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ä!
Voi vittu, 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 jumalauta, 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.
Voi vittu, haluan muuttaa edellisen commitin viestiä!
git commit --amend
# seuraa ohjeita commit-viestin muokkaamiseen
Typerät commit-viestin muotoiluvaatimukset.
Voi vittu, 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!
Voi vittu, 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
Voi vittu, 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 vitun hämmentävää ja saatanan epäintuitiivista kun törmäät tähän ensimmäisen kerran!)
Voi vittu, 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 perkele eri komentosarja...
Voi vittu, 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 helvetissä checkout --
on mukamas järkevin komento peruuttaa tiedoston muutokset? :pui-nyrkkiä-linus-torvaldsille:
Unohda koko paska, vittu luovutan kokonaan.
cd ..
sudo rm -r saatanan-git-repo-kansio
git clone https://joku.github.url/typerä-git-repo-kansio.git
cd saatanan-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 ja kirosanoilla höystettynä. 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