696 Stimmen

Die ersten beiden Commits in Git zerdrücken?

Con git rebase --interactive <commit> können Sie eine beliebige Anzahl von Übertragungen zu einer einzigen zusammenfassen.

Das ist alles großartig, es sei denn, Sie wollen die Commits in den ersten Commit quetschen. Das scheint unmöglich zu sein.

Gibt es Möglichkeiten, dies zu erreichen?


Mäßig verwandt:

In einer verwandten Frage ist es mir gelungen, einen anderen Ansatz für die Notwendigkeit zu finden, die erste Übergabe zu unterdrücken, nämlich, sie zur zweiten zu machen.

Wenn Sie daran interessiert sind: git: Wie fügt man einen Commit als ersten ein und verschiebt alle anderen?

0 Stimmen

0 Stimmen

Einzeiler: git squash 2 mit dem Alias squash = !"f() { NL=$1; GIT_EDITOR=\"sed -i '2,$NL s/pick/squash/;/# This is the 2nd commit message:/,$ {d}'\"; git rebase -i HEAD~$NL; }; f" . Siehe stackoverflow.com/a/28789349/670229 .

1 Stimmen

Das Skript "squash": Bei zwei Commits existiert der HEAD~2, den dieses Skript erzeugt, nicht, so dass es in diesem einen speziellen Fall nicht funktioniert.

3voto

hillu Punkte 9105

Das Zerdrücken des ersten und zweiten Commits würde dazu führen, dass der erste Commit neu geschrieben wird. Wenn Sie mehr als einen Zweig haben, der auf dem ersten Commit basiert, würden Sie diesen Zweig abschneiden.

Betrachten Sie das folgende Beispiel:

a---b---HEAD
 \
  \
   '---d

Das Zusammenfassen von a und b in einer neuen Übergabe "ab" würde zu zwei verschiedenen Bäumen führen, was in den meisten Fällen nicht wünschenswert ist, da git-merge y git-rebase nicht mehr in beiden Zweigen funktionieren wird.

ab---HEAD

a---d

Wenn Sie das wirklich wollen, ist es machbar. Schauen Sie sich an git-filter-branch für ein mächtiges (und gefährliches) Werkzeug zur Umschreibung der Geschichte.

0 Stimmen

Gutes Argument. +1. Ich schätze, man müsste von ab verzweigen und a---d auf diesen Zweig umbinden, um a-d vom neuen gemeinsamen Punkt ab wiederzugeben. Und dann den a-d-Zweig entfernen, der an diesem Punkt nutzlos ist.

3voto

Uwe Kleine-König Punkte 3284

Sie können dafür git filter-branch verwenden. z.B.

git filter-branch --parent-filter \
'if test $GIT_COMMIT != <sha1ofB>; then cat; fi'

Dies führt dazu, dass AB-C das Commit-Log von A wegwirft.

0 Stimmen

Bei mir hat das nicht funktioniert. git filter-branch sagte, dass der Zweig unverändert sei.

0 Stimmen

@Leo: haben Sie <sha1ofB> durch die tatsächliche Hashid ersetzt?

1 Stimmen

Das braucht mehr Stimmen! Rebase hat bei mir wegen meiner komplexen Git-Historie nicht funktioniert, aber das hat den Trick gemacht.

-1voto

todd Punkte 2371

Sie können rebase interactive verwenden, um die letzten beiden Commits zu ändern, bevor sie an einen entfernten Server übertragen wurden

git rebase HEAD^^ -i

3 Stimmen

Stimmt, aber kch fragte nach der Zerquetschung der erste zwei Übertragungen, nicht die dernier (jüngste) zwei Übertragungen.

0 Stimmen

So ist es super einfach, man muss nur den Hash des Commits verwenden, in den man zusammenführen möchte und diesen anstelle von HEAD verwenden^^

2 Stimmen

@SebastianBlask, ich glaube nicht, dass es so einfach ist. Wenn Sie den SHA1 des ersten Commits verwenden, dann beginnen Sie nur mit dem zweite übertragen. Es ist leider nicht möglich, diesen Commit zu bereinigen.

-6voto

decandia Punkte 1

Es gibt einen einfacheren Weg, dies zu tun. Nehmen wir an, Sie sind auf der master Zweigstelle

Erstellen Sie einen neuen verwaisten Zweig, der die gesamte Commit-Historie entfernt:

$ git checkout --orphan new_branch

Fügen Sie Ihre erste Commit-Nachricht hinzu:

$ git commit -a

Beseitigen Sie den alten, nicht gemergten Master-Zweig:

$ git branch -D master

Benennen Sie Ihren aktuellen Zweig um new_branch a master :

$ git branch -m master

6 Stimmen

Und dann verlieren Sie Ihren gesamten Commit-Verlauf?

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