ändern - git squash commits




Wie kann man bestehende, nicht gepushte Commits ändern? (18)

Änderung der letzten Commit-Nachricht

git commit --amend

öffnet Ihren Editor, damit Sie die Commit-Nachricht des letzten Commits ändern können. Darüber hinaus können Sie die Festschreibungsnachricht direkt in der Befehlszeile festlegen:

git commit --amend -m "New commit message"

… Dies kann jedoch dazu führen, dass mehrzeilige Commit-Nachrichten oder kleine Korrekturen umständlicher werden.

Stellen Sie sicher, dass Sie keine Arbeitskopienänderungen vorgenommen haben , bevor Sie dies tun oder sie werden ebenfalls festgeschrieben. ( Nicht inszenierte Änderungen werden nicht festgelegt.)

Ändern der Nachricht eines Commits, das Sie bereits an Ihren Remote-Zweig weitergeleitet haben

Wenn Sie Ihr Commit bereits zu Ihrem Remote-Zweig verschoben haben, müssen Sie das Commit mit folgendem Push erzwingen :

git push <remote> <branch> --force
# Or
git push <remote> <branch> -f

Warnung: Durch gewaltsames Drücken wird der entfernte Zweig mit dem Status Ihres lokalen Zweiges überschrieben . Wenn es auf dem entfernten Zweig Commits gibt, die Sie nicht in Ihrem lokalen Zweig haben, werden Sie diese Commits verlieren.

Warnung: Seien Sie vorsichtig bei der Änderung von Zusagen, die Sie bereits mit anderen Personen geteilt haben. Bei Änderungsbindungen werden diese im Wesentlichen so umgeschrieben, dass sie unterschiedliche SHA IDs haben. Dies ist problematisch, wenn andere Personen Kopien der alten Commit-Datei haben, die Sie neu geschrieben haben. Jeder, der eine Kopie des alten Commits hat, muss seine Arbeit mit dem neu geschriebenen Commit synchronisieren, was manchmal schwierig sein kann. Stellen Sie daher sicher, dass Sie sich mit anderen abstimmen, wenn Sie versuchen, den Shared-Commit-Verlauf neu zu schreiben, oder vermeiden Sie einfach das Shared-Commit insgesamt.

Verwenden Sie interaktive Rebase

Eine andere Option ist die Verwendung der interaktiven Basis.
Auf diese Weise können Sie jede Nachricht bearbeiten, die Sie aktualisieren möchten, auch wenn es sich nicht um die letzte Nachricht handelt.

Um einen Git Squash zu machen, folge diesen Schritten:

// X is the number of commits to the last commit you want to be able to edit
git rebase -i HEAD~X

Sobald Sie Ihre Commits komprimiert haben, wählen Sie die e/r zum Bearbeiten der Nachricht

Wichtiger Hinweis zu Interactive Rebase

Wenn Sie git rebase -i HEAD~X kann es mehr als X Commits geben. Git "sammelt" alle Commits in den letzten X Commits und wenn es irgendwo zwischen diesem Bereich zu einer Zusammenführung kam, werden alle Commits ebenfalls angezeigt, so dass das Ergebnis X + ist.

Guter Tipp:

Wenn Sie dies für mehr als einen Zweig tun müssen und bei der Änderung des Inhalts Konflikte auftreten können, richten Sie git rerere und lassen Sie git diese Konflikte automatisch für Sie lösen.

🔥 Hot-Tipp

Sie können auch eine kleine Bash-Funktion schreiben, um die letzte Git-Festschreibungsnachricht zu ändern und an die Fernbedienung zu schieben. Hilft mir die ganze Zeit. Hier ist die Funktion; .bashrc es in Ihre .bashrc Datei oder eine ähnliche .zshrc Datei und laden Sie die Shell erneut.

# Amend the last commit message
# Push the changes to remote by force
# USAGE: gamend "Your New Commit Msg"
function gamend() {
    git commit --amend -m "[email protected]"
    git push --force
}

Dokumentation

Ich habe in einer Commit-Nachricht das Falsche geschrieben. Alternativ habe ich vergessen, einige Dateien einzuschließen.

Wie kann ich die Commit-Nachricht / -Dateien ändern? Das Commit wurde noch nicht getrieben.


