Den ultimative guide til Git Merge og Git Rebase

Velkommen til vores ultimative guide til den git mergeog git rebasekommandoer. Denne tutorial lærer dig alt hvad du behøver at vide om at kombinere flere grene med Git.

Git Merge

Den git mergekommando vil fusionere eventuelle ændringer, der blev foretaget i kodebase på en separat gren på din nuværende gren som en ny begå.

Kommandosyntaks er som følger:

git merge BRANCH-NAME

For eksempel, hvis du i øjeblikket arbejder i en filial med navnet devog gerne vil flette nye ændringer, der blev foretaget i en filial med navnet new-features, ville du udstede følgende kommando:

git merge new-features

Bemærk: Hvis der er uforpligtede ændringer i din nuværende filial, tillader Git dig ikke at fusionere, før alle ændringer i din nuværende filial er begået. For at håndtere disse ændringer kan du enten:

Opret en ny filial og begiv ændringerne

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

Stash dem

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

Forlad alle ændringer

git reset --hard # removes all pending changes

Git Rebase

Omlægning af en gren i Git er en måde at flytte hele en gren til et andet punkt i træet. Det enkleste eksempel er at flytte en gren længere op i træet. Sig, at vi har en gren, der afveg fra mastergrenen ved punkt A:

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

Når du rebase, kan du flytte det sådan:

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

For at rebase skal du sørge for at have alle de forpligtelser, du vil have i rebase i din mastergren. Tjek den gren, du vil rebase, og skriv git rebase master(hvor master er den gren, du vil rebase på).

Det er også muligt at rebase på en anden gren, så for eksempel en gren, der var baseret på en anden gren (lad os kalde det funktion), bliver rebaseret på master:

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

Efter git rebase master brancheller git rebase masternår du har tjekket ud i filialen, får du:

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

Git rebase interaktiv i konsollen

For at bruge git rebasei konsollen med en liste over forpligtelser kan du vælge, redigere eller slippe i rebasen:

  • Indtast git rebase -i HEAD~5med det sidste nummer et vilkårligt antal forpligtelser fra den seneste baglæns, du vil gennemgå.
  • I vim skal du trykke på escog derefter for iat begynde at redigere testen.
  • På venstre side kan du overskrive den pickmed en af ​​nedenstående kommandoer. Hvis du vil klemme en forpligtelse ind i en tidligere og kassere forpligtelsesmeddelelsen, skal du indtaste fstedet for pickforpligtelsen.
  • Gem og afslut din teksteditor.
  • Når rebase er stoppet, skal du foretage de nødvendige justeringer og derefter bruge, git rebase --continueindtil rebase er vellykket.
  • Hvis det genstartes med succes, skal du tvinge dine ændringer til for git push -fat tilføje den rebaserede version til dit eksterne lager.
  • Hvis der er en fusionskonflikt, er der en række måder at løse dette på, herunder at følge forslagene i denne vejledning. En måde er at åbne filerne i en teksteditor og slette de dele af koden, du ikke ønsker. Brug git add derefter efterfulgt af git rebase --continue. Du kan springe over den modstridte forpligtelse ved at gå ind git rebase --skip, stoppe rebasing ved at køre git rebase --aborti din 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

Flet konflikter

En fusionskonflikt er, når du forpligter dig til separate grene, der ændrer den samme linje på modstridende måder. Hvis dette sker, ved Git ikke, hvilken version af filen der skal gemmes i en fejlmeddelelse svarende til følgende:

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

Hvis du ser på resumé.txtfilen i din kodeeditor, kan du se, hvor konflikten fandt sted:

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

Git tilføjede nogle ekstra linjer til filen:

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

Tænk på det   =======som skillelinjen i konflikten. Alt imellem <<<<<<< HEADog =======er indholdet af den nuværende gren, som HEAD ref. Peger på. På den anden side, alt mellem   =======og >>>>>>> updated_addresser indholdet i den gren væsen fusioneret, updated_address.

Git Merge vs Git Rebase

Begge git mergeog git rebaseer meget nyttige kommandoer, og den ene er ikke bedre end den anden. Der er dog nogle meget vigtige forskelle mellem de to kommandoer, som du og dit team skal tage i betragtning.

Når git mergeder køres, oprettes der en ekstra fusionsforpligtelse. Når du arbejder i dit lokale arkiv, kan det være forvirrende at have for mange fusionsforpligtelser ved at have for mange fusionsforpligtelser. En måde at undgå fusionsforpligtelsen er at bruge i git rebasestedet.

git rebaseer en meget kraftig funktion. Når det er sagt, er det også risikabelt , hvis det ikke bruges på den rigtige måde. git rebaseændrer begivenhedshistorikken, så brug den med forsigtighed. Hvis rebasing udføres i fjernlageret, kan det skabe mange problemer, når andre udviklere forsøger at hente de seneste kodeændringer fra fjernlageret. Husk kun at køre git rebasei et lokalt lager.

Det er alt hvad du behøver at vide for at fusionere og genbasere det bedste af dem.