Wie kann ich zwei Commits zu einem Commit kombinieren?

99

Ich habe einen Zweig 'firstproject' mit 2 Commits. Ich möchte diese Commits loswerden und sie als ein einziges Commit erscheinen lassen.

Der Befehl git merge --squashklingt vielversprechend, aber wenn ich git merge --squashmein Terminal starte, werden nur Optionen für den Befehl angezeigt. Was ist der richtige Befehl?

Commit 1:
Added 'homepage.html'
Added 'contacts.html'

Commit 2:
Added 'homepage.php'
Added 'homepage.php'
Deleted 'homepage.html'
Deleted 'contacts.html'
Don P.
quelle
Ich denke nicht, dass das der richtige Befehl ist. Ich bezweifle auch, dass Sie solche Commits überhaupt ändern können.
BSull
Nein, Sie können mehrere Commits in ein Commit ändern : git-scm.com/book/en/Git-Tools-Rewriting-History Meine Frage bezieht sich nur auf den spezifischen Befehl dafür.
Don P
@BSull Sie können Commits auf jede gewünschte Weise ändern. Sie können buchstäblich jederzeit vollständig bearbeitet werden. Wenn Sie Code mit anderen teilen, wird dadurch Ihr Verlauf neu geschrieben und Sie arbeiten effektiv mit einem anderen Zweig als alle anderen.
Meagar
Dies hätte niemals getäuscht werden dürfen. In der Tat hätte dieser andere als zu breit geschlossen werden sollen. Die andere Frage, die als Betrogener gekennzeichnet ist, ist unnötig komplex, da eine vorherige Rebase aufgegeben werden muss.
Evan Carroll

Antworten:

134

Sie möchten git rebase -ieine interaktive Rebase durchführen .

Wenn Sie sich derzeit in Ihrem "Commit 1" befinden und das Commit, das Sie zusammenführen möchten, "Commit 2", das vorherige Commit ist, das Sie ausführen können git rebase -i HEAD~2, wird ein Editor erstellt, in dem alle Commits aufgelistet sind, die die Rebase durchlaufen wird. Sie sollten zwei Zeilen sehen, die mit "pick" beginnen. Um mit dem Quetschen fortzufahren, ändern Sie das erste Wort der zweiten Zeile von "auswählen" in "quetschen". Speichern Sie dann Ihre Datei und beenden Sie sie. Git wird Ihr erstes Commit in Ihr vorletztes Commit zerquetschen.

Beachten Sie, dass dieser Prozess den Verlauf Ihrer Niederlassung neu schreibt. Wenn Sie Ihren Code irgendwohin verschieben, müssen Sie git push -fund jeder, der Ihren Code teilt, muss durch einige Rahmen springen, um Ihre Änderungen abzurufen.

Beachten Sie, dass sich der Prozess geringfügig unterscheidet , wenn die beiden fraglichen Commits nicht die letzten beiden Commits in der Verzweigung sind.

meagar
quelle
2
Wie geht das Then write your file, and quit? Ich verwende Android Studio Terminal, die Git-Konsole selbst oder sogar die Git-Konsole mit der SourceTree-Software. Aber wie kann man speichern und beenden?
Dr.jacky
1
Wie kombiniere ich 2 Commits, die nicht die letzten beiden Commits in der Verzweigung sind?
Weishi Zeng
1
@meagar Ich denke, es macht Sinn ... Wenn Sie dieses Problem überprüfen (ein Duplikat davon), hat das Drücken der "Richtung" einen großen Unterschied gemacht und war die Wurzel des gesamten Problems (siehe den ersten Kommentar mit etwa 200 positiven Stimmen zu "). falsch quetschen ') - stackoverflow.com/a/2568581/43453
PandaWood
1
@PandaWood Du hast die Antwort falsch verstanden. Der erste Weg war einfach falsch , nicht anders . Sie können nur rückwärts quetschen, es macht keinen Sinn, daran zu denken, ein älteres Commit in ein neueres zu quetschen, aber wenn Sie könnten , wäre es die gleiche Operation.
Meagar
1
Ich verstand bis zu "das erste Wort der zweiten Zeile ändern" - zweite Zeile von was?
Andrew Torr
70

Faule einfache Version für Vergessliche wie mich:

git rebase -i HEAD~3 oder wie viele Commits statt 3.

Drehen Sie dies

pick YourCommitMessageWhatever
pick YouGetThePoint
pick IdkManItsACommitMessage

das mögen

pick YourCommitMessageWhatever
s YouGetThePoint
s IdkManItsACommitMessage

und führen Sie eine Aktion aus, bei der Sie escdann enterdrücken, um die Änderungen zu speichern. [1]

Wenn der nächste Bildschirm angezeigt wird, entfernen Sie diese Müllzeilen [2], erstellen Sie eine neue Festschreibungsnachricht oder ähnliches und führen Sie dieselbe escape enterAktion aus. [1]

Wowee, du hast weniger Commits. Oder du hast einfach alles kaputt gemacht.


[1] - oder was auch immer mit Ihrer Git-Konfiguration funktioniert. Dies ist nur eine Sequenz, die angesichts meines Setups effizient ist.

[2] - Sie werden einige Dinge wie # this is your n'th commitein paar Mal sehen, wobei Ihre ursprünglichen Commits direkt unter dieser Nachricht stehen. Sie möchten diese Zeilen entfernen und eine Festschreibungsnachricht erstellen, die die Absichten der n Festschreibungen widerspiegelt, die Sie zu 1 kombinieren.

Stachu
quelle
Sehr prägnante Lösung - danke. Könnte praktisch sein, um zu skizzieren, dass shier für Squash steht. Um das Commit zu verwenden, verschmelzen Sie aber mit dem vorherigen Commit
UrbanConor
Wenn Sie nur haben 2Commits und kombinieren möchten die gleiche 2begehen, müssen Sie laufen git reset --soft HEAD~und git commit --amend.
Prüfung
22
  1. Überprüfen Sie Ihre Filiale und zählen Sie die Anzahl aller Commits.
  2. Öffnen Sie git bash und schreiben Sie: git rebase -i HEAD~<quantity of your commits>(dh git rebase -i HEAD~5)
  3. txtÄndern Sie in der geöffneten Datei das pickSchlüsselwort squashfür alle Commits mit Ausnahme des ersten Commits (das sich oben befindet). Als erstes ändern Sie es in reword(was bedeutet, dass Sie im nächsten Schritt einen neuen Kommentar für dieses Commit abgeben) und klicken Sie auf SPEICHERN! Wenn in vim, drücken Sie escund speichern Sie durch Eingabe wq!und drücken Sie die Eingabetaste.
  4. Kommentar abgeben.
  5. Öffne Git und mache "Fetch all", um neue Änderungen zu sehen.

Erledigt

user5820972
quelle
Der erste sagt mir, wie man es in vim benutzt. Vielen Dank
Ho Luong