it-swarm.com.de

Wie kann man Commits in git zerquetschen, nachdem sie geschoben wurden?

Dies gibt eine gute Erklärung für das Quetschen mehrerer Commits:

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

es funktioniert jedoch nicht für Commits, die bereits verschoben wurden. Wie kann ich die neuesten Commits in meinen lokalen und Remote-Repos quetschen? 

EDIT: Wenn ich git rebase -i Origin/master~4 master mache, lasse die erste als pick, setze die anderen drei als squash und beende dann (über c-x c-c in emacs):

$ 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

dabei ist 2f40 das pick-Commit. Und jetzt erscheint keines 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?

440
Loren

Squash bekennt sich lokal mit 

git rebase -i Origin/master~4 master

und erzwinge dann Push mit 

git Push Origin +master

Unterschied zwischen --force und +

Aus der Dokumentation von git Push

Beachten Sie, dass --force für alle gesendeten Refs gilt und daher .__ verwendet. mit Push.default auf matching oder mit mehreren Push Mit remote.*.Push konfigurierte Ziele überschreiben möglicherweise andere Referenzen als der aktuelle Zweig (einschließlich lokaler Refs, die streng hinter ihrem entfernten Gegenstück liegen). Um einen Push auf nur einen Zweig zu erzwingen, verwenden Sie einen + vor dem refspec to Push (z. B. git Push Origin +master, um a Push auf den Zweig master).

611

Auf einem Zweig konnte ich das so machen (für die letzten 4 Commits)

git checkout my_branch
git reset --soft HEAD~4
git commit
git Push --force Origin my_branch
78
jakob-r

Viele Probleme können vermieden werden, indem nur eine branch erstellt wird, um an & not zu arbeiten, die an master arbeitet:

git checkout -b mybranch

Die folgenden Arbeiten für remote-Commits sind bereits gepuscht und eine Mischung aus remote-Push-Commits/local-Commits gilt nur:

# 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 Pull-Request-Notizen , die hilfreich sein können.

19
Stuart Cardall

Kleiner Unterschied zur akzeptierten Antwort, aber ich hatte große Schwierigkeiten beim Quetschen und bekam es schließlich.

$ git rebase -i HEAD~4
  • Ersetzen Sie im sich öffnenden interaktiven Bildschirm pick durch squash Am oberen Rand für alle Commits, die Sie quetschen möchten.
  • Speichern und schließen Sie den Editor über esc --> :wq

Zur Fernbedienung wechseln mit:

$ git Push Origin branch-name --force
14
BLRBoy

git rebase -i master

sie erhalten den Editor vm geöffnet und msgs so etwas

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

Hier habe ich die Auswahl für alle anderen Commits in "f" (Stands for fixup) geändert.

git Push -f Origin feature/feature-branch-name-xyz

dadurch werden alle Commits auf ein Commit fixiert und alle anderen Commits entfernt.

9
Nupur

Wenn Sie mit einem Gitlab oder Github arbeiten, können Sie auf diese Weise Probleme bekommen. Sie können Ihre Commits mit einer der oben genannten Methoden quetschen. Mein bevorzugter ist:

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

wählen Sie Squash oder Fixup für Ihr Commit. Zu diesem Zeitpunkt würden Sie mit Git-Status überprüfen. Und die Nachricht könnte sein:

    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 Sie können versucht sein, es zu ziehen. TUN SIE DAS NICHT oder Sie befinden sich in der gleichen Situation wie zuvor.

Schieben Sie stattdessen zu Ihrem Ursprung mit:

git Push Origin +ABC-1916-remote:ABC-1916

Das + erlaubt, Push nur zu einem Zweig zu erzwingen.

0
Alex

Für das Squashing von zwei Commits, von denen eines bereits geschoben wurde, funktionierten auf einem einzigen Zweig die folgenden:

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

Standardmäßig enthält dies die Commit-Nachricht des neuesten Commits als Kommentar zum älteren Commit.

0
lobsterhands

1) git rebase -i HEAD ~ 4 

To elaborate: It works on the current branch; the HEAD~4 means squashing the latest four commits; interactive mode (-i)

2) An diesem Punkt öffnete der Editor mit der Liste der Commits die zweite und die folgenden Commits, wobei Pick durch Squash ersetzt und dann gespeichert wurde.

ausgabe: Erfolgreich umbasierte und aktualisierte Refs/Heads/Branch-Name.

3) git Push Origin Refs/Heads/Branch Name --force

ausgabe: ... remote: remote: Um eine Zusammenführungsanforderung für den Zweignamen zu erstellen, besuchen Sie: remote: http: // xxx/sc/server/merge_requests/new merge_request% 5Bsource_branch% 5D = sss remote: An ip: sc/server.git + 84b4b60 ... 5045693 Zweigname -> Zweigname (erzwungene Aktualisierung)

0
terwxqian