Frage

Ich habe eine Git-Repository, das wie folgt aussieht:

A -> B -> C -> D -> HEAD

Ich mag den Kopf der Verzweigung zum Punkt A, d.h. ich will B, C, D, und Kopf verschwinden, und ich mag Kopf mit einem synonym sein.

Es klingt wie kann ich entweder versuchen, rebase (gilt nicht, da ich Änderungen zwischen gedrückt haben), oder zurück. Aber wie zufällt ich mehrere Commits? Muß ich einen nach dem anderen zurückkommen? Ist die Reihenfolge wichtig?

War es hilfreich?

Lösung

Expanding, was ich in einem Kommentar geschrieben

Die allgemeine Regel ist, dass Sie nicht (ändern) umschreiben sollte Geschichte, die Sie veröffentlicht haben, weil jemand ihre Arbeit auf sie gestützt haben könnte. Wenn Sie (ändern) Geschichte neu zu schreiben, würden Sie Probleme machen mit ihren Änderungen Zusammenführung und mit ihnen zu aktualisieren.

So ist die Lösung ist ein neue commit , die kehrt Änderungen zu erstellen, dass Sie loswerden wollen. Sie können dies mit git Befehl zurückkehrt

Sie haben die folgende Situation vor:

A <-- B  <-- C <-- D                                               <-- master <-- HEAD

(Pfeile beziehen sich hier auf die Richtung des Zeigers: das „parent“ reference im Fall von Festschreibungen, die oben im Fall von Verzweigungskopf commit (Zweig ref), und der Name des Zweiges im Fall von HEAD Referenz ).

Was Sie erstellen müssen, ist die folgende:

A <-- B  <-- C <-- D <-- [(BCD)^-1]                   <-- master <-- HEAD

, wobei "[(BCD) ^ - 1]" bedeutet, dass die verpflichten, dass kehrt Änderungen verpflichtet B, C, D. Mathematik sagt uns, dass (BCD) ^ - 1 = D ^ -1 C ^ -1 B ^ - 1, so dass Sie die gewünschte Situation mit den folgenden Befehlen bekommen:

$ git revert --no-commit D
$ git revert --no-commit C
$ git revert --no-commit B
$ git commit -m "the commit message"

Mögliche Lösung wäre, Kasse Inhalt von A zu begehen, und verpflichten diesen Zustand:

$ git checkout -f A -- .
$ git commit -a

Dann würden Sie die folgende Situation haben:

A <-- B  <-- C <-- D <-- A'                       <-- master <-- HEAD

Die Commit A‘die gleichen Inhalte wie begehen A, ist aber eine andere begehen (Commit-Nachricht, Eltern, begehen Datum).

Die Lösung von Jeff Ferland, geändert durch Charles Bailey auf die Builds gleiche Idee, aber verwendet git reset :

$ git reset --hard A
$ git reset --soft @{1}  # (or ORIG_HEAD), which is D
$ git commit

Andere Tipps

Damit Sie nur verwenden, um das revert Befehl, und geben Sie den Bereich der Commits Sie kehrten erhalten.

Unter Berücksichtigung Ihres Beispiel, würden Sie haben, dies zu tun (vorausgesetzt, Sie auf dem Zweig ‚Master‘ sind):

git revert master~3..master

Dies erzeugt eine neue mit dem inversen in Ihrem lokalen begehen B begehen, C und D (was bedeutet, dass es durch diese Commits eingeführten Änderungen rückgängig machen wird):

A <- B <- C <- D <- BCD' <- HEAD

Sauber Art und Weise, die ich gefunden nützlich

git revert --no-commit HEAD~3..

Dieser Befehl kehrt letzte 3 Commits mit nur einem begehen.

Auch nicht die Geschichte umschreiben.

ähnlich wie Jakub Antwort, dies ermöglicht es Ihnen leicht aufeinander folgende Commits auswählen zurückzukehren.

# revert all commits from B to HEAD, inclusively
$ git revert --no-commit B..HEAD  
$ git commit -m 'message'
git reset --hard a
git reset --mixed d
git commit

Das wird als revert wirkt auf einmal für alle. Geben Sie eine gute Commit-Nachricht.

Zuerst sicher sein, dass Ihre Arbeitskopie wird nicht verändert. Dann gilt:

git diff HEAD commit_sha_you_want_to_revert_to | git apply

und dann begehen gerade. Vergessen Sie nicht, zu dokumentieren, was ist der Grund für revert.

Ich bin so frustriert, dass diese Frage nicht nur beantwortet werden. Jede andere Frage ist, in Bezug auf, wie man richtig zurückkehren und Geschichte zu bewahren. Diese Frage sagt „Ich habe den Kopf der Branche wollen Punkt A, also ich will B, C, D und HEAD auf verschwinden und ich möchte Kopf mit A. synonym sein“