Ändern

Sie haben hier einige Möglichkeiten. Du kannst tun

git commit --amend

solange es dein letzter Einsatz ist.

Interaktive Rebase

Andernfalls können Sie, wenn es nicht Ihr letztes Commit ist, eine interaktive Rebase durchführen.

git rebase -i [branched_from] [hash before commit]

Dann fügen Sie in der interaktiven Basis einfach Bearbeiten zu diesem Commit hinzu. Wenn es erscheint, machen Sie ein git commit --amend und ändern Sie die Commit-Nachricht. Wenn Sie vor diesem Commit-Punkt einen git reflog möchten, können Sie auch git reflog und das Commit löschen. Dann machst du einfach wieder ein git commit .


Aktualisieren Sie Ihre letzte falsche Commit-Nachricht mit einer neuen Commit-Nachricht in einer Zeile:

git commit --amend -m "your new commit message"

Oder versuchen Sie git reset wie folgt:

# You can reset your head to n number of commit
# NOT a good idea for changing last commit message
# but you can get an idea to split commit into multiple commits
git reset --soft HEAD^

# it will reset you last commit. Now, you
# can re-commit it with new commit message.

Verwenden Sie reset, um Commits in kleinere Commits aufzuteilen

git reset kann Ihnen helfen, ein Commit auch in mehrere Commits aufzuteilen:

# reset your head. I am resetting to last commits:
git reset --soft HEAD^
# (you can reset multiple commit by doing HEAD~2(no. of commits)

# Now, reset your head for splitting it to multiple commits
git reset HEAD

# add and commit your files seperately to make multiple commits: e.g
git add app/
git commit -m "add all files in app directory"

git add config/
git commit -m "add all files in config directory"

Hier haben Sie Ihr letztes Commit erfolgreich in zwei Commits aufgeteilt.


Benutzen

git commit --amend

Um es im Detail zu verstehen, ist ein hervorragender Beitrag 4. Git History umschreiben . Es spricht auch darüber, wann git commit --amend nicht verwendet git commit --amend .


Ich benutze die Git-GUI so oft ich kann, und das gibt Ihnen die Möglichkeit, das letzte Commit zu ändern:

Auch git rebase -i origin/master ist ein nettes Mantra, das Sie immer mit den Commits, die Sie auf master gemacht haben, präsentiert und Ihnen die Option gibt, zu ändern, zu löschen, neu zu ordnen oder zu zerquetschen. Es ist nicht nötig, diesen Hash zuerst zu ergattern.


Ich bevorzuge diesen Weg.

git commit --amend -c <commit ID>

Andernfalls wird ein neues Commit mit einer neuen Commit-ID angezeigt


Sie können dafür auch git filter-branch .

git filter-branch -f --msg-filter "sed 's/errror/error/'" $flawed_commit..HEAD

Es ist nicht so einfach wie ein trivialer git commit --amend , aber es ist besonders nützlich, wenn Sie nach einer fehlerhaften Commit-Nachricht bereits einige Zusammenführungen vorgenommen haben.

Beachten Sie, dass dies versuchen wird, JEDES Commit zwischen HEAD und dem fehlerhaften Commit neu zu schreiben. Daher sollten Sie Ihren msg-filter Befehl sehr weise wählen.


Um den vorherigen Commit zu ändern, nehmen Sie die gewünschten Änderungen vor, führen Sie die Änderungen durch und führen Sie sie aus

git commit --amend

Dadurch wird eine Datei in Ihrem Texteditor geöffnet, die Ihre neue Bestätigungsnachricht darstellt. Es beginnt mit dem Text Ihrer alten Commit-Nachricht. Ändern Sie die Festschreibungsnachricht wie gewünscht, speichern Sie die Datei und beenden Sie den Editor, um den Vorgang abzuschließen.

Um den vorherigen Commit zu ändern und dieselbe Protokollnachricht beizubehalten, führen Sie Folgendes aus

git commit --amend -C HEAD

Um das vorherige Commit zu beheben, indem Sie es vollständig entfernen, führen Sie es aus

git reset --hard HEAD^

Wenn Sie mehrere Commit-Nachrichten bearbeiten möchten, führen Sie den Befehl aus

