Frage

Ich habe in ein bisschen ein Problem laufe hier: Ich hatte ein Problem spezifischen Zweig 28s in Git, dass ich in dem allgemeinen develop Zweig verschmolzen. Stellt sich heraus, ich hatte es zu schnell getan, so habe ich git-revert die Zusammenführung rückgängig zu machen. Nun aber ist die Zeit gekommen 28s in develop zu verschmelzen, aber git-merge-Befehl sieht die ursprüngliche merge, und kündigt glücklich, dass alles gut ist und Filialen sind bereits verschmolzen. Was mache ich jetzt? Erstellen Sie eine 'Revert "Revert "28s -> entwickeln""' begehen? Scheine nicht ein guter Weg, es zu tun, aber ich kann keine andere im Moment vorstellen kann.

Was die Baumstruktur wie folgt aussieht:

Git Protokollausgabe

War es hilfreich?

Lösung

Sie müssen „das zufließen“. Hängt davon ab, wie haben Sie zurückkommen, dass es nicht so einfach sein, wie es sich anhört. Schauen Sie sich die Thema .

---o---o---o---M---x---x---W---x---Y
              /
      ---A---B-------------------C---D

ermöglichen:

---o---o---o---M---x---x-------x-------*
              /                       /
      ---A---B-------------------C---D
  

Aber ist das alles? Sicher, es tut. Sie können eine Zusammenführung und aus einem zufällt   rein technischer Sicht, es git tat sehr natürlich und hatte keine wirkliche   Schwierigkeiten.
  Es hält es nur einen Wechsel von „Zustand vor merge“, um   „Zustand nach merge“, und das war es.
  Nichts kompliziert, nichts seltsam,   nichts wirklich gefährlich. Git wird es tun, ohne auch nur darüber nachzudenken.

     

So von einem technischen Winkel, es ist nichts falsch mit einer Zusammenführung zurückkehrt,   aber aus einem Workflow Winkel ist es etwas, das Sie in der Regel versuchen sollten   vermeiden .

     

Wenn möglich, beispielsweise, wenn Sie ein Problem finden, das hätte verschmolzen   in den Hauptbaum, anstatt die Zusammenführung zurückkehren, versuchen Sie wirklich schwer :

     
      
  • bisect das Problem in der Filiale ab verschmolzen, und es einfach zu beheben,
  •   
  • oder versuchen, die einzelnen verpflichten zurückzukehren, die sie verursacht hat.
  •   
     

Ja, es ist komplizierter, und nein, es ist nicht immer (manchmal zur Arbeit gehen   die Antwort lautet: „oops, ich sollte wirklich nicht zusammengeschlossen haben, weil es nicht war   noch nicht fertig, und ich brauche wirklich alle des Merge ") rückgängig zu machen. Sie also dann   sollte wirklich die Zusammenführung zurückkehren, aber wenn man die Zusammenführung erneut tun möchten, können Sie   Jetzt müssen es tun, indem Sie die revert zurückkehrt.

Andere Tipps

Nehmen wir an, Sie solche Geschichte

---o---o---o---M---W---x-------x-------*
              /                      
      ---A---B

Wenn A, B gescheitert Commits und W - ist zufällt von M

Also, bevor ich zur Festsetzung beginnen gefunden Probleme Ich cherry-pick von W zu meinem Zweig begehen

git cherry-pick -x W

Dann zufällt ich W auf meinem Zweig commit

git revert W 

Nachdem ich Fixierung fortsetzen kann.

Die letzte Geschichte könnte wie folgt aussehen:

---o---o---o---M---W---x-------x-------*
              /                       /     
      ---A---B---W---W`----------C---D

Wenn ich einen PR senden wird es zeigt deutlich, dass PR rückgängig zu machen ist revert und fügt einige neue Commits.

den revert zurückkehren möchte, ohne den Workflow zu viel vermasseln:

  • Erstellen Sie eine lokale Kopie von Müll entwickeln
  • Revert die revert auf die lokale Kopie Commit entwickeln
  • Merge, die in der Feature-Zweig zu kopieren, und drücken Sie die Feature-Zweig zu Ihrem git-Server.

Ihr Zweig soll nun in der Lage sein, normal werden zusammengeführt, wenn Sie bereit sind. Der einzige Nachteil ist, dass Sie ein paar zusätzlichen merge a haben werden / Revert Commits in Ihrer Geschichte.

Um einen Revert in GIT zurückkehren:

git revert <commit-hash-of-previous-revert>

Statt git-revert verwenden Sie diesen Befehl in der devel Zweig verwendet haben, könnten auf wegzuwerfen (rückgängig machen) die falsche merge commit (statt Zurücksetzen es nur).

git checkout devel
git reset --hard COMMIT_BEFORE_WRONG_MERGE

Dies wird auch den Inhalt des Arbeitsverzeichnisses entsprechend anpassen. Seien Sie vorsichtig, :

  • Speichern Sie die Änderungen in der Branche entwickeln (da die falsche merge), weil sie Auch wird durch die git-reset gelöscht werden. Alle verpflichtet nach dem von dir angegebenen als das git reset Argument weg sein!
  • Auch nicht dies tun, wenn Sie Ihre Änderungen wurden bereits von anderen Repositories gezogen da der Reset wird die Geschichte neu zu schreiben.

Ich empfehle die git-reset Mann-Seite sorgfältig zu studieren, bevor dies zu versuchen.

Nun, nach dem Reset können Sie erneut anwenden, um die Änderungen in devel und dann tun

git checkout devel
git merge 28s

Das wird einen echten Druck aus 28s in devel wie auch die ersten sein (das ist jetzt gelöscht, aus der Geschichte des git).

Ich habe gerade diesen Beitrag, wenn vor dem gleichen Problem. Ich finde oben wayyy zu beängstigend Reset Harten usw. tun ich etwas zu löschen am Ende werde ich möchte nicht, und werden nicht in der Lage sein, es wieder zu bekommen.

Stattdessen schaute ich aus der befehle ich den Zweig wollte zum Beispiel gehen zurück git checkout 123466t7632723. Dann konvertiert einen Zweig git checkout my-new-branch. Ich löschte dann den Zweig ich nicht mehr wollte. Natürlich wird dies nur funktionieren, wenn Sie in der Lage sind, um die Verzweigung Sie messed wegzuwerfen.

Ich würde vorschlagen, Sie unten Schritte zu folgen ein revert zurückkehren, sagen SHA1.

git checkout develop #go to develop branch
git pull             #get the latest from remote/develop branch
git branch users/yourname/revertOfSHA1 #having HEAD referring to develop
git checkout users/yourname/revertOfSHA1 #checkout the newly created branch
git log --oneline --graph --decorate #find the SHA of the revert in the history, say SHA1
git revert SHA1
git push --set-upstream origin users/yourname/revertOfSHA1 #push the changes to remote

PR für die Branche users/yourname/revertOfSHA1 erstellen

  1. Erstellen neuer Zweig an begehen vor dem ursprünglichen merge - nennen es es entwickeln-base '
  2. führen interaktive rebase von ‚entwickeln‘ auf `entwickeln Basis" (auch wenn es bereits oben ist). Während der interaktiven Unterfütterungsmaterial, werden Sie die Möglichkeit haben, zu entfernen sowohl die Zusammenführung verpflichten, und der Commit dass die Zusammenführung umgekehrt, das heißt entfernen Sie beide Ereignisse aus git Geschichte

An diesem Punkt werden Sie ein sauberes haben ‚entwickeln‘ Zweig, zu dem Sie Ihre Funktion Brechen fusionieren können, wie Sie regelmäßig tun.

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