”vänligen rebase ovanpå master och vi kommer att slå samman din pull begäran”.
”kan du squash dina åtaganden tillsammans så att vi får en ren, reversibel githistory?”.
” kan du skriva om ditt meddelande för att bättre beskriva problemet itsolves och hur det löser det?”.
frågor som dessa ställs ofta i pull-förfrågningar. Låt oss se varför deexistera, hur man utför dem och deras möjliga problem.,
Reword The last commit message
en av de enklaste historiken skriver vi kan göra med git ändrar lastcommit message. Låt oss säga direkt efter att ha gjort ett åtagande hittar du ett stavfel i dessbeskrivning, eller du hittar ett bättre sätt att beskriva ändringsuppsättningen. För att göra thecorrection du kör:
git commit --amend
det kommer att öppna en redigeraremed det senaste begå meddelandet, så att du kan ändra det. Efter att ha sparat, en ny begåkommer att skapas med samma ändringar och det nya meddelandet, som ersätter begåtetmed föregående meddelande.,
det här kan vara användbart för att inkludera filer du glömde att spåra, eller inkluderamodifieringar till de filer du just begått. För att göra det kan du lägga till ändringaroch sedan utföra ändringen:
git add README.md config/routes.rb git rm notes.txt git commit --amend
förutom att redigera begå meddelandet kommer den nya begå innehålla ändringarnaspecificeras med git add
och git rm
. Du kan också redigera författaren. Exempel:
git commit --amend --author="Tute Costa and Dan Croak <[email protected]>"
prestation olåst!, Du kan nu ändra det senaste arkivet för ditt arkiv för att inkludera nyare ändringar i filerna och / eller för att förbättra meddelandet. Men börja inte ändra allt innan du förstår thelast-delen av det här blogginlägget med titeln ”fara”.
Reword other commit messages
skulle älska att tala om detta nu, men vi måste förstå en mer allmänverktyg innan. Håll ögonen öppna! Allt annat kommer att bli lättare när vi läser om…
interaktiv Rebase
git rebase
åter gäller begår, en byone, i ordning, från din nuvarande gren till en annan., Den accepterar flera alternativ och parametrar, så det är ett tips på isberget förklaring, tillräckligt för att överbrygga thegap mellan StackOverflow eller GitHub kommentarer och git man sidor.
ett intressant alternativ som det accepterar är --interactive
(-i
för kort), vilket kommer att öppna en redaktör med en lista över de åtaganden som kommer att ändras. Den här listan accepterar kommandon, så att användaren kan redigera listan innan du initierar therebase-åtgärden.
låt oss se ett exempel.,
Reword andra commit meddelanden, ta 2
låt oss säga att jag vill omordna någon av de sista 4 begår denna blogg. Jag kör sedangit rebase -i HEAD~4
, och här är vad jag 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 fyra sista åtagandena, från äldre till nyare. Se kommentaren nedanlista över åtaganden? Bra jobbat, git! pick
(p
för kort) är defaultaction. I det här fallet skulle det återanvända begå som det är, inga ändringar i dessinnehåll eller meddelande. Spara (och exekvera) den här filen skulle inte göra några ändringar iförvaret.,
om jag säger reword
(r
för kort) i en commit vill jag redigera:
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 jag sparar och avslutar redigeraren kommer git att följa de beskrivna kommandona, landa i redigeraren igen, som om jag hade ändrat commit 3e7ee36
. Jag redigerar thatcommit meddelande, Spara och avsluta redigeraren, och här är utgången:
Nu Caleb säger i sitt commit meddelande ”stoppa all markering”, oavsett om duär ett barn eller inte.
prestation olåst! Du kan nu ändra meddelandet om någonkommit du vill ha., Du kan göra det, se bara till att du förstår avsnittet ”fara”.
Squash begår tillsammans
två andra kommandon rebase interactive erbjuder oss är:
-
squash
(s
för kort), som smälter begå i den föregående (theone i raden innan) -
fixup
(fixup
(f
för kort), som fungerar som ”squash”, men kasserar denna commit ’ smessage
vi fortsätter att arbeta med rebase-exemplet vi arbetadeinnan., Vi hade fyra åtaganden, min egen för det här blogginlägget, ochtre andra från Caleb, som var relaterade till hans tidigare inlägg 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
låt oss säga att jag vill meld Calebs begår tillsammans, eftersom de tillhör thesame logiska changeset, och så kan vi git revert
det enkelt om vi finner weprefer att inte ha dessa förändringar i det här förvaret. Vi vill behålla det första budskapet, och krossa de två efterföljande begå in i previousone., Jag ändrar pick
till squash
där så är lämpligt:
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
spara, och jag landar i redigeraren för att bestämma begå meddelande från meldedthree begår (se hur de är sammanlänkade efter varandra):
# 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'.
jag bestämmer mig för att ta bort det tredje begå meddelandet och lägga till en mer relevant anteckning i det andra begå meddelandet. Spara redaktören, och de fyra begår omvandladesin i två: den från Caleb och min efter. Bra!,
vi kunde ha använt kommandotfixup
, om vi hade sett tidigare att vi vill haändringarna, men inte begå meddelandet, av den tredje begå. I så fall skulle thecommands ha sett ut:
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 det sparats skulle redaktören ha inkluderat det tredje begå-meddelandet redankommenterat ut för oss:
spara och utgångar:
resultatet är detsamma: 2 begår istället för 4, var och en med en enda, annan blogpost.
prestation olåst! Du kan nu sammanfoga begår tillsammans. Var alltid uppmärksam på avsnittet fara.,
Rebase på toppen av master
vi gafflar ett open source-bibliotek, börjar arbeta på en funktionsgren och master inde uppströmsprojektet går framåt. Vår historia ser ut som:
A---B---C feature / D---E---F---G upstream/master
biblioteksansvarige frågar efter ”rebase on top of master”, så vi åtgärdar eventuella sammanslagningskonflikter som kan uppstå mellan båda grenarna och håller vår ändringsuppsättning tillsammans.Den ansvarige vill se en historik som:
A'--B'--C' feature / D---E---F---G upstream/master
vi vill återanvända våra åtaganden, en efter en, i ordning, till uppströms mästare.,Låter som beskrivningen av rebase-kommandot! Låt oss se vilka kommandon som skullegöra oss till önskat 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
prestation olåst! Din funktion gren kommer att tillämpas påtopp av senaste mästare i den ursprungliga gaffeln.
och så får vi…
fara: du skriver om historia
se--force
I det sistagit push
kommandot? Det betyder att vi skriver överrepositoriets historia., Detta är alltid säkert att göra i begår vi inte dela med andra gruppmedlemmar, eller i grenar som tillhör oss (se mina initialer iexempel på detta blogginlägg).
men om du tvingar push-utgåvor som redan delades med laget (commitsthat finns utanför mitt arkiv, som de ändringar jag gjort i PGP commitsthat redan har delats), då allas gren blir ur synk.
omskrivning historia innebär att överge befintliga begår och skapa nya, det kan vara mycket lika men är olika., Om andra baserar arbetet på din tidigareåtaganden, och sedan skriver du om och tvingar-tryck på dina åtaganden, dina gruppmedlemmarkommer att behöva sammanfoga sitt arbete (om de märker den potentiella förlusten).
vid thoughtbot prefixar vi våra grenar med våra initialer, vilket signalerar att thosecommits kan bli omskrivna och andra bör inte lägga till åtaganden till grenen. När de begår mark till mästare eller en delad gren skriver vi aldrig om dem igen.
så skriva git historia, förutsatt omskrivna begår finns endast i yourrepository, eller om du och ditt team vet att ingen annan bör basera arbetet utanför dem.,
prestation olåst! Du vet nu hur man rebaserar medan du är enbra medborgare.