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.

  1. Bestäm vilket åtagande du vill återinföras från, och notera dess åtagande-hash.

  2. 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.

  3. 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 med squash att klämma in dem i det tidigare åtagandet.

  4. 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.



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow