Nüüd, kui te enam GIT-d ei karda, saate teada, kuidas seda võimendada

Selle sarja esimeses osas vaadeldi GITi sisemist toimimist ja näidati, kuidas mitte karta Gitiga koostööd teha.

Nüüd, kui oleme aru saanud, kuidas Git töötab, alustame lihakate asjadega: kuidas oma projektides kasutada seda, mida teame.

Ühenda

Ühendamine ühendab teie koodi.

Mäletate, kuidas me järgisime Giti häid tavasid, et meil olid harud erinevate funktsioonide jaoks, millega töötasime, ja mitte kõike, mille peal töötasime master? Tuleb aeg, kui olete selle funktsiooniga lõpetanud, ja soovite selle oma funktsiooni lisada master. Siit mergetuleb sisse. Sa tahad oma haru meistriks ühendada .

Ühendusi on kahte tüüpi:

Kiire edasiliitmine

Tulles tagasi meie eelmise korra näite juurde:

See on sama lihtne kui liigutades silt master, et the-ending. Gitil pole kahtlust, mida täpselt teha tuleb - kuna meie "puul" oli üks ainus lingitud sõlmede loend.

$ git branch master * the-ending $ git checkout master Switched to branch 'master' $ git merge the-ending Updating a39b9fd..b300387 Fast-forward byeworld | 1 + 1 file changed, 1 insertion(+) create mode 100644 byeworld

Mittekiire ühendamine edasi

See on selline ühendamine, kus Git ei tea, mida teha. Alusharul on mõned muudatused ja veel harul, mida soovime ühendada, mille tulemuseks on hirmutavad ühenduskonfliktid !

Ühinemiskonfliktide kohta peaksite kõigepealt teadma: kui te ei tea, mis toimub:

git merge --abort

See viib teid tagasi algsesse olekusse, ilma kõrvaltoimeteta. Katkestasite just segaduse, mida kavatsesite teha.

Läheme nüüd samm-sammult konfliktide liitmise lahendamise poole.

$ git checkout -b the-middle Switched to a new branch 'the-middle'

Oma stiili jätkamisel õpime näite abil. Ma muudan helloworldharul the-middle.

$ git diff diff --git a/helloworld b/helloworld index a042389..e702052 100644 --- a/helloworld +++ b/helloworld @@ -1 +1,3 @@ hello world! + +Middle World

Lisa ja pühendu edasi the-middle.

Seejärel lülitan sisse masterja muudan helloworldmasterile. Lisan järgmise:

$ git diff --cached diff --git a/helloworld b/helloworld index a042389..ac7a733 100644 --- a/helloworld +++ b/helloworld @@ -1 +1,3 @@ hello world! + +Master World

Kas näete, miks ma pidin git diff --cachedsiin tegema ? Kui ei, siis küsige minult allpool!

Nüüd on aeg ühineda!

$ git merge the-middle Auto-merging helloworld CONFLICT (content): Merge conflict in helloworld Automatic merge failed; fix conflicts and then commit the result.

Kui mergeebaõnnestub, teeb git järgmist: see muudab faili liitmisega, et näidata teile täpselt seda, mille üle ta ei saa otsustada.

$ cat helloworld hello world!
$ cat helloworld hello world! <<<<<<>>>>>> the-middle

Kas see on loogiline? <<<<< HEADOsa on meie (baasi filiaali) ja >>>>> the-middle parton theirs(filiaali sulandumisel aluse filiaal).

Võite lihtsalt faili redigeerida, et eemaldada giti lisatud lisakraamid, ja valida, millesse helloworldlõpuks peaks minema . Selle hõlbustamiseks on mõned tööriistad ja redaktorite integreerimised, kuid arvan, et selle kapoti all toimimise teadmine annab teile suurema enesekindluse, kui teil pole oma lemmiktoimetajat.

$ git status On branch master You have unmerged paths. (fix conflicts and run "git commit") (use "git merge --abort" to abort the merge) Unmerged paths: (use "git add ..." to mark resolution) both modified: helloworld

Otsustasin mõlemad bitid endale jätta.

$ cat helloworld hello world! Master World Middle World

Ja seal see teil on:

$ git add helloworld $ git commit -m "resolve merge conflict" [master c747e68] resolve merge conflict

Puldid

