Þegar eitthvað fer úrskeiðis
Gagnlegar Git-skipanir til að laga algeng mistök — óviljandi commit, rangt branch, gleymdar breytingar — og hvernig á að umgangast –force af varúð.
Ekki örvænta
Það er eðlilegt að gera mistök í Git — pusha á vitlaust branch, gleyma skrá í commit eða óvart skrifa yfir eitthvað. Nær allt er hægt að laga. Lykillinn er að átta sig á stöðunni áður en þú lagar, og velja öruggustu leiðina.
Byrjaðu alltaf á að fá yfirsýn:
git status # hvaða skrár eru breyttar / í undirbúningi?
git log --oneline --graph -10 # síðustu commit og hvar branch-in standaSæktu reglulega — pull áður en þú pushar
Langalgengasta vandamálið er einfalt: það gleymdist að pull-a áður en pushað var. Staðbundna afritið þitt er þá á eftir GitHub — einhver annar (eða þú sjálf/ur á annarri vél) hefur pushað á meðan — og push-ið þitt er hafnað eða árekstur myndast. Þetta má að mestu forðast með einni vinnureglu:
git pulláður en þú pushar — alltaf. Þá færðu nýjustu breytingar inn fyrst og push-ið gengur snurðulaust í stað þess að vera hafnað.- Sæktu reglulega meðan þú vinnur (
git fetcheðagit pull), ekki bara í lokin — sérstaklega þegar fleiri vinna á sömu grein (eins og t.d.main). - Vinnugrein sem á að sameina við
main: ef þið vinnið á eigin greinum en ætlið svo að sameina viðmain, munið aðmaingæti hafa breyst á meðan. Þá þarf að uppfæra vinnugreinina ykkar með breytingum afmain(eða þeirri grein sem þið ætlið að senda inn í) áður en hægt er að sameina hreint — sjá Branch-ið mitt hefur klofnað frámainhér að neðan.
git pull # sækir og sameinar nýjustu breytingar á ÞÍNU branch
git pull origin main # sækir main inn í branch-ið þitt (ef main hefur breyst)--force — farðu varlega
git push --force skrifar yfir sögu á GitHub og getur eytt vinnu annarra á sameiginlegum branchum. Forðastu það á main og á branchum sem fleiri vinna á.
Ef þú verður að endurskrifa sögu á þínu eigin branch, notaðu frekar git push --force-with-lease — það neitar að skrifa yfir ef einhver annar hefur pushað á meðan, svo þú eyðir ekki óvart vinnu sem þú vissir ekki af.
Algeng mistök og lausnir
Ég gleymdi að bæta skrá við síðasta commit
Ef þú varst að commit-a en gleymdir skrá (og hefur ekki pushað enn):
git add gleymda-skra
git commit --amend --no-edit--amend breytir síðasta commit í stað þess að búa til nýtt; --no-edit heldur sömu skilaboðum. Ef þú varst þegar búin að pusha þarf git push --force-with-lease á eftir — og þá aðeins á þínu eigin branch.
Ég commit-aði en er ekki búin að pusha — vil taka það til baka
Til að afturkalla síðasta commit en halda breytingunum (þær fara aftur í vinnutréð):
git reset --soft HEAD~1Til að henda bæði commit-inu og breytingunum (varúð — þetta eyðir vinnu):
git reset --hard HEAD~1Ég pushaði óvart á main
Færðu commit-in yfir á nýtt branch og skilaðu main í fyrra horf:
git checkout -b rett-branch # býr til nýtt branch með breytingunum þínum
git push origin rett-branch # pushar því (opnaðu svo PR)
git checkout main
git reset --hard origin/main # skilar þínu main í sömu stöðu og á GitHubEf main er varið með reglu (branch protection) sem krefst pull request kemstu hvort eð er ekki hjá því að fara PR-leiðina — reglan hafnar beinu push-i á main. Það er einmitt tilgangur verndarinnar.
Ég pushaði á rangt branch
Náðu í commit-ið með git log, færðu það á rétt branch með cherry-pick:
git checkout rett-branch
git cherry-pick <commit-hash> # afritar commit-ið yfir
git push origin rett-branchFjarlægðu það svo af ranga branch-inu ef þarf (endurskrifar sögu — aðeins á þínu eigin branch):
git checkout vitlaust-branch
git reset --hard HEAD~1
git push --force-with-lease origin vitlaust-branchÉg vil afturkalla breytingu sem er þegar á GitHub
Öruggasta leiðin er git revert — hún býr til nýtt commit sem afturkallar það gamla, án þess að endurskrifa sögu (og virkar því líka á sameiginlegum branchum):
git revert <commit-hash>
git push origin <branch>Þetta er betra en reset --hard + --force þegar aðrir gætu verið að vinna á sama branch.
Ég bjó til branch með röngu nafni
git branch -m gamalt-nafn nytt-nafn # endurnefnir locally
git push origin nytt-nafn # pushar nýja nafninu
git push origin --delete gamalt-nafn # eyðir gamla af GitHubBranch-ið mitt hefur klofnað frá main (diverging)
Ef main hefur breyst — til dæmis annað PR var samþykkt — á meðan þú vannst, þá hafa branch-in klofnað: hvort um sig á sín eigin nýju commit. Git segir þá gjarnan „your branch and ‘main’ have diverged”. Til að ná breytingunum af main inn í branch-ið þitt:
git checkout mitt-branch
git pull origin main # sækir main og sameinar inn í branch-ið þittÞetta býr til merge commit sem tengir saman. Komi upp árekstrar leysirðu þá eins og venjulegan merge conflict (sjá hér að neðan). Að því loknu er branch-ið aftur í takt við main og PR-ið þitt uppfærist sjálfkrafa.
Gerðu þetta reglulega meðan PR er opið — því lengur sem branch-ið er á eftir main, því stærri og erfiðari verða árekstrarnir þegar loks er sameinað.
Merge conflict
Þegar Git getur ekki sameinað sjálfkrafa færðu merkin <<<<<<<, ======= og >>>>>>> í skrárnar. Sjá Sameina breytingar og leysa árekstra fyrir skref. Ef þú vilt hætta við sameininguna og byrja upp á nýtt:
git merge --abortGott að muna
git pulláður en þú pushar (og helst áður en þú commit-ar) — sæktu reglulega ef fleiri vinna á branch-inu eðamain.git statusoggit logfyrst — aldrei laga í blindni.revertfram yfirreset --hard+--forceá sameiginlegum branchum.- Ef þú verður að nota force, notaðu
--force-with-lease, aldrei ámain. - Í vafa — spurðu áður en þú pushar force. Það er auðveldara að laga ópushað mistök.
Samantektartafla
| Vandamál | Skipun |
|---|---|
| Push hafnað (branch á eftir GitHub) | git pull → leysa → git push |
Branch klofnað frá main (diverging) |
git pull origin main |
| Gleymd skrá í síðasta commit | git commit --amend --no-edit |
| Afturkalla commit, halda breytingum | git reset --soft HEAD~1 |
| Afturkalla commit, henda breytingum | git reset --hard HEAD~1 |
Pushað óvart á main |
git checkout -b nytt → git reset --hard origin/main |
| Commit á röngu branch | git cherry-pick <hash> |
| Afturkalla pushaða breytingu (öruggt) | git revert <hash> |
| Endurnefna branch | git branch -m gamalt nytt |
| Hætta við merge | git merge --abort |
| Öruggara force-push | git push --force-with-lease |