Krajnji vodič za Git Merge i Git Rebase

Dobro došli u naš krajnji vodič za git mergete git rebasenaredbe. Ovaj tutorial naučit će vas svemu što trebate znati o kombiniranju više grana s Gitom.

Git Merge

git mergeNaredba će spojiti sve promjene koje su napravljene na kodnom bazu na zasebnu granu na vašu trenutnu granu kao nova počiniti.

Sintaksa naredbe je sljedeća:

git merge BRANCH-NAME

Na primjer, ako trenutno radite u podružnici s imenom devi želite spojiti sve nove promjene izvršene u podružnici pod nazivom new-features, izdati ćete sljedeću naredbu:

git merge new-features

Napomena: Ako postoje bilo kakve neprihvaćene promjene na vašoj trenutnoj grani, Git vam neće dopustiti spajanje dok se ne izvrše sve promjene u vašoj trenutnoj grani. Da biste se pozabavili tim promjenama, možete:

Stvorite novu granu i unesite promjene

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

Skrivaj ih

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

Napustite sve promjene

git reset --hard # removes all pending changes

Git Rebase

Ponovno postavljanje grane u Gitu način je za premještanje cijele grane u drugu točku na stablu. Najjednostavniji primjer je pomicanje grane dalje prema drvetu. Recimo da imamo granu koja se u točki A odvojila od glavne grane:

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

Kada prebazujete bazu podataka, možete je premjestiti ovako:

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

Da biste izvršili ponovnu bazu podataka, provjerite imate li sve željene predaje u ponovnoj bazi podataka u svojoj glavnoj grani. Pogledajte granu koju želite prebazirati i upisati git rebase master(gdje je master grana na kojoj želite ponovno bazirati).

Također je moguće bazu podataka izvršiti na drugoj grani, tako da se na primjer grana koja se temeljila na drugoj grani (nazovimo je značajkom) prebazira na master:

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

Nakon git rebase master branchili git rebase masterkada provjerite poslovnicu, dobit ćete:

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

Git rebase interaktivni u konzoli

Da biste koristili git rebaseu konzoli s popisom obveza, možete odabrati, urediti ili ispustiti u bazu podataka:

  • Unesite git rebase -i HEAD~5sa zadnjim brojem bilo kojim brojem predavanja od najnovije unatrag koje želite pregledati.
  • U vim pritisnite esc, a zatim iza početak uređivanja testa.
  • S lijeve strane možete prepisati pickpomoću jedne od naredbi u nastavku. Ako želite zgužvati predavanje u prethodnu i odbaciti poruku urezivanja, unesite fna mjesto pickpredavanja.
  • Spremite i zatvorite svoj uređivač teksta.
  • Kad se zaustavi ponovna baza, izvršite potrebne prilagodbe, a zatim koristite git rebase --continuedok ponovna baza ne uspije.
  • Ako se ponovno bazira, morat ćete prisiliti promjene git push -fda dodate rebased verziju u svoje udaljeno spremište.
  • Ako postoji sukob spajanja, postoji nekoliko načina da se to popravi, uključujući slijeđenje prijedloga u ovom vodiču. Jedan od načina je otvaranje datoteka u uređivaču teksta i brisanje dijelova koda koje ne želite. Zatim upotrijebite git add nakon čega slijedi git rebase --continue. Možete preskočiti konfliktno urezivanje unošenjem git rebase --skip, zaustaviti ponovno podcrtavanje pokretanjem git rebase --abortu svojoj konzoli.
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

Spoji sukobe

Sukob spajanja je kada urezujete na zasebnim granama koje mijenjaju istu liniju na sukobljene načine. Ako se to dogodi, Git neće znati koju verziju datoteke zadržati u poruci pogreške sličnoj sljedećoj:

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

Ako pogledate resumé.txtdatoteku u vašem uređivaču koda, možete vidjeti gdje se sukob dogodio:

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

Git je dodao nekoliko dodatnih redaka u datoteku:

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

Think of  ======= as the dividing line of the conflict. Everything between <<<<<<< HEAD and ======= is the content of the current branch that the HEAD ref is pointing to. On the other hand, everything between  ======= and >>>>>>> updated_address is the content in the branch being merged, updated_address.

Git Merge vs Git Rebase

Both git merge and git rebase are very useful commands, and one is not better than the other. However, there are some very important differences between the two commands that you and your team should take into consideration.

Whenever git merge is run, an extra merge commit is created. Whenever you are working in your local repository, having too many merge commits can make the commit history look confusing. One way to avoid the merge commit is to use git rebase instead.

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.