2016-05-11 24 views
1

Ich hatte 2 Commits (local) und meine Geschichte war Going: A - B:zurück zum letzten nach einem Softreset zu begehen und ändern

  • In A begeht, wird die Datei myfile_v1.txt
  • In Commit B, mehrere andere Dateien.
  • In meinem Arbeitsverzeichnis, ich die Datei von dem aktualisierten ersten mit einer kleinen Korrektur verpflichten: myfile_v2.txt

ich die Commit A und ersetzen Sie die Datei in seiner neuen Form ändern, um wollte habe eine saubere Geschichte, bevor du etwas schiebst.

Ich tat dies:

  • reset --soft auf A
  • addmyfile_v2.txt
  • commit --amend

Jetzt kann ich sehen, dass meine begehen A die korrigierte Datei in sich hat , aber ich kann nicht herausfinden, wie ich in meinem vorherigen HEAD zurückkommen soll, oder ob das möglich ist, ohne B erneut zu begehen.

Irgendwelche Ideen?

Antwort

1

Ein Commit-Hash enthält den vollständigen Verlauf dieses Commits. Wenn Sie also den Verlauf ändern, gehört der Verlauf nicht mehr zu diesem Commit, aber der Commit muss neu erstellt werden.

Es gibt viele Möglichkeiten, dies zu tun. In Ihrem Fall könnten Sie nur cherry-pickB und alles ist gut.

Wie ich es getan hätte, ist eine interaktive Rebase (rebase -i). Entweder indem zuerst die interaktive Rebase ausgeführt wird, indem die Zeilengruppe von A in edit geändert wird, dann wird das Commit-Ändern durchgeführt und dann wird das Rebasing fortgesetzt. Alternativ erstellen Sie zuerst einen neuen Commit über B und verwenden dann rebase -i zum Neuordnen und squash oder fixup das zweite Commit. Oder sogar mit Auto-Fixup oder Auto-Squash.

+0

Danke! Ich kannte den 'Cherry-Pick'-Befehl nicht, sehr nützlich! Ich werde deine andere Lösung nächstes Mal versuchen. – Ellda

1

Sie können eine vorherige Festschreibung nicht ändern. Jedes Commit ist einzigartig.

Was Sie tun können, ist die Geschichte mit neuen Commits neu zu erstellen. Mit dem Befehl git-rebase

Ich verstehe, dass Sie in diesem Punkt sind jetzt:

Pre_A - A - B 
     \ 
     A1 

Sie haben die "B" verloren Commit. Zur Wiederherstellung der git-reflog

git reflog 

Sie die aktuelle Position der Branche sehen HEAD verwenden begehen. Einer von ihnen ist der B-Commit. Schreibe den Hash vom Anfang der Zeile auf.Beispiel:

git reflog 
    a123b Ammend Commit of Previous A that generates A1 commit 
    b234c git reset soft to A Commit 
    c345d B Commit 
    b234c A Commit ##Look that the HASH is the same that the git-reset## 

Sobald Sie die HASH der B Commit haben. Erstellen Sie eine Verzweigung, um die Festschreibung wiederherzustellen.

git branch tmpBranch c345d 

An diesem Punkt, was Sie brauchen, ist dies stattdessen in „A“ in der neuen Geschichte von „A1“ verpflichten sich setzen zu sein. Sie erhalten dies mit git-rebase

Ich nehme an, dass Sie in Ihrem Master-Zweig gearbeitet haben.

git checkout tmpBranch 
git rebase --onto master tmpBranch~1 tmpBranch 

Dies neu die Geschichte von einer rückwärts von tmpBranch begehen begehen, bis tmpBranch (in Ihrem Fall nur eine verpflichten, die B-Commit) begeht in Master (dh Punkte auf A1 begehen).

+0

Das ist ein bisschen der lange Weg herum. Upvoted für die Empfehlung, Reflog zu verwenden, und das Zeigen einer temporären Verzweigung auf ein Commit ist im Allgemeinen ein nützlicher Trick, also wäre es besser, eine größere Anzahl von Commits wiederherzustellen. Für nur ein Commit wird ein einfaches Cherry-Pick jedoch einfacher. – torek

+0

Ich habe es mit einem Cherry-Pick gelöst, aber danke für die nützlichen Informationen! – Ellda

+0

Sie haben Recht. Dieser Fall ist eine einfachere Lösung für die Kirschentnahme als meine. Ich konzentriere mich auf den Teil von 'git-reflog', weil ich verstanden habe, dass es das B-Commit" verloren "hatte. – blashser