Vraag Hoe commits in Git pletten nadat ze zijn gepusht?


Dit geeft een goede uitleg van het pletten van meerdere commits:

http://git-scm.com/book/en/Git-Branching-Rebasing

maar het werkt niet voor commits die al zijn gepusht. Hoe verpletter ik de meest recente commits in zowel lokale als externe repos?

BEWERK: Wanneer ik het doe git rebase -i origin/master~4 master, houd de eerste als pick, stel de andere drie in als squashen vervolgens afsluiten (via c-x c-c in emacs), krijg ik:

$ git rebase -i origin/master~4 master
# Not currently on any branch.
nothing to commit (working directory clean)

Could not apply 2f40e2c... Revert "issue 4427: bpf device permission change option added"
$ git rebase -i origin/master~4 master
Interactive rebase already started

waar 2f40 is het pick plegen. En nu verschijnt geen van de 4 commits erin git log. Ik verwachtte dat mijn editor opnieuw zou worden opgestart, zodat ik een commit-bericht kon invoeren. Wat doe ik verkeerd?


391
2018-04-14 18:31


oorsprong


antwoorden:


Squash committeert lokaal met

git rebase -i origin/master~4 master

en forceer dan met

git push origin +master

Verschil tussen --force en +

Uit de documentatie van git push:

Let daar op --force is van toepassing op alle refs die worden gepusht en dus worden gebruikt   het met push.default ingesteld op matching of met meerdere duwen   bestemmingen geconfigureerd met remote.*.push kan refs anders overschrijven   dan de huidige branch (inclusief lokale refs die strikt achterblijven   hun externe tegenhanger). Gebruik a om een ​​push naar slechts één branch te forceren +   voor de refspec om te duwen (bijv git push origin +master dwingen   een duwtje naar de master tak).


527
2018-04-14 18:43



Op een tak kon ik het zo doen (voor de laatste 4 commits)

git checkout my_branch
git reset --soft HEAD~4
git commit
git push --force origin my_branch

63
2017-09-16 11:47



Veel problemen kunnen worden voorkomen door alleen een branch om aan te werken & niet werken aan master:

git checkout -b mybranch

Het volgende werkt voor remote commits al gepusht en een mix van remote geduwd commits / local doet alleen:

# example merging 4 commits

git checkout mybranch
git rebase -i mybranch~4 mybranch

# at the interactive screen
# choose fixup for commit: 2 / 3 / 4

git push -u origin +mybranch

Ik heb er ook een paar aantekeningen voor het aanvragen van een verzoek wat nuttig kan zijn.


12
2017-09-05 16:45



Klein verschil met geaccepteerd antwoord, maar ik had veel moeite met squashen en kreeg het eindelijk.

$ git rebase -i HEAD~4
  • Op het interactieve scherm dat opent, vervang je plukken met squash aan de top voor alle commits die je wilt squashen.
  • Sla de editor op en sluit deze esc --> :wq

Druk op de afstandsbediening met behulp van:

$ git push origin branch-name --force

5
2017-12-22 05:08



git rebase -i master

je krijgt de editor vm open en berichten zoiets als dit

Pick 2994283490 commit msg1
f 7994283490 commit msg2
f 4654283490 commit msg3
f 5694283490 commit msg4
#Some message 
#
#some more

Hier heb ik de selectie voor alle andere commits gewijzigd in "f" (staat voor fixup).

git push -f origin feature/feature-branch-name-xyz

dit zal alle commits naar één commit repareren en zal alle andere commits verwijderen. Ik deed dit en het heeft me geholpen.


3
2017-09-26 10:18