Git Pull Force - Kuinka korvata paikalliset muutokset Gitillä

Kun opit koodaamaan, opit ennemmin tai myöhemmin myös versionhallintajärjestelmistä. Ja vaikka tässä tilassa on monia kilpailevia työkaluja, yksi niistä on tosiasiallisesti standardi, jota lähes kaikki alan ammattilaiset käyttävät. Se on niin suosittu, että on yrityksiä, jotka käyttävät sen nimeä tuotemerkinnöissään. Puhumme tietysti Gitistä.

Vaikka Git on tehokas työkalu, sen voima on piilotettu. On joitain keskeisiä käsitteitä, jotka sinun on ymmärrettävä, jotta tulisit todella taitavaksi Gitin kanssa. Hyvä uutinen on, että kun opit ne, tuskin koskaan törmäät vaikeuksiin, joista et pääse pakenemaan.

Tyypillinen työnkulku

Tyypillisessä Git-työnkulussa käytetään paikallista tietovarastoa, etätietovarastoa ja yhtä tai useampaa haaraa. Arkistot tallentavat kaikki tiedot projektista, mukaan lukien sen koko historia ja kaikki sivukonttorit. Haara on pohjimmiltaan kokoelma muutoksia, jotka johtavat tyhjästä projektista nykytilaan.

Kloonattuasi arkiston, työskentelet paikallisen kopion parissa ja otat käyttöön uusia muutoksia. Siihen asti kun siirrät paikallisia muutoksia etätietovarastoon, kaikki työsi ovat käytettävissä vain koneellasi.

Kun olet suorittanut tehtävän, on aika synkronoida etätietovaraston kanssa. Haluat vetää kaukomuutokset pysyäksesi projektin etenemisessä ja haluat työntää paikallisia muutoksia jakamaan työsi muiden kanssa.

Paikalliset muutokset

Kaikki on hyvin, kun sinä ja muu tiimisi työskentelevät täysin erillisten tiedostojen parissa. Mitä tapahtuu, et astu toistenne jaloille.

On kuitenkin aikoja, jolloin sinä ja joukkuetoverisi teette samanaikaisesti muutoksia samassa paikassa. Ja yleensä ongelmat alkavat.

Oletko koskaan teloittanut git pullvain nähdäksesi pelätyn error: Your local changes to the following files would be overwritten by merge:? Ennemmin tai myöhemmin kaikki kohtaavat tämän ongelman.

Tässä on hämmentävämpää, että et halua yhdistää mitään, vedä vain, eikö? Itse asiassa vetäminen on hieman monimutkaisempi kuin luulit.

Kuinka tarkalleen Git Pull toimii?

Vedä ei ole yksi toimenpide. Se koostuu tietojen hakemisesta etäpalvelimelta ja muutosten yhdistämisestä sitten paikalliseen arkistoon. Nämä kaksi toimintoa voidaan suorittaa manuaalisesti, jos haluat:

git fetch git merge origin/$CURRENT_BRANCH

origin/$CURRENT_BRANCHOsa tarkoittaa, että:

  • Git yhdistää muutokset nimetystä etätietovarastosta origin(kloonatusta)
  • jotka on lisätty $CURRENT_BRANCH
  • joita ei vielä ole paikallisessa uloskirjautuneessa sivuliikkeessä

Koska Git suorittaa fuusioita vain silloin, kun ei ole tekemättä muutoksia, joka kerta kun suoritat git pulltekemättä muutoksia, saatat joutua vaikeuksiin. Onneksi on tapoja päästä eroon ongelmista yhtenä kappaleena!

Olemme perhe

Eri lähestymistavat

Kun sinulla on tekemättä paikallisia muutoksia ja haluat silti hankkia uuden version etäpalvelimelta, käyttötapauksesi kuuluu yleensä johonkin seuraavista tilanteista. Jompikumpi:

  • et välitä paikallisista muutoksista ja haluat korvata ne,
  • välität muutoksista erittäin paljon ja haluaisit soveltaa niitä etämuutosten jälkeen,
  • haluat ladata etämuutokset, mutta et vielä käytä niitä

Jokainen lähestymistapa vaatii eri ratkaisun.

Et välitä paikallisista muutoksista

Tässä tapauksessa haluat vain pudottaa kaikki tekemättömät paikalliset muutokset. Ehkä muokkait tiedostoa kokeilua varten, mutta et enää tarvitse muokkausta. Kaikki mitä välität, on olla ajan tasalla alkupään kanssa.

Tämä tarkoittaa, että lisäät vielä yhden vaiheen etämuutosten hakemisen ja yhdistämisen välille. Tämä vaihe palauttaa haaran muokkaamattomaan tilaansa, jolloin git mergese toimii.