Kuna versioonide allikakontrolli üks võimalusi on katastroofide korral koodi salvestamine - siin on abiks kaugjuhtimispuldid. Pult on teie git-hoidla väliselt hostitud koopia. Täpsuse huvides on kaugjuhtimispult väline hoidla (mitte tingimata sama koodiga, mis teil on). Väliselt võib see olla teie süsteemi teises kaustas või pilves.

Kloon

Kloon kloonib hoidla kaugjuhtimispult teie praegusesse töökataloogi. See on lihtsalt .git/kausta koopia loomine , mis annab meile kogu ajaloo ja failid, mis on vajalikud töökataloogi täitmiseks.

git clone 

Kui te pole klooninud, pole teil tõenäoliselt pulti. Saate luua sellise puldi:

git remote add  

Lükka ja tõmba

Push and Pull on toimingud, mida rakendatakse remote.

Push lükkab teie muudatused kaugjuhtimispuldile. Niisiis, me saadame Indexja vastava Objectsobjekti poest!

git push  

Pull tõmbab koodi kaugjuhtimispuldist. Täpselt nagu varem kopeerime objektipoest Indexja vastavad Objects!

git pull origin master

originon puldi vaikenimi. Ja kuna masteron vaikimisi filiaal, näed, kuidas käsk devolves lihtne nimi leiame kõikjal: git pull origin master. Nüüd teate paremini.

Lähtesta

Lähtestamine lähtestab koodibaasi eelmisele versioonile. Lähtestamisel on 3 lippu:

--soft, --hardJa --mixed.

Ilu reset, on võimalik muuta ajalugu. Oletame, et tegite a-ga vea commit, ja nüüd olete git logkõik segi läinud selliste toimingutega nagu:

Bugfix

Final BugFix

Final Final BugFix

God why isn't this working last try bug fix

Kui soovite oma masterajaloo puhtana hoida , siis soovite selle pühenduspäeviku puhastada.

Kui saadate tõmbetaotluse sinna, kus pole mingit kokkupõrget, ootaksid nad ka puhast pühendusajalugu!

Seal see resettuleb: võite resetkõik oma kohustused muuta ja teisendada need üheks kohustuseks:got sh*t done!

(Palun ärge kasutage seda kohustusliku sõnumina - järgige parimaid tavasid!)

Tuleme tagasi meie näite juurde.

$ git log commit 959781ec78c970d4797c5e938ec154de44d0151b (HEAD -> master) Author: Neil Kakkar Date: Mon Nov 5 07:32:55 2018 +0000 God why isn't this working last final BugFix commit affa90c0db78999d22c326fdbd6c1d5057228822 Author: Neil Kakkar Date: Mon Nov 5 07:32:19 2018 +0000 Final Final BugFix commit 2e9570cffc0a8206132d75c402d68351eda450bd Author: Neil Kakkar Date: Mon Nov 5 07:31:49 2018 +0000 Final BugFix commit 4560fc0ec6305d0b7bcfb4be1901438fd126d6d1 Author: Neil Kakkar Date: Mon Nov 5 07:31:21 2018 +0000 BugFix commit c747e6891af419119fd817dc69a2e122084aedae Merge: 3d01508 fb8b2fc Author: Neil Kakkar Date: Tue Oct 23 07:44:09 2018 +0100 resolve merge conflict

Nüüd, kui viga on parandatud, tahan oma ajaloo puhastada, enne kui selle kallale asun master. See töötaks ka hästi - kui ütlen näiteks, et hiljem saan aru, et tutvustasin veel ühte viga ja pean minema tagasi eelmisele versioonile. Sel juhul c747e689pole selle mõistmiseks parimat pühendumissõnumit.

$ git reset c747e6891af419119fd817dc69a2e122084aedae $ git log commit c747e6891af419119fd817dc69a2e122084aedae (HEAD -> master) Merge: 3d01508 fb8b2fc Author: Neil Kakkar Date: Tue Oct 23 07:44:09 2018 +0100 resolve merge conflict

Seal, kõik sorteeritud?

$ git status On branch master Untracked files: (use "git add ..." to include in what will be committed) clean.txt nothing added to commit but untracked files present (use "git add" to track)

clean.txton fail, mille veaparanduse jaoks andsin. Nüüd pole mul muud teha kui:

$ git add clean.txt $ git commit -m "fix bug: Unable to clean folder" [master d8487ca] fix bug: Unable to clean folder 1 file changed, 4 insertions(+) create mode 100644 clean.txt $ git log commit d8487ca8b9acfa9666bdf2c6b7fa27b3971bd957 (HEAD -> master) Author: Neil Kakkar Date: Mon Nov 5 07:41:41 2018 +0000 fix bug: Unable to clean folder commit c747e6891af419119fd817dc69a2e122084aedae Merge: 3d01508 fb8b2fc Author: Neil Kakkar Date: Tue Oct 23 07:44:09 2018 +0100 resolve merge conflict