git checkout <branch_name>
git reset --hard <commit Hash for A>
git push -f

habe ich viel gelernt Jakubs Post zu lesen, aber ein Typ im Unternehmen (mit Zugang zu unserem „Test“ Zweig ohne Pull-Request zu drücken) wie 5 schlecht geschoben begeht einen Fehler zu beheben und zu beheben und zu beheben versucht er 5 aus vor verpflichtet. Nicht nur das, sondern ein oder zwei Pull Requests angenommen wurden, die jetzt schlecht waren. Also vergessen Sie es, fand ich das letzte gute commit (ABC1234) und lief nur die Basic-Skript:

git checkout testing
git reset --hard abc1234
git push -f

sagte ich zu den anderen fünf Jungs in diesem Repo arbeiten, dass sie besser zur Kenntnis ihrer Änderungen in die letzten paar Stunden machen und Wisch- / Re-Zweig von der letzten Prüfung. Ende der Geschichte.

Dies ist eine Erweiterung eines der Lösungen in Jakub Antwort zur Verfügung gestellt

Ich war mit einer Situation konfrontiert, wo die Commits ich wieder rollen erforderlich waren etwas komplex, mit mehreren der Commits Wesen verschmelzen verpflichtet, und ich brauchte Umschreiben der Geschichte zu vermeiden. Ich war nicht in der Lage, eine Reihe von git revert Befehlen zu verwenden, weil ich schließlich in Konflikte lief zwischen der Reversion hinzugefügt ändert wird. Ich landete mit den folgenden Schritten.

Überprüfen Sie zunächst den Inhalt des Ziel heraus begehen, während HEAD an der Spitze der Branche zu verlassen:

$ git checkout -f <target-commit> -- .

(Der - stellt sicher, <target-commit> als eine Festschreibung interpretiert wird eher als eine Datei, die bezieht sich auf das aktuelle Verzeichnis.).

Dann bestimmen, welche Dateien in den Commits hinzugefügt wurden zurück gerollt und somit müssen gelöscht werden:

$ git diff --name-status --cached <target-commit>

Dateien, die mit einem „A“ zeigen sich am Anfang der Zeile versetzt sollte, und es sollten keine anderen Unterschiede geben. Wenn nun alle Dateien, die entfernt werden müssen, inszenieren diese Dateien für die Entfernung:

$ git rm <filespec>[ <filespec> ...]

Schließlich verpflichten die Reversion:

$ git commit -m 'revert to <target-commit>'

Wenn es gewünscht wird, stellen Sie sicher, dass wir in den gewünschten Zustand sind zurück:

$git diff <target-commit> <current-commit>

Es sollte keine Unterschiede geben.

Die einfache Art und Weise eine Gruppe von Commits auf gemeinsam genutztes Repository zurückkehren (das Menschen benutzen und Sie wollen die Geschichte bewahren) ist git revert in Verbindung mit git rev-list zu verwenden. Letztere werden Sie mit einer Liste von Commits bieten, wird der ehemalige tun, um die revert selbst.

Es gibt zwei Möglichkeiten, das zu tun. Wenn Sie die Revert mehr in einer einzigen Commit Verwendung verpflichtet werden sollen:

for i in `git rev-list <first-commit-sha>^..<last-commit-sha>`; do git revert -n $i; done

Dies wird eine Gruppe von Commits zurückkehren Sie brauchen, aber alle Änderungen auf dem Arbeits Baum verlassen, sollten Sie sie alle wie gewöhnlich begehen.

Eine weitere Möglichkeit ist eine einzige haben pro zurück Änderung zu begehen:

for i in `git rev-list <first-commit-sha>^..<last-commit-sha>`; do git revert --no-edit -s $i; done

Zum Beispiel, wenn Sie einen Baum begehen wie

 o---o---o---o---o---o--->    
fff eee ddd ccc bbb aaa

die Änderungen von eee bbb , führen

zurückzukehren
for i in `git rev-list eee^..bbb`; do git revert --no-edit -s $i; done

Keiner von denen für mich gearbeitet, so hatte ich drei Commits (die letzten drei Commits) zurück, also tat ich:

git revert HEAD
git revert HEAD~2
git revert HEAD~4
git rebase -i HEAD~3 # pick, squash, squash

Arbeitete wie ein Charme:)

Meiner Meinung nach eine sehr einfache und saubere Art und Weise sein könnte:

bis A zurück

git checkout -f A

Punkt Master-Kopf auf den aktuellen Stand

git symbolic-ref HEAD refs/heads/master

Speichern

git commit

Wenn Sie möchten, um vorübergehend die Commits einer Funktion zurückkehren, dann können Sie die Serie von folgenden Befehle verwenden.

Hier ist, wie es funktioniert

git log --pretty = oneline | grep 'feature_name' | cut -d '' -f1 | xargs -n1 git --no-edit zurückkehren

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top