Zoeken…


Opmerkingen

Wat is pletten?

Squashen is het proces waarbij meerdere commits worden genomen en gecombineerd in een enkele commit waarin alle wijzigingen van de initiële commits worden ingekapseld.

Squashen en Remote Branches

Besteed speciale aandacht aan het pletten op een filiaal dat een filiaal op afstand volgt; als je een commit squash die al naar een remote branch is gepusht, zullen de twee branches worden omgeleid, en je zult git push -f moeten gebruiken om die veranderingen naar de remote branch te forceren. Houd er rekening mee dat dit problemen kan veroorzaken voor anderen die die externe vertakking volgen , dus wees voorzichtig wanneer geplette geplette commissies op openbare of gedeelde repositories worden gepleegd.

Als het project wordt gehost op GitHub, kunt u "force push-beveiliging" inschakelen op sommige branches, zoals master , door het toe te voegen aan Settings - Branches - Protected Branches .

Squash Recente commits zonder rebasen

Als je de vorige x commits in één wilt squashen, kun je de volgende commando's gebruiken:

git reset --soft HEAD~x
git commit

Het vervangen van x door het aantal vorige commits die je wilt opnemen in de geplette commit.

Houd er rekening mee dat dit een nieuwe commit zal creëren, waarbij in wezen informatie over de vorige x commits wordt vergeten, inclusief hun auteur, bericht en datum. Je wilt waarschijnlijk eerst een bestaand commit-bericht kopiëren en plakken.

Pletten tijdens een rebase

Commits kunnen worden geplet tijdens een git rebase . Het wordt aanbevolen dat je rebasen begrijpt voordat je op deze manier commits probeert te squashen.

  1. Bepaal van welke commit je wilt rebasen en noteer de commit hash.

  2. Voer git rebase -i [commit hash] .

    Als alternatief kun je HEAD~4 typen in plaats van een commit hash, om de laatste commit en nog 4 commits voor de laatste te bekijken.

  3. Bepaal in de editor die wordt geopend wanneer u deze opdracht uitvoert, welke commits u wilt squashen. Vervang de pick aan het begin van die regels door squash om ze in de vorige commit te pletten.

  4. Nadat je hebt geselecteerd welke commits je wilt squashen, wordt je gevraagd een commit-bericht te schrijven.

Logging Commits om te bepalen waar te rebasen

> 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

Op dit moment verschijnt je favoriete editor waar je kunt beschrijven wat je met de commits wilt doen. Git biedt hulp in de reacties. Als je het laat zoals het is, gebeurt er niets omdat elke commit wordt bewaard en hun volgorde hetzelfde zal zijn als vóór de rebase. In dit voorbeeld passen we de volgende opdrachten toe:

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 logboek na het schrijven van een commit bericht

> 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: code vastleggen die u wilt squashen tijdens een rebase

Gezien de volgende geschiedenis, stel je voor dat je een wijziging aanbrengt die je wilt bbb2222 A second commit in de commit 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

Nadat je je wijzigingen hebt aangebracht, kun je ze zoals gewoonlijk aan de index toevoegen en ze vervolgens vastleggen met het argument --fixup met een verwijzing naar de commit waarin je wilt squashen:

$ git add .
$ git commit --fixup bbb2222
[my-feature-branch ddd4444] fixup! A second commit

Dit zal een nieuwe commit maken met een commit-bericht dat Git kan herkennen tijdens een interactieve rebase:

$ 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

--autosquash een interactieve rebase uit met het argument --autosquash :

$ git rebase --autosquash --interactive HEAD~4

Git zal je voorstellen om de door jou gemaakte commit --fixup met de commit --fixup in de juiste positie te squashen:

pick aaa1111 A first commit
pick bbb2222 A second commit
fixup ddd4444 fixup! A second commit
pick ccc3333 A third commit

Om te voorkomen dat u bij elke rebase --autosquash moet typen, kunt u deze optie standaard inschakelen:

$ git config --global rebase.autosquash true

Pletten plegen tijdens samenvoegen

Je kunt git merge --squash om door een branch geïntroduceerde wijzigingen in een enkele commit te squashen. Er wordt geen echte commit gemaakt.

git merge --squash <branch>
git commit

Dit komt min of meer overeen met het gebruik van git reset , maar is handiger wanneer wijzigingen die worden opgenomen een symbolische naam hebben. Vergelijken:

git checkout <branch>
git reset --soft $(git merge-base master <branch>)
git commit

Autosquashing en fixups

Bij het vastleggen van wijzigingen is het mogelijk om aan te geven dat de vastlegging in de toekomst wordt geplet naar een andere vastlegging en dit kan zo worden gedaan,

git commit --squash=[commit hash of commit to which this commit will be squashed to]

Je kunt ook, --fixup=[commit hash] om te repareren.

Het is ook mogelijk om woorden uit het commit-bericht te gebruiken in plaats van de commit-hash, zo,

git commit --squash :/things

waar de meest recente commit met het woord 'dingen' zou worden gebruikt.

Het bericht van deze commits zou beginnen met 'fixup!' of 'squash!' gevolgd door de rest van het commit-bericht waarnaar deze commits worden geplet.

Bij --autosquash moet de vlag --autosquash worden gebruikt om de functie autosquash / fixup te gebruiken.



Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow