Galutinis „Git Merge“ ir „Git Rebase“ vadovas

Sveiki atvykę į mūsų pagrindinį vadovą git mergeir git rebasekomandas. Ši pamoka išmokys viską, ką reikia žinoti apie kelių šakų sujungimą su „Git“.

Susijungti

git mergeKomanda sujungti bet kokius pakeitimus, kurie buvo padaryti kodo bazę atskirame filialo jūsų dabartinės filialas, kaip naujas įsipareigoti.

Komandų sintaksė yra tokia:

git merge BRANCH-NAME

Pvz., Jei šiuo metu dirbate filiale pavadinimu devir norite sujungti visus naujus pakeitimus, kurie buvo padaryti filiale pavadinimu new-features, išleisite šią komandą:

git merge new-features

Pastaba: jei jūsų dabartiniame filiale yra neįvykdytų pakeitimų, „Git“ neleis sujungti, kol nebus atlikti visi dabartinio filialo pakeitimai. Norėdami tvarkyti šiuos pakeitimus, galite:

Sukurkite naują filialą ir atlikite pakeitimus

git checkout -b new-branch-name git add . git commit -m ""

Atmeskite juos

git stash # add them to the stash git merge new-features # do your merge git stash pop # get the changes back into your working tree

Atsisakykite visų pakeitimų

git reset --hard # removes all pending changes

Git Rebase

Pakartotinis šakos nustatymas „Git“ yra būdas perkelti šakos visumą į kitą medžio tašką. Paprasčiausias pavyzdys yra šakos perkėlimas aukštyn medyje. Tarkime, kad turime atšaką, kuri skyrėsi nuo pagrindinės šakos taške A:

 /o-----o---o--o-----o--------- branch --o-o--A--o---o---o---o----o--o-o-o--- master

Kai perkursite iš naujo, galėsite jį perkelti taip:

 /o-----o---o--o-----o------ branch --o-o--A--o---o---o---o----o--o-o-o master

Norėdami iš naujo nustatyti bazę, įsitikinkite, kad turite visus įsipareigojimus, kuriuos norite atlikti pagrindinėje šakoje. Patikrinkite filialą, kurį norite iš naujo sukurti ir įveskite git rebase master(kur pagrindinis yra filialas, kurį norite iš naujo sukurti).

Taip pat galima iš naujo nustatyti kitą šaką, kad, pavyzdžiui, filialas, kuris buvo pagrįstas kitu filialu (pavadinkime tai funkcija), bus perkeltas į pagrindinį:

 /---o-o branch /---o-o-o-o---o--o------ feature ----o--o-o-A----o---o--o-o-o--o--o- master

Kai patikrinsite filialą git rebase master brancharba git rebase masterpatikrinsite filialą, gausite:

 /---o-o-o-o---o--o------ feature ----o--o-o-A----o---o--o-o-o--o--o- master \---o-o branch

„Git rebase“ interaktyvi konsolėje

Jei norite naudoti git rebasekonsolėje su įsipareigojimų sąrašu, galite pasirinkti, redaguoti arba įkelti iš naujo:

  • Įveskite git rebase -i HEAD~5paskutinį skaičių, nurodant bet kokį įvykdytų įsipareigojimų skaičių nuo paskutinio atgalinio, kurį norite peržiūrėti.
  • „Vim“ paspauskite esc, tada ipradėkite redaguoti testą.
  • Kairėje pusėje galite perrašyti pickvieną iš žemiau esančių komandų. Jei norite Skvošas įsipareigoti į ankstesnį ir išmeskite įsipareigoti pranešimą, įveskite fį tą vietą pickiš įsipareigoti.
  • Išsaugokite ir uždarykite teksto rengyklę.
  • Kai sustabdoma pakartotinė bazė, atlikite reikiamus pakeitimus, tada naudokite, git rebase --continuekol pakartotinė bazė bus sėkminga.
  • Jei jis sėkmingai perkraunamas, turite priversti atlikti pakeitimus, git push -fkad pridėtumėte iš naujo pagrįstą versiją į nuotolinę saugyklą.
  • Jei yra susijungimo konfliktas, yra keli būdai, kaip tai išspręsti, įskaitant šio vadovo pasiūlymų laikymąsi. Vienas iš būdų yra atidaryti failus teksto rengyklėje ir ištrinti tas kodus, kurių nenorite. Tada naudokite git add ir git rebase --continue. Galite praleisti prieštaraujantį įsipareigojimą įvesdami git rebase --skip, sustabdyti pakartotinį paleidimą paleisdami git rebase --abortsavo konsolę.
pick 452b159  pick 7fd4192  pick c1af3e5  pick 5f5e8d3  pick 5186a9f  # Rebase 0617e63..5186a9f onto 0617e63 (30 commands) # # Commands: # p, pick = use commit # r, reword = use commit, but stop to edit the commit message. # e, edit = use commit, but stop to amend or add commit. # s, squash = use commit, meld into previous commit and stop to edit the commit message. # f, fixup = like "squash", but discard this commit's log message thus doesn't stop. # x, exec = run command (the rest of the line) using shell # d, drop = remove commit # # These lines can be re-ordered; they are executed from top to bottom. # # If you remove a line here THAT COMMIT WILL BE LOST. # # However, if you remove everything, the rebase will be aborted. # # Note that empty commits are commented out

Sujungti konfliktus

Sujungimo konfliktas yra tada, kai jūs įsipareigojate atskirose šakose, kurios prieštaringai keičia tą pačią eilutę. Tokiu atveju „Git“ nežinos, kurią failo versiją laikyti klaidos pranešime, panašiame į šį:

CONFLICT (content): Merge conflict in resumé.txt Automatic merge failed; fix conflicts and then commit the result.

Peržiūrėję resumé.txtfailą savo kodo rengyklėje, galite pamatyti, kur kilo konfliktas:

<<<<<<>>>>>> updated_address

„Git“ prie failo pridėjo keletą papildomų eilučių:

  • <<<<<<< HEAD
  • =======
  • >>>>>>> updated_address

Pagalvokite apie   =======konflikto skiriamąją liniją. Viskas tarp dabartinio filialo turinio <<<<<<< HEADir =======yra jo turinys, į kurį nurodo HEAD ref. Kita vertus, viskas, kas   yra sujungiama filialo turinys =======ir >>>>>>> updated_addressyra jo turinys, yra updated_address.

„Git Merge“ ir „Git Rebase“

Abi git mergeir git rebaseyra labai naudingos komandos, ir viena nėra geresnė už kitą. Tačiau yra keletas labai svarbių dviejų komandų skirtumų, į kuriuos turėtumėte atsižvelgti jūs ir jūsų komanda.

Kai git mergetik vykdoma, sukuriamas papildomas sujungimo įsipareigojimas. Kai dirbate vietinėje saugykloje, turėdami per daug sujungimo įsipareigojimų, įsipareigojimų istorija gali atrodyti paini. Vienas iš būdų išvengti susijungimo yra naudoti git rebasevietoj to.

git rebaseyra labai galinga funkcija. Tai sakant, rizikinga ir tuo atveju, jei jis nėra naudojamas tinkamai. git rebasekeičia įsipareigojimų istoriją, todėl naudokite ją atsargiai. Jei pakartotinis pakeitimas atliekamas nuotolinėje saugykloje, tai gali sukelti daug problemų, kai kiti kūrėjai bando ištraukti naujausius kodo pakeitimus iš nuotolinės saugyklos. Nepamirškite paleisti git rebasetik vietinėje saugykloje.

Tai viskas, ką jums reikia žinoti, kad galėtumėte sujungti ir iš naujo sukurti geriausius iš jų.