804 Stimmen

Wie kann man Commits in Git zerdrücken, nachdem sie gepusht worden sind?

Dies ist eine gute Erklärung für das Zerdrücken mehrerer Übertragungen:

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

aber es funktioniert nicht für Commits, die bereits gepusht wurden. Wie kann ich die letzten paar Commits sowohl in meinem lokalen als auch in meinem entfernten Repository zerquetschen?

Wenn ich das tue git rebase -i origin/master~4 master behalten Sie die erste als pick setzen Sie die anderen drei als squash und dann beenden (über c-x c-c in emacs), erhalte ich:

$ 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

wobei 2f40 die pick verpflichten. Und jetzt erscheint keiner der 4 Commits in git log . Ich habe erwartet, dass mein Editor neu gestartet wird, damit ich eine Commit-Nachricht eingeben kann. Was mache ich falsch?

1095voto

Alan Haggai Alavi Punkte 69510

Squash überträgt lokal mit

git rebase -i origin/master~4 master

und dann Push mit

git push origin +master

Der Unterschied zwischen --force y +

Aus der Dokumentation von git push :

Beachten Sie, dass --force gilt für alle gepushten Refs, weshalb die Verwendung von es mit push.default 充てがう matching oder mit mehreren Push Zielen, die mit remote.*.push kann andere Verweise überschreiben als den aktuellen Zweig (einschließlich lokaler Referenzdateien, die streng hinter ihrem entfernten Gegenstück liegen). Um einen Push auf nur einen Zweig zu erzwingen, verwenden Sie eine + vor der zu schiebenden Refspec (z. B. git push origin +master zu erzwingen einen Vorstoß zum master Zweig).

278voto

jakob-r Punkte 5792

In einem Zweig konnte ich das so machen (für die letzten 4 Übertragungen)

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

118voto

BLRBoy Punkte 1125

Das ist ein kleiner Unterschied zu der akzeptierten Antwort, aber ich hatte große Schwierigkeiten mit dem Quetschen und habe es schließlich geschafft.

$ git rebase -i HEAD~4
  • In dem sich öffnenden interaktiven Bildschirm ersetzen Sie Wählen Sie con Squash oben für alle Commits, die Sie zerdrücken wollen.
  • Speichern und schließen Sie den Editor

Drücken Sie auf die Fernbedienung mit:

$ git push origin branch-name --force

35voto

Nupur Punkte 521

git rebase -i master

wird der Editor-VM geöffnet und Sie erhalten eine Meldung wie diese

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

Hier habe ich pick für alle anderen Commits in "f" geändert (steht für fixup).

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

Dies repariert alle Commits zu einem Commit und entfernt alle anderen Commits. Ich habe dies getan und es hat mir geholfen.

33voto

Stuart Cardall Punkte 1733

Viele Probleme lassen sich vermeiden, wenn man nur eine branch zur Arbeit an & pas bearbeitend master :

git checkout -b mybranch

Die folgenden Arbeiten für remote bereits gepushte Commits & eine Mischung aus remote gepushte Commits / local nur Übertragungen:

# 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

Ich habe auch einige Anmerkungen zum Pull Request die hilfreich sein können.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X