Sök…
Anmärkningar
Vad är squash?
Squashing är processen att ta flera åtaganden och kombinera dem till en enda engagemang som innehåller alla förändringar från de initiala åtagandena.
Squashing och fjärrgrenar
Var särskilt uppmärksam när squashing begår en filial som spårar en avlägsen gren; Om du klämmer på en begåvning som redan har skjutits till en avlägsen gren, kommer de två grenarna att avvikas, och du måste använda git push -f
att tvinga dessa förändringar till den avlägsna grenen. Var medveten om att detta kan orsaka problem för andra som spårar den avlägsna grenen , så försiktighet bör vidtas när man trycker på att klämma på sig offentliga eller delade förvar.
Om projektet är värd på GitHub kan du aktivera "force push-skydd" på vissa grenar, som master
, genom att lägga till det i Settings
- Branches
- Protected Branches
.
Squash de senaste åtagandena utan omföring
Om du vill squash de föregående x
åtagandena till en enda kan du använda följande kommandon:
git reset --soft HEAD~x
git commit
Ersätt x
med antalet tidigare åtaganden du vill inkluderas i den klämda åtagandet.
Tänk på att detta kommer att skapa ett nytt engagemang, i huvudsak att glömma information om de tidigare x
åtagandena inklusive deras författare, meddelande och datum. Du vill antagligen först kopiera och klistra in ett befintligt engagemang.
Squashing begår under en rebase
Åtaganden kan krossas under en git rebase
. Det rekommenderas att du förstår omföring innan du försöker squashåtaganden på detta sätt.
Bestäm vilket åtagande du vill återinföras från, och notera dess åtagande-hash.
Kör
git rebase -i [commit hash]
.Alternativt kan du skriva
HEAD~4
istället för en commit-hash, för att se de senaste engagemangen och ytterligare 4 åtaganden innan den senaste.I redigeraren som öppnas när du kör det här kommandot bestämmer du vilka åtaganden du vill squash. Byt ut
pick
i början av de raderna medsquash
att klämma in dem i det tidigare åtagandet.När du har valt vilka åtaganden du vill squash, uppmanas du att skriva ett engagemang.
Loggar förbinder sig för att bestämma var du ska sortera om
> git log --oneline
612f2f7 This commit should not be squashed
d84b05d This commit should be squashed
ac60234 Yet another commit
36d15de Rebase from here
17692d1 Did some more stuff
e647334 Another Commit
2e30df6 Initial commit
> git rebase -i 36d15de
Vid denna punkt dyker din valda redaktör upp där du kan beskriva vad du vill göra med åtagandena. Git ger hjälp i kommentarerna. Om du lämnar det som det är kommer inget att hända eftersom varje åtagande kommer att hållas och deras ordning kommer att vara densamma som de var före rebasen. I det här exemplet tillämpar vi följande kommandon:
pick ac60234 Yet another commit
squash d84b05d This commit should be squashed
pick 612f2f7 This commit should not be squashed
# Rebase 36d15de..612f2f7 onto 36d15de (3 command(s))
#
# 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
Git-logg efter att ha skrivit meddelande
> git log --oneline
77393eb This commit should not be squashed
e090a8c Yet another commit
36d15de Rebase from here
17692d1 Did some more stuff
e647334 Another Commit
2e30df6 Initial commit
Autosquash: Begår en kod du vill squash under en rebase
Med tanke på följande historia, föreställ dig att du gör en förändring som du vill squash i åtagandet bbb2222 A second commit
:
$ git log --oneline --decorate
ccc3333 (HEAD -> master) A third commit
bbb2222 A second commit
aaa1111 A first commit
9999999 Initial commit
När du har gjort dina ändringar kan du lägga till dem i indexet som vanligt och sedan begå dem med hjälp av --fixup
argumentet med en referens till det engagemang du vill squash till:
$ git add .
$ git commit --fixup bbb2222
[my-feature-branch ddd4444] fixup! A second commit
Detta skapar ett nytt engagemang med ett åtagandemeddelande som Git kan känna igen under en interaktiv rebas:
$ git log --oneline --decorate
ddd4444 (HEAD -> master) fixup! A second commit
ccc3333 A third commit
bbb2222 A second commit
aaa1111 A first commit
9999999 Initial commit
Därefter gör du en interaktiv rebas med --autosquash
argumentet:
$ git rebase --autosquash --interactive HEAD~4
Git föreslår att du klämmer åt dig som du gjorde med commit --fixup
till rätt position:
pick aaa1111 A first commit
pick bbb2222 A second commit
fixup ddd4444 fixup! A second commit
pick ccc3333 A third commit
För att undvika att behöva skriva --autosquash
vid varje rebase kan du aktivera det här alternativet som standard:
$ git config --global rebase.autosquash true
Squashing-åtagande under sammanslagning
Du kan använda git merge --squash
att krossa förändringar som introducerats av en gren i ett enda engagemang. Inga faktiska åtaganden skapas.
git merge --squash <branch>
git commit
Detta motsvarar mer eller mindre användning av git reset
, men är mer praktiskt när ändringar som införlivas har ett symboliskt namn. Jämföra:
git checkout <branch>
git reset --soft $(git merge-base master <branch>)
git commit
Autosquashing och fixeringar
När du gör ändringar är det möjligt att ange att åtagandet i framtiden kommer att krossas till ett annat åtagande och detta kan göras på så sätt,
git commit --squash=[commit hash of commit to which this commit will be squashed to]
Man kan också använda, --fixup=[commit hash]
alternativt för fixing.
Det är också möjligt att använda ord från åtagandemeddelandet istället för åtagandeshash, som så,
git commit --squash :/things
där de senaste åtagandena med ordet "saker" skulle användas.
Meddelandena om dessa åtaganden börjar med 'fixup!'
eller 'squash!'
följt av resten av åtagandemeddelandet till vilka dessa åtaganden kommer att krossas till.
Vid omplacering bör --autosquash
flaggan användas för att använda autosquash / fixup-funktionen.