Ich möchte ausgewählte Festschreibungsprotokolleinträge aus einem linearen Festschreibungsbaum entfernen, damit die Einträge nicht im Festschreibungsprotokoll angezeigt werden.
Mein Commit-Baum sieht ungefähr so aus:
R--A--B--C--D--E--HEAD
Ich möchte die Einträge B und C entfernen, damit sie nicht im Festschreibungsprotokoll angezeigt werden, aber Änderungen von A nach D sollten beibehalten werden. Vielleicht durch die Einführung eines einzelnen Commits, sodass B und C zu BC werden und der Baum so aussieht.
R--A--BC--D--E--HEAD
Oder im Idealfall nach A kommt D direkt. D 'repräsentiert Änderungen von A nach B, B nach C und C nach D.
R--A--D'--E--HEAD
Ist das möglich? wenn ja wie?
Dies ist ein ziemlich neues Projekt, daher gibt es derzeit keine Niederlassungen, daher auch keine Zusammenschlüsse.
rebase
kann alte / neue Commits entfernen. Ich weiß nicht, was "Protokolleinträge festschreiben" bedeutet.git log
, wird das "Commit-Protokoll" git-scm.com/docs/git-log angezeigt . Und ich wollte zwei Einträge aus diesem Protokoll entfernen - nicht die Änderungen.Antworten:
git-rebase (1) macht genau das.
git awsome-ness [git rebase --interactive] enthält ein Beispiel.
git-rebase
für öffentliche (Remote-) Commits verwenden.commit
oderstash
Ihre aktuellen Änderungen).$EDITOR
.pick
VorC
undD
nach ersetzensquash
. Es verschmilzt C und D zu B. Wenn Sie ein Commit löschen möchten, löschen Sie einfach seine Zeile.Wenn Sie verloren sind, geben Sie Folgendes ein:
quelle
git rebase -i D [A]
?push -f
deine Änderungen. Tu es nicht, wenn du nicht alleine arbeitest.git-rebase
Manual und Wayback Machine für den Blog-Beitrag behoben .quelle
Hier ist eine Möglichkeit, eine bestimmte Festschreibungs-ID zu entfernen, wobei nur die Festschreibungs-ID bekannt ist, die Sie entfernen möchten.
Beachten Sie, dass dadurch die durch das Commit eingeführte Änderung tatsächlich entfernt wird.
quelle
Um die Antwort von JF Sebastian zu erweitern:
Sie können git-rebase verwenden, um auf einfache Weise alle Arten von Änderungen an Ihrem Commit-Verlauf vorzunehmen.
Nach dem Ausführen von git rebase --interactive erhalten Sie Folgendes in Ihrem $ EDITOR:
Sie können Zeilen verschieben, um die Reihenfolge der Festschreibungen zu ändern, und Zeilen löschen, um diese Festschreibung zu entfernen. Sie können auch einen Befehl hinzufügen, um zwei Commits zu einem einzigen Commit zu kombinieren (zu quetschen) (vorheriges Commit ist das obige Commit), Commits zu bearbeiten (was geändert wurde) oder Commit-Nachrichten neu zu formulieren.
Ich denke, Pick bedeutet nur, dass Sie dieses Commit in Ruhe lassen wollen.
(Beispiel ist von hier )
quelle
Sie können B und C in Ihrem Beispiel nicht interaktiv entfernen mit:
oder symbolisch,
Beachten Sie, dass die Änderungen in B und C nicht in D erfolgen. Sie werden weg sein .
quelle
Noch ein Weg,
Wählen Sie den Hash aus, den Sie als Basis verwenden möchten, und der obige Befehl sollte ihn interaktiv machen, damit Sie alle Top- Nachrichten quetschen können (Sie müssen die ältesten hinterlassen).
quelle
Ich finde diesen Prozess viel sicherer und verständlicher, indem ich einen weiteren Zweig aus dem SHA1 von A erstelle und die gewünschten Änderungen auswähle, damit ich sicher bin, dass ich mit dem Aussehen dieses neuen Zweigs zufrieden bin. Danach ist es einfach, den alten Zweig zu entfernen und den neuen umzubenennen.
quelle
Habe gerade die Antworten aller Leute gesammelt: (m neu bei git plz benutze es nur als Referenz)
Git Rebase, um alle Commits zu löschen
Git Log
Git Rebase -i HEAD ~ 1
Dann sieht der Bildschirm ungefähr so aus:
Ändern Sie hier die erste Zeile nach Ihren Wünschen (verwenden Sie die oben aufgeführten Befehle, z. B. 'drop', um das Commit zu entfernen usw.). Drücken Sie nach Abschluss der Bearbeitung ': x', um den Editor zu speichern und zu beenden (dies gilt nur für den vim-Editor).
Und dann
Git Push
Wenn das Problem angezeigt wird, müssen Sie die Änderungen mit Nachdruck auf Remote übertragen (SEHR KRITISCH: Drücken Sie nicht, wenn Sie im Team arbeiten).
Git Push -f Ursprung
quelle
Sie können dafür Git Cherry-Pick verwenden. 'cherry-pick' wendet ein Commit auf den Zweig an, auf dem Sie sich gerade befinden.
dann mach
Wenden Sie dann die D- und E-Commits an.
Dadurch wird das B- und C-Commit übersprungen. Allerdings ist es möglicherweise unmöglich, das D-Commit ohne B auf den Zweig anzuwenden, also YMMV.
quelle
reset --hard
, nichtrebase --hard
(was nicht existiert)