Vraag Squash mijn laatste X committeert samen met Git


Hoe kan ik mijn laatste X commits samen in één commit squashen met behulp van Git?


2314
2018-03-04 04:11


oorsprong


antwoorden:


Gebruik git rebase -i <after-this-commit> en vervang "pick" bij de tweede en volgende commits met "squash" of "fixup", zoals beschreven in de handleiding.

In dit voorbeeld <after-this-commit> is de SHA1-hash of de relatieve locatie van de HEAD van de huidige vertakking van waaruit commits worden geanalyseerd voor de rebase-opdracht. Als de gebruiker bijvoorbeeld 5 commits van de huidige HEAD in het verleden wil bekijken, is de opdracht git rebase -i HEAD~5.


1267
2018-03-04 04:18



Je kunt dit vrij gemakkelijk doen zonder git rebase of git merge --squash. In dit voorbeeld pletten we de laatste 3 commits.

Als je het nieuwe commit-bericht helemaal opnieuw wilt schrijven, volstaat dit:

git reset --soft HEAD~3 &&
git commit

Als u wilt beginnen met het bewerken van het nieuwe commit-bericht met een aaneenschakeling van de bestaande commit-berichten (dat wil zeggen vergelijkbaar met wat een pick / squash / squash / ... / squash git rebase -i instructielijst zou u beginnen met), dan moet u die berichten extraheren en doorgeven git commit:

git reset --soft HEAD~3 && 
git commit --edit -m"$(git log --format=%B --reverse HEAD..HEAD@{1})"

Beide methoden squashen de laatste drie commits op dezelfde manier in een enkele nieuwe commit. De zachte reset geeft HEAD een nieuwe betekenis aan de laatste commit die je niet wilt squashen. Noch de index, noch de werkboom worden aangeraakt door de zachte reset, waardoor de index in de gewenste status blijft voor uw nieuwe commit (dat wil zeggen dat deze al alle wijzigingen bevat van de commits die u op het punt staat te "weggooien").


2587
2018-03-05 04:19



Je kunt gebruiken git merge --squash hiervoor, die iets eleganter is dan git rebase -i. Stel dat je op meester bent en je de laatste 12 commits in één wilt squashen.

WAARSCHUWING: Zorg eerst dat u uw werk uitvoert en controleer dat git status is schoon (sinds git reset --hard zal gefaseerde en ongestage wijzigingen weggooien)

Dan:

# Reset the current branch to the commit just before the last 12:
git reset --hard HEAD~12

# HEAD@{1} is where the branch was just before the previous command.
# This command sets the state of the index to be as it would just
# after a merge from that commit:
git merge --squash HEAD@{1}

# Commit those squashed changes.  The commit message will be helpfully
# prepopulated with the commit messages of all the squashed commits:
git commit

De documentatie voor git merge beschrijft de --squash optie in meer detail.


Bijwerken: het enige echte voordeel van deze methode is dat het eenvoudiger is git reset --soft HEAD~12 && git commit gesuggereerd door Chris Johnsen in zijn antwoord is dat je het commit-bericht ontvangt dat is voorbereid met elk commit-bericht dat je squasht.


573
2018-03-04 06:10



Ik raad aan te vermijden git reset wanneer mogelijk - vooral voor Git-novicen. Tenzij je echt een proces moet automatiseren op basis van een aantal van commits, er is een minder exotische manier ...

  1. Zet de te pletten commits op een werkende tak (als ze dat nog niet zijn) - gebruik gitk hiervoor
  2. Bekijk de doelvertakking (bijvoorbeeld 'master')
  3. git merge --squash (working branch name)
  4. git commit

Het commit-bericht wordt vooraf ingevuld op basis van de squash.


135
2018-03-14 23:24



Gebaseerd op Chris Johnsen's antwoord,

Voeg een globale "squash" alias toe vanuit bash: (of Git Bash op Windows)

git config --global alias.squash '!f(){ git reset --soft HEAD~${1} && git commit --edit -m"$(git log --format=%B --reverse HEAD..HEAD@{1})"; };f'

... of via de opdrachtprompt van Windows:

git config --global alias.squash "!f(){ git reset --soft HEAD~${1} && git commit --edit -m\"$(git log --format=%B --reverse HEAD..HEAD@{1})\"; };f"


Jouw ~/.gitconfig zou nu deze alias moeten bevatten:

[alias]
    squash = "!f(){ git reset --soft HEAD~${1} && git commit --edit -m\"$(git log --format=%B --reverse HEAD..HEAD@{1})\"; };f"


Gebruik:

git squash N

... Wat de laatste automatisch samenperst N commits, inclusief.

Opmerking: het resulterende commit-bericht is een combinatie van alle geplette commits, in volgorde. Als je daar niet blij mee bent, kun je dat altijd git commit --amendom het handmatig aan te passen. (Of bewerk de alias om aan te passen aan uw smaak.)


97
2018-02-19 19:21



Als je TortoiseGit gebruikt, kun je de functie gebruiken Combine to one commit:

  1. Open TortoiseGit-contextmenu
  2. kiezen Show Log
  3. Markeer de relevante commits in de logweergave
  4. kiezen Combine to one commit vanuit het contextmenu

Combine commits

Deze functie voert automatisch alle noodzakelijke stappen uit met één git. Helaas alleen beschikbaar voor Windows.


46
2017-11-06 12:51



Dankzij deze handige blogpost Ik vond dat je dit commando kunt gebruiken om de laatste 3 commits te pletten:

git rebase -i HEAD~3

Dit is handig omdat het werkt, zelfs wanneer u zich op een lokaal filiaal zonder traceerinformatie / remote repo bevindt.

De opdracht opent de interactieve rebase-editor waarmee u de volgorde, squash, reword, enz. Kunt wijzigen zoals normaal.


46
2018-05-17 06:19