git rebase -i HEAD~commit_count

(Ersetzen Sie commit_count durch die Anzahl der Commits, die Sie bearbeiten möchten.) Mit diesem Befehl wird der Editor gestartet . Markieren Sie den ersten Commit (den, den Sie ändern möchten) als "edit" statt "pick", speichern Sie dann und beenden Sie den Editor. Nehmen Sie die gewünschte Änderung vor und führen Sie sie aus

git commit --amend
git rebase --continue

Hinweis: Sie können die gewünschte Änderung auch über den von git commit --amend geöffneten Editor git commit --amend


Wenn Sie die Git-GUI verwenden, können Sie das letzte Commit ändern, mit dem noch nicht gepusht wurde:

Commit/Amend Last Commit

Wenn Sie eine alte Festschreibungsnachricht über mehrere Zweige hinweg ändern müssen (dh das Festschreiben mit der fehlerhaften Nachricht ist in mehreren Zweigen vorhanden), möchten Sie möglicherweise Folgendes verwenden:

git filter-branch -f --msg-filter \
'sed "s/<old message>/<new message>/g"' -- --all

Git erstellt ein temporäres Verzeichnis, in dem alte Referenzen in refs/original/ und zusätzlich gesichert werden.

  • -f erzwingt die Ausführung der Operation. Dies ist notwendig, wenn das temporäre Verzeichnis bereits vorhanden ist oder bereits Referenzen unter refs/original gespeichert sind. Ist dies nicht der Fall, können Sie dieses Flag löschen.

  • -- trennt die Filterzweigoptionen von den Revisionsoptionen.

  • --all sicher, dass alle Zweige und Tags neu geschrieben werden.

Aufgrund der Sicherung Ihrer alten Referenzen können Sie vor der Ausführung des Befehls problemlos in den Status zurückkehren.

Angenommen, Sie möchten Ihren Master wiederherstellen und im Zweig old_master :

git checkout -b old_master refs/original/refs/heads/master

Wenn Sie nur das letzte Commit bearbeiten möchten, verwenden Sie Folgendes:

git commit --amend

oder

git commit --amend -m 'one line message'

Wenn Sie jedoch mehrere Commits hintereinander bearbeiten möchten, sollten Sie stattdessen eine Umbasierung verwenden:

git rebase -i <hash of one commit before the wrong commit>

In einer Datei wie der obigen schreiben Sie edit / e oder eine der anderen Optionen und klicken Sie auf Speichern und beenden.

Jetzt bist du beim ersten falschen Commit. Nehmen Sie Änderungen an den Dateien vor, und diese werden automatisch für Sie bereitgestellt. Art

git commit --amend

Speichern und beenden Sie das und geben Sie ein

git rebase --continue 

um zur nächsten Auswahl zu gelangen, bis Sie alle Ihre Auswahl getroffen haben.

Beachten Sie, dass diese Dinge alle Ihre SHA-Hashes nach diesem bestimmten Commit ändern.


Wenn das Commit, das Sie korrigieren möchten, nicht das aktuellste ist:

  1. git rebase --interactive $parent_of_flawed_commit

    Wenn Sie mehrere fehlerhafte Commits korrigieren möchten, übergeben Sie das übergeordnete Element des ältesten Commits.

  2. Es erscheint ein Editor mit einer Liste aller Commits seit dem, den Sie gegeben haben.

    1. Ändern Sie die pick in " reword (oder in alten Versionen von Git, um sie zu edit ) vor allen Commits, die Sie reword möchten.
    2. Nach dem Speichern gibt Git die aufgelisteten Commits wieder.

  3. Bei jedem Commit, den Sie umformulieren möchten, wird Git Sie in Ihrem Editor ablegen . Bei jedem Commit, den Sie bearbeiten möchten, werden Sie von Git in der Shell abgelegt. Wenn Sie in der Schale sind:

    1. Ändern Sie das Commit auf beliebige Weise.
    2. git commit --amend
    3. git rebase --continue

Der größte Teil dieser Reihenfolge wird Ihnen durch die Ausgabe der verschiedenen Befehle erläutert. Es ist sehr einfach, Sie müssen es nicht auswendig lernen - denken Sie daran, dass git rebase --interactive es Ihnen ermöglicht, Commits zu korrigieren, egal wie lange sie vorher waren.

