2017-07-03 2 views
2

Ich arbeite an einem Zweig und ich habe ein paar Commits gemacht, in der ersten Commit hatte ich eine Schnittstelle geändert, um eine neue Methode hinzuzufügen und änderte dann auch die Implementierungsklasse.git: Dateien von einem älteren Commit entfernen

Ich habe seit einer vorhandenen Methode in der Codebasis gefunden, die ziemlich genau das tut, was ich will, also möchte ich die Dateien in der ersten Festschreibung überprüfen.

Ich habe nur Dateien in der vorherigen Commit vor, so dass ich nicht sicher bin, wie dies zu tun, in der Vergangenheit hatte ich die Dateien ausgecheckt, die ich von einem älteren Commit entfernen wollte, aber das eine neue Festschreibung erstellt und auch gemeint Die Datei wurde im Tiegel als Teil der Code-Überprüfung angezeigt, aber ohne Änderungen daran.

Kann mir jemand bitte erklären, wie man das macht?

Antwort

1

Wenn Sie nicht möchten, dass die Dateien geändert (und dann wieder geändert) werden, um Teil des Verlaufs zu sein, müssen Sie einen Verlauf neu schreiben. Wenn die fraglichen Commits gepusht (und möglicherweise mit anderen Devs geteilt) wurden, sind die durch das Neuschreiben entstandenen Probleme wahrscheinlich schlimmer als die oben beschriebenen Probleme, die Sie vermeiden möchten.

Der einfachste Weg, dies zu tun ist mit einer interaktiven Rebase. Wenn Sie

... A --- B --- C --- D <--(current_branch) 

wo current_branch haben ist, was Zweig Sie gerade arbeiten, und B ist der Commit, in dem Sie die Methode hinzugefügt haben, können Sie sagen

git rebase -i A current_branch 

(ersetzt A mit dem SHA-ID des entsprechenden Commits). Dies bringt einen Texteditor mit einer TODO-Liste hervor, wobei jede Zeile ein Commit darstellt.

Suchen Sie den Befehl für B (es sollte die erste Zeile sein). Wenn die nur Sache in der Festschreibung die Änderung ist, die Sie zurücksetzen möchten, löschen Sie die Zeile. Andernfalls ändern Sie das erste Wort in der Zeile von "Auswählen" zu "Bearbeiten".

Dann speichern und beenden Sie den Editor. Folgen Sie nun den Anweisungen. Wenn Sie gesagt haben, dass Sie B bearbeiten sollen, erhalten Sie eine Aufforderung, Ihre Änderungen vorzunehmen. So stellen Sie die fraglichen Dateien wieder her. Wenn das Entfernen von Änderungen aus B Konflikte verursacht, werden Sie aufgefordert, diese Konflikte zu lösen.

Schließlich erhalten Sie ein erfolgreiches Fütterungsmaterial, aber wichtig zu beachten: IF current_branch zuvor geschoben worden war, dann jetzt Sie

haben
... A --- B --- C --- D <--(origin/current_branch) 
    \ 
     B' --- C' --- D' <--(current_branch) 

Wenn Sie drücken versuchen, wird git beschweren (weil das Update auf current_branch würde nicht ein Schnellvorlauf sein). Und wenn Sie den Push erzwingen, müssen alle anderen, die den Zweig benutzen, sich jetzt von einer "Upstream-Rebase" erholen (siehe git rebase Dokumente unter "Recovery von Upstream-Rebase").

Wenn ich sage, dass Sie sich mit den anderen Repo-Benutzern abstimmen müssen, richte ich Sie nicht an, nett zu sein; Ich warne Sie, dass Ihre Arbeit rückgängig gemacht wird, wenn Sie dies nicht tun und sie den daraus resultierenden Wiederherstellungsprozess falsch handhaben.

+0

Dank Mark, ich bin die einzige Person, die zu diesem Feature-Zweig beiträgt, und ich habe nur 4 meiner eigenen Commits darauf, und die fraglichen Dateien wurden nur beim ersten Commit geändert, also sollte es hoffentlich folgen. – berimbolo

+0

Ich habe dies erfolgreich mit einer Kombination von Git-Reset und Git-Checkout im interaktiven Rebase-Modus arbeiten, dann mit git commit --amend und schließlich Git Rebase - weiter. Vielen Dank für die Hilfe! – berimbolo

Verwandte Themen