git fetch git reset --hard HEAD git merge origin/$CURRENT_BRANCH

Jos et halua kirjoittaa sivuliikkeen nimi aina käyttää tätä komentoa, Git on mukava oikotie osoittaa alkupään haara: @{u}. Ylävirran haara on etätietovaraston haara, johon työnnät ja josta haet.

Näin yllä olevat komennot näyttävät pikakuvakkeelta:

git fetch git reset --hard HEAD git merge '@{u}'

Lainaamme esimerkin pikakuvaketta estämään kuorta tulkitsemasta sitä.

Pidät erittäin paljon paikallisista muutoksista

Kun tekemättömät muutokset ovat sinulle merkittäviä, on kaksi vaihtoehtoa. Voit sitouttaa heidät ja suorittaa sitten git pulltai kätkeä ne.

Stashing tarkoittaa muutosten asettamista hetkeksi tuoda ne takaisin myöhemmin. Tarkemmin sanottuna git stashluo sitoutumisen, joka ei ole näkyvissä nykyisessä haarassasi, mutta Gitin käytettävissä.

Voit palauttaa viimeiseen varastoon tallennetut muutokset käyttämällä git stash popkomentoa. Kun säilötyt muutokset on suoritettu onnistuneesti, tämä komento poistaa myös säilytyssitoumuksen, koska sitä ei enää tarvita.

Työnkulku voi silloin näyttää tältä:

git fetch git stash git merge '@{u}' git stash pop

Oletusarvoisesti muutokset varastosta säilyvät. Jos haluat poistaa ne lavasta, käytä komentoa git restore --staged(jos Git on uudempi kuin 2.25.0).

Haluat vain ladata etämuutokset

Viimeinen skenaario on hieman erilainen kuin edelliset. Sanotaan, että olet keskellä hyvin sotkuista refaktorointia. Muutosten menettäminen tai pysäyttäminen ei ole vaihtoehto. Silti haluat silti, että etämuutokset ovat käytettävissä git diffniitä vastaan.

Kuten olet todennäköisesti huomannut, etämuutosten lataaminen ei vaadi git pullollenkaan! git fetchon juuri tarpeeksi.

One thing to note is that by default, git fetch will only bring you changes from the current branch. To get all the changes from all the branches, use git fetch --all. And if you'd like to clean up some of the branches that no longer exist in the remote repository, git fetch --all --prune will do the cleaning up!

Some Automation

Have you heard of Git Config? It's a file where Git stores all of the user-configured settings. It resides in your home directory: either as ~/.gitconfig or ~/.config/git/config. You can edit it to add some custom aliases that will be understood as Git commands.

For example, to have a shortcut equivalent to git diff --cached (that shows the difference between the current branch and the staged files), you'd add the following section:

[alias] dc = diff --cached

After that, you can run git dc whenever you wish to review the changes. Going this way, we can set up a few aliases related to the previous use cases.

[alias] pull_force = !"git fetch --all; git reset --hard HEAD; git merge @{u}" pf = pull_force pull_stash = !"git fetch --all; git stash; git merge @{u}; git stash pop"

This way, running git pull_force will overwrite the local changes, while git pull_stash will preserve them.

The Other Git Pull Force

Curious minds may have already discovered that there is such a thing as git pull --force. However, this is a very different beast to what's presented in this article.

It may sound like something that would help us overwrite local changes. Instead, it lets us fetch the changes from one remote branch to a different local branch. git pull --force only modifies the behavior of the fetching part. It is therefore equivalent to git fetch --force.

Like git push, git fetch allows us to specify which local and remote branch do we want to operate on. git fetch origin/feature-1:my-feature will mean that the changes in the feature-1 branch from the remote repository will end up visible on the local branch my-feature. When such an operation modifies the existing history, it is not permitted by Git without an explicit --force parameter.

Just like git push --force allows overwriting remote branches, git fetch --force (or git pull --force) allows overwriting local branches. It is always used with source and destination branches mentioned as parameters. An alternative approach to overwriting local changes using git --pull force could be git pull --force "@{u}:HEAD".

Conclusion

Gitin maailma on valtava. Tämä artikkeli käsitteli vain yhtä arkiston ylläpidon puolia: etämuutosten sisällyttäminen paikalliseen arkistoon. Jopa tämä jokapäiväinen skenaario vaati meitä tarkastelemaan hieman syvällisemmin tämän versionhallintatyökalun sisäisiä mekanismeja.

Todellisten käyttötapausten oppiminen auttaa sinua ymmärtämään paremmin, miten Git toimii konepellin alla. Tämä puolestaan ​​saa sinut tuntemaan itsesi valtuutetuksi aina joutuessasi vaikeuksiin. Me teemme niin aika ajoin.