2013-09-02 16 views
6

Ich habe zwei Folge-Commits, irgendwo in der lokalen Geschichte, und eine Datei wurde fälschlicherweise in der zweiten hinzugefügt. Ich möchte die Situation beheben.Verschieben von Dateien zwischen den Commits

Ich verstehe nicht, wie ich die interaktive Rebase verwenden soll. Ich habe git rebase -i HEAD~10 und ausgewählt, um das Commit mit Datei zu bearbeiten, um es von dort aus zu überprüfen. Ich benutze git guit aber sehe keine Dateien im commit Bereich. Ich kann wählen, das vorherige Commit zu ändern, dann sehe ich die Dateien. Aber ich kann die fehlplatzierte Datei nicht zu dem vorherigen Commit hinzufügen, da ich die Datei im aktuellen Commit nicht sehen kann.

+0

Beachten Sie, dass das Ändern eines früheren Commits den Verlauf neu schreibt und Sie seit dem Commit völlig neue Hashes erhalten.Tun Sie das nicht, wenn das Commit bereits veröffentlicht wurde. – aragaer

+0

@aragaer Ich habe absichtlich festgelegt, dass ich die _LOCAL_ Geschichte neu schreibe. – Val

Antwort

8

Wenn ich nicht bekommen es falsch, was Sie wollen, ist eine Änderung bewegen, das inbegriffen war 2 zu begehen zu begehen 1.

ich die einfachste Weg finden, das zu tun ist, zwei aufeinanderfolgende interaktive Rebases tun.

In der ersten, teilen Sie Commit 2 in zwei Commits: der erste enthält nur die Änderung, die Sie verschieben möchten, und die zweite einschließlich aller anderen. Wir haben jetzt 1, 2.1 und 2.2 festgelegt.

Dann rebase Sie wieder, und dieses Mal wählen zu 2.1 in 1.

16

Wählen Sie also beim Rebasieren sowohl das Commit, bei dem Sie die Datei versehentlich hinzugefügt haben, als auch das, zu dem Sie die Datei in dieser Reihenfolge hinzufügen möchten. Wenn sich die Datei in einem späteren Commit befindet, aber in einem früheren Commit sein sollte, müssen Sie die Zeilen neu anordnen. Zum Beispiel beginne ich mit

pick 8de731b Commit with missing file. 
pick bbef925 Commit with too many files. 
pick 52490ce More history. 

muss ich es, zu

Dann

# In the commit containing an extra file 
git reset HEAD^ badfile.c 
git commit --amend 
git rebase --continue 

# Now in the commit to add it to 
git add badfile.c 
git commit --amend 
git rebase --continue 

Leider

edit bbef925 Commit with too many files. 
edit 8de731b Commit with missing file. 
pick 52490ce More history. 

ändern, wenn in einem Zweig Geschichte bearbeiten, weiß ich nicht, von Jede Möglichkeit, den Verlauf in allen Zweigen zu vermeiden. Rebasing sollte so früh wie möglich durchgeführt werden, um Probleme wie diese zu vermeiden. In meinem einfachen Fall hier, kann ich fusionieren Master und den anderen Zweig, aber die Commits nicht fusionieren, dann muss ich in Master rebase und neu anordnen und die Festschreibungen zerquetschen, wie folgt aus:

pick 7cd915f Commit with missing file. 
fixup 8de731b Commit with missing file. #This was the higher of the two entries 
pick 8b92c5a Commit with too many files. 
fixup bbef925 Commit with too many files. #This was the higher of the two entries 
pick 94c3f7f More history. 
fixup 52490ce More history. #This was the higher of the two entries 

Spät edit: Ich habe gerade bemerkt, dass ich versehentlich die Commit-Geschichte als eine Übertragung von meiner ursprünglichen Antwort neu geordnet habe. Wenn Sie die Zeilen in der Rebase austauschen, ändert sich die Reihenfolge, die Sie festlegen. Nach der Bearbeitung können Sie erneut eine Rebase durchführen und sie zurückstellen, um zur ursprünglichen Commit-Reihenfolge zurückzukehren.

+0

Das Badfile wurde später hinzugefügt, anstatt zu früh. Sagst du, dass ich einen neuen Zweig an der Schwelle der Geschichte schaffen sollte? – Val

+0

Ich habe es geschafft, die Datei in den neuen Zweig zu verschieben, der oben einen zweiten Commit hatte. Aber ich habe jetzt ein Problem, die ganze Geschichte auf den Zweig zu bringen. Es scheint, dass zwei Commits des Hauptkonflikts mit den beiden Commits der neuen Branche. – Val

+0

Ich habe die Antwort aktualisiert, aber leider ist der einzige Weg, den ich kenne, um dies zu beheben, die Geschichte in allen Zweigen auf die eine oder andere Weise zu bearbeiten. – dwarduk

5

begehen Squash Wie ich oft auf dieses Problem stoßen, schrieb ich ein Drehbuch für diese. Es funktioniert vollautomatisch. Sie finden es unter Github. Kopieren Sie sie in das lokale Dateisystem, fügen Sie PATH und Sie werden in der Lage es zu laufen:

mv-changes <source-commit> <destination-commit> <path>... 

Sie können auch das Skript in Git-Bash-Shell auf Windows laufen.

Beachten Sie, dass, wenn es Veränderungen von <path> in Zwischen Commits zwischen source-commit und destination-commit, es wird nicht funktionieren.

Weitere Einzelheiten sind here.

+0

Es funktioniert nicht wirklich vollautomatisch, da es den Editor öffnet, aber es ist großartig. Vielen Dank.. – Hunsu

Verwandte Themen