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?

14voto

terwxqian Punkte 496

1) git rebase -i HEAD~4

Um das zu erläutern: Es funktioniert mit dem aktuellen Zweig; HEAD~4 bedeutet, dass die letzten vier Commits gequetscht werden; interaktiver Modus (-i)

2) An diesem Punkt öffnete sich der Editor mit der Liste der Übertragungen, um die zweite und die folgenden Übertragungen zu ändern, indem Sie pick durch squash ersetzen und dann speichern.

Ausgabe: Refs/Heads/Zweigstellen-Name erfolgreich umgestellt und aktualisiert.

3) git push origin refs/heads/branch-name --force

Ausgabe:

remote:
remote: To create a merge request for branch-name, visit:
remote: http://xxx/sc/server/merge_requests/new?merge_request%5Bsource_branch%5D=sss
remote:To ip:sc/server.git
 + 84b4b60...5045693 branch-name -> branch-name (forced update)

11voto

Zul Punkte 71

Sqush Änderungen in der Fernbedienung

  • Stellen Sie zunächst sicher, dass Ihr lokaler Master mit dem entfernten Master übereinstimmt.
  • Setzen Sie dann Ihren lokalen Funktionszweig zurück, damit er mit dem Master-Zweig übereinstimmt: git reset --soft master
  • fügen Sie dann alle Ihre Modifikationen und Änderungen (die Sie an Ihrem lokalen Funktionszweig, den Sie gerade auf Master zurückgesetzt haben) in den Staging-Bereich: git add .
  • und übertragen Sie diese Änderungen: git commit -m "this is the final commit message"
  • dann erzwingen Sie einen Push auf den entfernten Zweig: git push RemoteBranch --force

7voto

lobsterhands Punkte 88

Um zwei Commits, von denen einer bereits gepusht wurde, auf einem einzigen Zweig zu zerdrücken, funktionierte Folgendes:

git rebase -i HEAD~2
    [ pick     older-commit  ]
    [ squash   newest-commit ]
git push --force

Standardmäßig wird dabei die Commit-Nachricht des neuesten Commits als Kommentar zu dem älteren Commit eingefügt.

7voto

Alex Punkte 2660

Wenn Sie mit einem Gitlab oder Github arbeiten, können Sie auf diese Weise in Schwierigkeiten geraten. Sie zerquetschen Ihre Commits mit einer der oben genannten Methoden. Meine bevorzugte Methode ist:

git rebase -i HEAD~4
or
git rebase -i origin/master

wählen Sie Squash oder Fixup für Ihr Commit. An diesem Punkt würden Sie mit git status überprüfen. Und die Meldung könnte lauten:

    On branch ABC-1916-remote
    Your branch and 'origin/ABC-1916' have diverged,
    and have 1 and 7 different commits each, respectively.
      (use "git pull" to merge the remote branch into yours)

Und man kann in Versuchung kommen, sie zu ziehen. TUN SIE DAS NICHT oder Sie befinden sich in der gleichen Situation wie zuvor.

Drücken Sie stattdessen auf Ihren Ursprung mit:

git push origin +ABC-1916-remote:ABC-1916

Das + erlaubt es, Push nur für einen Zweig zu erzwingen.

1voto

Sasi Kumar M Punkte 2142

In meinem Fall war die Anforderung, alle Feature-Branch-Commits in einen einzigen zusammenzufassen, um eine saubere Commit-Historie zu haben. Verwendet die GitHub UI, dies zu tun.

Problem:

  • Der Funktionszweig (eg:featureBranch) wurde aus dem Master (vor einem Monat) erstellt.
  • Ich habe alle meine Änderungen an den FeatureBranch übergeben (~12 Commits, ein Monat Arbeit). Und wurde regelmäßig an Remote gepusht.

Erfordernis:

  • Um den Feature-Zweig mit dem Master zu aktualisieren und eine einzelne Übergabe in einem Feature-Zweig zu haben

Befolgte Schritte:

  • Erstellen Sie einen neuen Zweig (z.B.: featureBranchLatest) von master in der GitHub UI.
  • Erstellen Sie eine PR von featureBranch bis featureBranchLatest.
  • Lösen Sie etwaige Konflikte. Führen Sie den PR mit der Option "Squash Commit" in der GitHub-Benutzeroberfläche zusammen. (Ändern Sie die Commit-Nachricht, um eine sauberere Nachricht zu erhalten).

Jetzt hat die featureBranchLatest einen einzigen Commit mit allen Änderungen, die in einem einzigen Commit benötigt werden, zusammen mit den letzten Änderungen aus dem Master. Löschen Sie den alten Zweig featureBranch, wenn er nicht als Referenz benötigt wird.

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