Seal tehtud ja tolmunud. Kas sa vist nüüd, kasutades vihjeid alates logon resetkäsu süntaks ja oma tech-mõttes aru saada, kuidas see töötab kulisside taga?

Resetlõikab määratud pühenduse korral pühenduspuu maha. Kõik selle haru sildid - kui need on ees - viiakse tagasi määratud pühenduse juurde. Kas olemasolevad failid jäävad siiski objektipoodi? Teate, kuidas seda nüüd kontrollida, äss.

The files are also removed from the staging area. Now this might be a problem if you have lots of untracked/modified files which you don’t want to add.

How do you do that?

Can you pick up the clue I left in the beginning of this section?

Behaviour flags!

--soft keeps all files staged.

$ git reset --soft c747e6891af419119fd817dc69a2e122084aedae $ git status On branch master Changes to be committed: (use "git reset HEAD ..." to unstage) new file: clean.txt

--mixed is the default: Removes all files from staging area too.

--hard is hard-core. Deletes files from the object store — and directory as well. Use with extreme caution. There goes my bug fix*. Gone.

$ git reset --hard c747e6891af419119fd817dc69a2e122084aedae HEAD is now at c747e68 resolve merge conflict $ git status On branch master nothing to commit, working tree clean

*Well, not completely. Git is amazing. Have you heard of meta-meta data? A redundancy log of what happened in the repository? Yes, of course git keeps it!

$ git reflog c747e68 (HEAD -> master) [email protected]{0}: reset: moving to c747e6891af419119fd817dc69a2e122084aedae efc6d21 [email protected]{1}: commit: soft reset c747e68 (HEAD -> master) [email protected]{2}: reset: moving to c747e6891af419119fd817dc69a2e122084aedae d8487ca [email protected]{3}: commit: fix bug: Unable to clean folder c747e68 (HEAD -> master) [email protected]{4}: reset: moving to c747e6891af419119fd817dc69a2e122084aedae 959781e [email protected]{5}: commit: God why isn't this working last final BugFix affa90c [email protected]{6}: commit: Final Final BugFix 2e9570c [email protected]{7}: commit: Final BugFix 4560fc0 [email protected]{8}: commit: BugFix c747e68 (HEAD -> master) [email protected]{9}: commit (merge): resolve merge conflict 3d01508 [email protected]{10}: commit: add Master World b300387 (the-ending) [email protected]{11}: checkout: moving from the-middle to master fb8b2fc (the-middle) [email protected]{12}: commit: add Middle World b300387 (the-ending) [email protected]{13}: checkout: moving from master to the-middle b300387 (the-ending) [email protected]{14}: checkout: moving from the-middle to master b300387 (the-ending) [email protected]{15}: checkout: moving from master to the-middle b300387 (the-ending) [email protected]{16}: merge the-ending: Fast-forward a39b9fd [email protected]{17}: checkout: moving from the-ending to master b300387 (the-ending) [email protected]{18}: checkout: moving from master to the-ending a39b9fd [email protected]{19}: checkout: moving from the-ending to master b300387 (the-ending) [email protected]{20}: commit: add byeworld a39b9fd [email protected]{21}: checkout: moving from master to the-ending a39b9fd [email protected]{22}: commit (initial): Add helloworld

This is everything from the beginning of the example in the previous article. Does this mean I can recover things if I made an awful mistake?

$ git checkout d8487ca Note: checking out 'd8487ca'. You are in 'detached HEAD' state. You can look around, make experimental changes and commit them, and you can discard any commits you make in this state without impacting any branches by performing another checkout. If you want to create a new branch to retain commits you create, you may do so (now or later) by using -b with the checkout command again. Example: git checkout -b  HEAD is now at d8487ca... fix bug: Unable to clean folder $ ls byeworld clean.txt helloworld

There you have it.

Congratulations, you’re a Git Ninja — Apprentice now.

Kas on veel midagi, millest soovite teada? Midagi, mis teid Giti juures segadusse ajas? Andke allpool teada! Proovin seda seletada nii, nagu õppisin!

Nautisid seda? Ärge jätke postitust uuesti nägemata - tellige minu meililist!