Beachten Sie, dass Sie bereits gesendete Commits nicht ändern möchten. Oder vielleicht auch, aber in diesem Fall müssen Sie sehr sorgfältig darauf achten, mit allen zu kommunizieren, die Ihre Verpflichtungen eingegangen sind und Arbeit geleistet haben. Wie kann ich eine Wiederherstellung durchführen / erneut synchronisieren, nachdem jemand eine Rebase oder einen Reset für einen veröffentlichten Zweig ausgeführt hat?


Wie bereits erwähnt, ist git commit --amend der Weg, den letzten Commit zu überschreiben. Ein Hinweis: Wenn Sie die Dateien auch überschreiben möchten, lautet der Befehl

git commit -a --amend -m "My new commit message"

Wow, es gibt viele Möglichkeiten, dies zu tun.

Eine andere Möglichkeit besteht darin, das letzte Commit zu löschen, aber die Änderungen beizubehalten, damit Sie Ihre Arbeit nicht verlieren. Sie können dann mit der korrigierten Nachricht ein weiteres Commit ausführen. Das würde ungefähr so ​​aussehen:

git reset --soft HEAD~1
git commit -m 'New and corrected commit message'

Ich mache das immer, wenn ich vergessen habe, eine Datei hinzuzufügen oder eine Änderung vorzunehmen.

Denken Sie daran, --soft anstelle von --hard , andernfalls verlieren Sie das Commit vollständig.


Ich benutze gerne Folgendes:

  1. git status
  2. git add --all
  3. git commit -am "message goes here about the change"
  4. git pull <origin master>
  5. git push <origin master>

Ich habe den Alias ​​von hinzugefügt reci, recmdafür recommit (amend)kann ich es jetzt mit git recmoder machen git recm -m.

$ vim ~/.gitconfig

[alias]

    ......
    cm = commit
    reci = commit --amend
    recm = commit --amend
    ......

Sie können git-rebase-reword

Es ist so konzipiert, dass alle Commits (nicht nur als letztes) auf dieselbe Weise bearbeitet werden wie commit --amend

$ git rebase-reword <commit-or-refname>

Es ist nach der Aktion auf rebase interactive benannt, um ein Commit zu ändern: "reword". Siehe diesen Beitrag und den man Abschnitt interaktiven Modus-

Beispiele:

$ git rebase-reword b68f560
$ git rebase-reword HEAD^

Wenn Sie den Code nicht an Ihren entfernten Zweig ( GitHub / Bitbucket ) gesendet haben, können Sie die Festschreibungsnachricht in der Befehlszeile wie folgt ändern.

 git commit --amend -m "Your new message"

Wenn Sie an einem bestimmten Zweig arbeiten, gehen Sie folgendermaßen vor:

git commit --amend -m "BRANCH-NAME: new message"

Wenn Sie den Code bereits mit der falschen Nachricht eingegeben haben, müssen Sie beim Ändern der Nachricht vorsichtig sein. Das heißt, nachdem Sie die Festschreibungsnachricht geändert haben und erneut versucht haben, sie zu pushen, haben Sie Probleme. Führen Sie die folgenden Schritte aus, um den Vorgang reibungslos zu gestalten.

Bitte lest meine gesamte Antwort, bevor Sie es tun.

git commit --amend -m "BRANCH-NAME : your new message"

git push -f origin BRANCH-NAME                # Not a best practice. Read below why?

Wichtiger Hinweis: Wenn Sie den Force-Push-Befehl direkt verwenden, kann es zu Code-Problemen kommen, die von anderen Entwicklern in demselben Zweig ausgeführt werden. Um diese Konflikte zu vermeiden, müssen Sie den Code aus Ihrer Zweigstelle ziehen, bevor Sie den Force-Push ausführen :

 git commit --amend -m "BRANCH-NAME : your new message"
 git pull origin BRANCH-NAME
 git push -f origin BRANCH-NAME

Dies ist die bewährte Methode, wenn Sie die Festschreibungsnachricht ändern, wenn sie bereits gesendet wurde.





amend