web-dev-qa-db-de.com

Ich muss ein "mittleres" Commit in meinem Master-Zweig auftauchen und wegschmeißen. Wie kann ich es tun?

In der folgenden Master-Verzweigung muss ich beispielsweise nur das Commit af5c7bf16e6f04321f966b4231371b21475bc4da verwerfen, das aufgrund der vorherigen Zurücksetzung das zweite ist:

commit 60b413512e616997c8b929012cf9ca56bf5c9113
Author: Luca G. Soave <[email protected]>
Date:   Tue Apr 12 23:50:15 2011 +0200

    add generic config/initializers/omniauth.example.rb

commit af5c7bf16e6f04321f966b4231371b21475bc4da
Author: Luca G. Soave <[email protected]>
Date:   Fri Apr 22 00:15:50 2011 +0200

    show github user info if logged

commit e6523efada4d75084e81971c4dc2aec621d45530
Author: Luca G. Soave <[email protected]>
Date:   Fri Apr 22 17:20:48 2011 +0200

    add multiple .container at blueprint layout

commit 414ceffc40ea4ac36ca68e6dd0a9ee97e73dee22
Author: Luca G. Soave <[email protected]>
Date:   Thu Apr 21 19:55:57 2011 +0200

    add %h1 Fantastic Logo + .right for 'Sign in with Github'

Ich muss bleiben

  • das erste Commit 60b413512e616997c8b929012cf9ca56bf5c9113,
  • das dritte Commit e6523efada4d75084e81971c4dc2aec621d45530 und
  • das letzte Commit 414ceffc40ea4ac36ca68e6dd0a9ee97e73dee22

"wegwerfen" nur das zweite Commit af5c7bf16e6f04321f966b4231371b21475bc4da

Wie kann ich das machen? Danke im Voraus Luca

86
BBJ3

Rebase oder Revert sind die Optionen. Durch einen Neustart wird das Commit tatsächlich aus dem Verlauf entfernt, sodass es so aussieht, als hätte es das zweite Commit nie gegeben. Dies ist ein Problem, wenn Sie den Master-Zweig auf andere Repos verschoben haben. Wenn Sie in diesem Fall versuchen, nach einem Rebase zu pushen, erhalten Sie von git den Fehler , Zusammenführungen ohne schnellen Vorlauf abzulehnen .

Zurücksetzen ist die richtige Lösung, wenn die Filiale mit anderen Repos geteilt wurde. git revert af5c7bf16 führt ein neues Commit durch, bei dem die von af5c7bf16 eingeführten Änderungen einfach rückgängig gemacht werden. Auf diese Weise wird die Historie nicht neu geschrieben, Sie führen eine eindeutige Aufzeichnung des Fehlers und andere Repos akzeptieren den Push.

Hier ist ein guter Weg, um zu löschen: git rebase -i <commit>^ Damit gelangen Sie zum Commit direkt vor dem zu entfernenden Commit. Der interaktive Editor zeigt Ihnen eine Liste aller Festschreibungen bis zu diesem Punkt. Sie können auswählen, quetschen usw. In diesem Fall entfernen Sie die Zeile für das Commit, das Sie löschen und die Datei speichern möchten. Rebase beendet seine Arbeit.

91
JCotton

Wenn Rebase eine Option ist, können Sie Rebase ausführen und es einfach fallen lassen:

$ git rebase -i 414ceffc^

Wenn Rebase keine Option ist, können Sie es einfach zurücksetzen:

$ git revert af5c7bf16
30
mipadi

Trotz aller Anerkennung, die die ursprünglichen Antworten hier erhalten haben, habe ich sie nicht ganz gefunden, um die Frage zufriedenstellend zu beantworten. Wenn Sie sich in einer Situation befinden, in der Sie ein Commit oder eine Sammlung von Commits aus der Mitte des Verlaufs entfernen müssen, empfehle ich Folgendes:

  • Erstellen Sie einen neuen Zweig neben dem Zweig, der alle Commits enthält, und wechseln Sie zu diesem Zweig.
  • Setzen Sie den neuen Zweig wieder auf den Punkt zurück, an dem Sie eine neue Basis erstellen möchten.
  • Dann (hier ist der entscheidende Punkt) wählen Sie die nachfolgenden Festschreibungen, die Sie tatsächlich anwenden möchten, danach aus dem ursprünglichen Zweig in den neuen Zweig und überspringen Sie die Commits, die Sie nicht mehr möchten (dh die, die Sie löschen).
  • Benennen Sie den ursprünglichen Zweig auf Wunsch in einen alten Code um, und benennen Sie den neuen Zweig in den ursprünglichen Zweig um.
  • Übertragen Sie Ihre Änderungen schließlich auf Ihr Remote-Repo (falls eines verwendet wird). Sie müssen wahrscheinlich einen "erzwungenen Push" verwenden. Wenn Ihre Mitarbeiter Probleme beim Abrufen der Revisionen haben, ist es für sie möglicherweise am einfachsten, das Repo erneut von der Remote-Quelle zu klonen. Auf die eine oder andere Weise werden Sie wahrscheinlich mit ihnen sprechen wollen, wenn Sie sowieso Commits aus der Mitte Ihrer Geschichte herausreißen!

Hier einige Informationen zu Cherry Picking: Was bedeutet Cherry Picking für ein Commit mit git?

Hier ist einiges darüber, wie man es mit Tortoise Git macht (wie ich es gerade getan habe). Es ist definitiv einfacher, ein GUI-Dienstprogramm für diese Art von Operationen zu verwenden! Kirschpickel mit TortoiseGit

26
BuvinJ