Üdvözöljük a git merge
és git rebase
parancsok végső útmutatójában . Ez az oktatóanyag megtanít mindent, amit tudnia kell a több ág és a Git kombinálásáról.
Git Merge
A git merge
parancs egyesíti azokat a változtatásokat, amelyeket a jelenlegi bázis külön ágában a kódbázis új végrehajtásként végrehajtott.
A parancs szintaxisa a következő:
git merge BRANCH-NAME
Például, ha jelenleg egy elnevezett fiókban dolgozik, dev
és egyesíteni szeretné az új nevű fiókban végrehajtott új módosításokat new-features
, akkor a következő parancsot adja ki:
git merge new-features
Megjegyzés: Ha az aktuális ágon vannak nem végrehajtott változtatások, a Git csak akkor engedélyezi az egyesülést, ha az aktuális fiók minden változását végrehajtják. A változások kezeléséhez a következőket teheti:
Hozzon létre egy új fiókot, és hajtsa végre a módosításokat
git checkout -b new-branch-name git add . git commit -m ""
Tedd őket
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
Hagyjon el minden változást
git reset --hard # removes all pending changes
Git Rebase
Az ág újbóli átértékelése a Gitben az ág teljes egészének áthelyezését jelenti a fa egy másik pontjára. A legegyszerűbb példa egy ág feljebb mozgatása a fában. Tegyük fel, hogy van egy águnk, amely eltér az A pontban található főágtól:
/o-----o---o--o-----o--------- branch --o-o--A--o---o---o---o----o--o-o-o--- master
Amikor újrabázol, akkor így mozgathatja:
/o-----o---o--o-----o------ branch --o-o--A--o---o---o---o----o--o-o-o master
Az újbóli alapozáshoz győződjön meg arról, hogy a főág újrabázisában minden kívánt elkötelezettséggel rendelkezik. Nézze meg az újrabázolni kívánt fiókot és írja be git rebase master
(ahol a master az az ág, amelyen újra szeretne alapozni).
Az is lehetséges, hogy egy másik ágon újrabázisozzon, így például egy olyan ág, amely egy másik ágon alapult (nevezzük funkciónak), a masterre alapozzon:
/---o-o branch /---o-o-o-o---o--o------ feature ----o--o-o-A----o---o--o-o-o--o--o- master
Miután git rebase master branch
vagy git rebase master
amikor megnézte a fiókot, a következőket kapja:
/---o-o-o-o---o--o------ feature ----o--o-o-A----o---o--o-o-o--o--o- master \---o-o branch
Git újraindítás interaktív a konzolon
Ha azt szeretné, hogy git rebase
a konzolban szerepeljen az elkövetések listája, kiválaszthatja, szerkesztheti vagy belehelyezheti az újraindítást:
- Írja be úgy
git rebase -i HEAD~5
, hogy az utolsó szám tetszőleges számú elkötelezettség legyen a legutóbbi, visszanézni kívánt visszafelé. - Vimben nyomja meg az
esc
, majdi
a teszt szerkesztésének megkezdéséhez. - A bal oldalon felülírhatja az
pick
egyiket az alábbi parancsokkal. Ha el akarja szedni az elkötelezettséget egy előzőbe, és elveti az elkötelezettség üzenetét, írja be az elkövetésf
helyétpick
. - Mentse el és lépjen ki a szövegszerkesztőből.
- Ha az újbázisbázis leállt, hajtsa végre a szükséges beállításokat, majd
git rebase --continue
addig használja, amíg az újrabázis sikeres lesz. - Ha sikeresen újraindul, akkor kényszerítenie kell a változtatásokat
git push -f
az újbázisú verzió hozzáadásához a távoli adattárba. - Összeolvadási konfliktus esetén ennek megoldására számos módon van lehetőség, ideértve az ebben az útmutatóban szereplő javaslatokat is. Az egyik mód az, hogy megnyitja a fájlokat egy szövegszerkesztőben, és törli a kód nem kívánt részeit. Ezután használja,
git add
majdgit rebase --continue
. Átugorhatja az ütköző kötelezettségvállalást a belépésselgit rebase --skip
,git rebase --abort
a konzolon történő futtatással leállíthatja az újrabázist .
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
Konfliktusok egyesítése
Összeolvadási konfliktus az, amikor külön ágakon hajt végre olyan műveleteket, amelyek ellentmondásos módon változtatják meg ugyanazt a sort. Ha ez megtörténik, a Git nem fogja tudni, hogy a fájl melyik verzióját kell megőriznie az alábbihoz hasonló hibaüzenetben:
CONFLICT (content): Merge conflict in resumé.txt Automatic merge failed; fix conflicts and then commit the result.
Ha megnézi a resumé.txt
fájlt a kódszerkesztőben, láthatja, hogy hol történt az ütközés:
<<<<<<>>>>>> updated_address
Git hozzáadott néhány további sort a fájlhoz:
<<<<<<< HEAD
=======
>>>>>>> updated_address
Gondoljunk csak =======
a konfliktus választóvonalára. Minden az aktuális ág között <<<<<<< HEAD
és =======
annak tartalma, amelyre a HEAD ref mutat. Másrészt, minden között =======
, és >>>>>>> updated_address
a tartalom az ág összevonták, updated_address
.
Git Merge vs Git Rebase
Mindkét git merge
és git rebase
nagyon hasznos parancsokat, és az egyik nem jobb, mint a másik. Van azonban néhány nagyon fontos különbség a két parancs között, amelyeket Önnek és csapatának figyelembe kell vennie.
Amikor git merge
fut, extra egyesítés véglegesítés létre. Valahányszor a helyi adattárban dolgozik, a túl sok összevonási végrehajtás zavarossá teheti az elkötelezettség előzményeit. Az egyesítés elkerülésének egyik módja a git rebase
helyette történő használat .
git rebase
is a very powerful feature. That being said, it is risky as well if it is not used in the right way. git rebase
alters the commit history, so use it with care. If rebasing is done in the remote repository, then it can create a lot of issues when other developers try to pull the latest code changes from the remote repository. Remember to only run git rebase
in a local repository.
That's all you need to know to merge and rebase with the best of 'em.