“venligst rebase på toppen af master og vi vil fusionere din pull anmodning”.
” kan du venligst S ?uash dine forpligtelser sammen, så vi får en ren, reversibel githistory?”.
“kan du omskrive din commit’ s besked for bedre at beskrive problemet det løser, og hvordan det løser det?”.
spørgsmål som disse stilles ofte i pull-anmodninger. Lad os se hvorfor deeksisterer, hvordan man udfører dem og deres mulige problemer.,
Omskriv den sidste commit-meddelelse
en af de enkleste historieomskrivninger, vi kan gøre med git, ændrer lastcommit-meddelelsen. Lad os sige lige efter at have begået en forpligtelse, finder du en skrivefejl i densbeskrivelse, eller du finder en bedre måde at beskrive ændringen på. For at gøre korrektionen du kører:
git commit --amend
det åbner en editor med den sidste commit-meddelelse, så du kan ændre den. Efter at have gemt, en ny commitvil blive oprettet med de samme ændringer og den nye besked, der erstatter commitmed den forrige besked.,
dette kan være nyttigt at inkludere filer, du har glemt at spore, eller includemodifications til de filer, du lige har forpligtet. For at gøre dette, kan du tilføje den ændringerog derefter udføre ændre:
git add README.md config/routes.rb git rm notes.txt git commit --amend
Bortset fra at redigere begå besked, den nye begå vil indeholde changesspecified med git add
og git rm
. Du kan også redigere forfatteren. Forexample:
git commit --amend --author="Tute Costa and Dan Croak <[email protected]>"
Achievement Unlocked!, Du kan nu ændre den sidste commit ofyour repository til at omfatte nyere ændringer i filerne, og / eller for at forbedre commit besked. Men start ikke med at ændre alt det, før du forstår det sidste afsnit af dette blogindlæg med titlen “DANGER”.
omordne andre commit-meddelelser
ville meget gerne tale om dette nu, men vi er nødt til at forstå et mere genereltværktøj før. Bliv hængende! Alt andet vil være lettere, når vi læser om…
Interaktive Rebase
git rebase
re-gælder begår, en byone, i rækkefølge, fra din nuværende filial på en anden., Det accepterer flere muligheder og parametre, så det er et tip af isbjerget forklaring, nok til at bygge bro mellem Stackoverflo.eller GitHub kommentarer og git man sider.
en interessant mulighed, den accepterer, er --interactive
(-i
kort), som åbner en redaktør med en liste over de forpligtelser, der er ved at blive ændret. Thislist accepterer kommandoer, så brugeren kan redigere listen, før du starter thebase handling.
lad os se et eksempel.,
omordne andre commit-meddelelser, Tag 2
lad os sige, at jeg vil omordne nogen af de sidste 4 commits af denne blog. Jeg kører dereftergit rebase -i HEAD~4
, og her er hvad jeg ser:
pick 07c5abd Introduce OpenPGP and teach basic usage pick de9b1eb Fix PostChecker::Post#urls pick 3e7ee36 Hey kids, stop all the highlighting pick fa20af3 git interactive rebase, squash, amend # Rebase 8db7e8b..fa20af3 onto 8db7e8b # # Commands: # p, pick = use commit # r, reword = use commit, but edit the commit message # e, edit = use commit, but stop for amending # s, squash = use commit, but meld into previous commit # f, fixup = like "squash", but discard this commit's log message # x, exec = run command (the rest of the line) using shell # # 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
Vi ser de fire sidste forpligtelser, fra ældre til nyere. Se kommentaren nedenfor listen over forpligtelser? Godt arbejde med at forklare, git! pick
(p
for kort) er standardhandlingen. I dette tilfælde vil det genanvende commit som det er, ingen ændringer i itscontents eller besked. Lagring (og udførelse) denne fil ville gøre nogen ændringer inthe repository.,
Hvis jeg siger reword
(r
for kort) i en commit, jeg ønsker at redigere:
pick 07c5abd Introduce OpenPGP and teach basic usage pick de9b1eb Fix PostChecker::Post#urls r 3e7ee36 Hey kids, stop all the highlighting pick fa20af3 git interactive rebase, squash, amend
Når jeg gemme og afslutte redaktør, git vil følge den beskrevne kommandoer, landingmyself i editoren igen, som om jeg havde ændret begå 3e7ee36
. Jeg redigerer thatcommit-besked, Gem og afslut editoren, og her er output:
nu siger Caleb i sin commit-meddelelse “Stop al fremhævning”, uanset om du er et barn eller ej.
præstation ulåst! Du kan nu ændre meddelelsen om anycommit du ønsker., Du kan gøre det, bare sørg for at du forstår afsnittet “fare”.
Squash begår sammen
To andre kommandoer rebase interaktive tilbyder os, er:
-
squash
(s
for korte), som sammensmelter de commit i den foregående (theone i linjen før) -
fixup
(f
for korte), der fungerer som “squash”, men udsmid dette begå’smessage
Vi vil fortsætte med at arbejde på rebase eksempel vi workedbefore., Vi havde fire begår, min egen, til dette blog-indlæg, andthree andre fra Caleb, som var relateret til hans tidligere indlæg på PGP:
pick 07c5abd Introduce OpenPGP and teach basic usage pick de9b1eb Fix PostChecker::Post#urls pick 3e7ee36 Hey kids, stop all the highlighting pick fa20af3 git interactive rebase, squash, amend
Lad os sige, jeg ønsker at smelte Caleb ‘ s forpligter sig sammen, fordi de tilhører indbygget logisk changeset, og så kan vi git revert
det nemt, hvis vi finder weprefer ikke at have disse ændringer i dette register. Vi vil gerne beholde den første commit-besked, og S .uash de to efterfølgende commits i den foregående., Jeg ændre pick
til squash
hvor det er relevant:
pick 07c5abd Introduce OpenPGP and teach basic usage s de9b1eb Fix PostChecker::Post#urls s 3e7ee36 Hey kids, stop all the highlighting pick fa20af3 git interactive rebase, squash, amend
Gem, og jeg lander i editoren til at afgøre begå besked af meldedthree begår (se, hvordan de er sammenkædet den ene efter den anden):
# This is a combination of 3 commits. # The first commit's message is: Introduce OpenPGP and teach basic usage Besides demystifying a relatively complex tool, protocol, and etiquette, this post is intended to help with problems such as the one outlined in this tweet: > Emailed sensitive info to someone with PGP. They replied, with my > original email, all in clear text. They didn't realize it. # This is the 2nd commit message: Fix PostChecker::Post#urls # This is the 3rd commit message: Hey kids, stop all the highlighting # Please enter the commit message for your changes. Lines starting # with '#' will be ignored, and an empty message aborts the commit. # # Author: Caleb Hearth # Date: Tue Sep 2 09:39:07 2014 -0500 # # rebase in progress; onto 71d4789 # You are currently editing a commit while rebasing branch 'tc-git-rebase' on '71d4789'.
jeg beslutter at fjerne den pågældende begår besked, og føje et mere relevant note til en anden begå besked. Red redaktøren, og de fire forpligtelser blev omdannet til to: den ene fra Caleb og min efter. Godt!,
Vi kunne have brugt kommandoenfixup
, hvis vi tidligere havde set, at vi vilændre, men ikke commit-meddelelsen, for den tredje commit. I dette tilfælde, thecommands ville have set ud:
pick 07c5abd Introduce OpenPGP and teach basic usage s de9b1eb Fix PostChecker::Post#urls f 3e7ee36 Hey kids, stop all the highlighting pick fa20af3 git interactive rebase, squash, amend
Når de gemmes, redaktør ville have inkluderet den tredje begå besked alreadycommented ud for os:
Gem, – og udgange:
Resultatet er det samme: 2 forpligter i stedet for 4, hver med en enkelt, forskellige blogindlæg.
præstation ulåst! Du kan nu flette forpligtelser sammen. Vær altid opmærksom på FARESEKTIONEN.,
Rebase oven på master
gaffel vi et open source-bibliotek, begynder at arbejde på en funktionsgren og master inthe upstream-projektet går videre. Vores historie ser sådan ud:
A---B---C feature / D---E---F---G upstream/master
biblioteksvedligeholderen spørger om “rebase oven på master”, så vi løser eventuelle fusionskonflikter, der måtte opstå mellem begge grene, og holder vores ændringssæt sammen.Vedligeholderen vil gerne se en historie som:
A'--B'--C' feature / D---E---F---G upstream/master
Vi ønsker at genanvende vores forpligtelser, en efter en, i rækkefølge, på opstrøms master.,Lyder som beskrivelsen af rebase-kommandoen! Lad os se, hvilke kommandoer villand os ind i det ønskede scenario:
# Point our `upstream` remote to the original fork git remote add upstream https://github.com/thoughtbot/factory_girl.git # Fetch latest commits from `upstream` (the original fork) git fetch upstream # Checkout our feature branch git checkout feature # Reapply it onto upstream's master git rebase upstream/master # Fix conflicts, then `git rebase --continue`, repeat until done # Push to our fork git push --force origin feature
Achievement Unlocked! Din funktion gren vil blive anvendt påtop af nyeste mester i den oprindelige gaffel.
og så kommer vi til…
fare: du omskriver historie
se --force
i den sidste git push
kommando? Det betyder, at vi overskriver repository historie., Dette er altid sikkert at gøre i commits vi deler ikke med andre teammedlemmer eller i filialer, der tilhører os (se mine initialer i eksemplet med dette blogindlæg).
men hvis du tvinger push-udgaver, der allerede blev delt med teamet (commitsder findes uden for mit arkiv, som de ændringer, jeg har foretaget i PGP-commitsder allerede er delt), bliver alles gren ude af synkronisering.omskrivning af historie betyder at opgive eksisterende forpligtelser og skabe nye, detkan være meget ens, men er forskellige., Hvis andre baserer arbejdet på dine forrigeforpligtelser, og så omskriver du og tvinger skubbe dine forpligtelser, skal dine teammedlemmerbliver nødt til at fusionere deres arbejde igen (hvis de bemærker det potentielle tab).
på thoughtbot præfikser vi vores grene med vores initialer, hvilket signalerer, at thosecommits kan blive omskrevet, og andre bør ikke tilføje commits til filialen. Whenhenthose forpligter jord til master eller en delt gren vi aldrig omskrive dem igen.
så omskrive git historie, forudsat omskrevne commits findes kun i yourrepository, eller du og dit team ved, at ingen andre bør basere arbejde offothem.,
præstation ulåst! Du ved nu, hvordan du rebaser, mens du er engod Borger.