4212 Stimmen

Löschen von Übertragungen aus einem Zweig in Git

Ich würde gerne wissen, wie ich eine Übertragung löschen kann.

Unter delete Ich meine, dass es so ist, als ob ich diesen Commit nicht gemacht hätte, und wenn ich in Zukunft einen Push mache, werden meine Änderungen nicht in den entfernten Zweig gepusht.

Ich habe die Git-Hilfe gelesen und denke, dass ich den folgenden Befehl verwenden sollte git reset --hard HEAD . Ist dies korrekt?

64 Stimmen

Ich denke, das ist no ein Duplikat von Git letzte Übergabe rückgängig machen da er fragt, wie er löschen soll cualquier von einem Zweig übertragen. Ich denke auch, dass keine der Antworten auf diese Frage eingeht. Sie alle spulen die letzten Commits zurück, nicht cherry-pick y delete eine einzelne Übergabe, die vielleicht schon eine Weile zurückliegt.

22 Stimmen

@Chris, die Antwort mit git rebase -i HEAD~10 geht auf diese Frage ein, da es Ihnen erlaubt, die zu löschenden Commits willkürlich auszuwählen. Git wendet die Commits in dem von Ihnen angegebenen Bereich einzeln an und ignoriert dabei Commits, die Sie aus dem Protokoll entfernt haben. Ich habe diesen Befehl heute verwendet, um die zweit- und drittjüngsten Commits in meinem Repo zu löschen, während ich den obersten beibehalten habe. Ich stimme zu, dass keine der anderen Antworten zufriedenstellend ist.

0 Stimmen

@MST ja, ich hätte sagen sollen, dass keine der Optionen in der akzeptierten Antwort auf diese Frage eingeht, aber Sie haben absolut Recht - dieser Befehl scheint zu funktionieren

13voto

Frank Punkte 1051

Hier stelle ich nur eine klare Pipeline zur Verfügung, um dies zu tun

Schritt 1: Verwenden Sie git log, um die Commit-ID zu ermitteln.

git log

enter image description here

Schritt 2: Verwenden Sie git reset, um zur vorherigen Version zurückzukehren:

git reset --hard <your commit id>

11voto

Paulo Fidalgo Punkte 20626

Wenn Sie die Historie beibehalten wollen, die den Commit und den Revert zeigt, sollten Sie verwenden:

git revert GIT_COMMIT_HASH

geben Sie die Nachricht ein, in der Sie erklären, warum Sie zurückgehen, und dann:

git push  

Wenn Sie eine git log sehen Sie sowohl die "falschen" Commit- als auch Revert-Protokollmeldungen.

1 Stimmen

Ja, aber der Auftraggeber hat deutlich gemacht, dass er das nicht will.

11voto

Angelo Borsotti Punkte 317

Alle oben genannten Befehle stellen den Zustand des Arbeitsbaums und des Indexes wieder her, wie sie vor der Übergabe waren, nicht aber den Zustand des Repositorys. Der "entfernte" Commit ist nicht wirklich entfernt, er ist nur nicht derjenige, der an der Spitze des aktuellen Zweigs steht.

Ich denke, dass es keine Möglichkeit gibt, eine Übergabe mit Porzellanbefehle . Die einzige Möglichkeit ist, sie aus dem Protokoll zu entfernen und neu zu protokollieren und dann eine git prune --expire -now .

3 Stimmen

Die Reihenfolge, in der die Antworten auf StackOverflow angezeigt werden, ist nicht festgelegt. Bitte beziehen Sie sich nicht auf "All the commands above". Machen Sie Ihre eigene Antwort in sich geschlossen.

1 Stimmen

Diese Antwort ist nicht ganz richtig. git prune ist eigentlich einer der "Porzellan"-Befehle . Außerdem ist es selten, dass Sie Ihr Reflog komplett löschen wollen (ein Anwendungsfall ist das Entfernen von sensiblen Informationen aus Ihrem Projektarchiv, aber wie ich schon sagte, ist das ein seltener Anwendungsfall). Meistens werden Sie alte Commits im Reflog behalten wollen, für den Fall, dass Sie Daten wiederherstellen müssen. Siehe Pro Git: 9.7 Git Internals - Wartung und Datenwiederherstellung .

10voto

CommaToast Punkte 10365

Hier ist eine weitere Möglichkeit, dies zu tun:

Checken Sie den Zweig aus, den Sie rückgängig machen wollen, und setzen Sie dann Ihre lokale Arbeitskopie auf den Commit zurück, der der letzte auf dem entfernten Server sein soll (alles, was danach kommt, wird sich verabschieden). Um dies zu tun, klicke ich in SourceTree mit der rechten Maustaste auf den und wähle "Reset BRANCHNAME to this commit". Ich glaube die Befehlszeile lautet:

git reset --hard COMMIT_ID

Da Sie gerade Ihren Zweig aus der Ferne ausgecheckt haben, werden Sie keine lokalen Änderungen haben, die Sie verlieren könnten. Diese würden aber verloren gehen, wenn Sie sie hätten.

Wechseln Sie dann in das lokale Verzeichnis Ihres Repositorys und führen Sie diesen Befehl aus:

git -c diff.mnemonicprefix=false -c core.quotepath=false \
push -v -f --tags REPOSITORY_NAME BRANCHNAME:BRANCHNAME

Dies löscht alle Übertragungen nach der aktuellen in Ihrem lokalen Repository, aber nur für diesen einen Zweig.

9voto

Leo Punkte 9091

Der Fehler:

I git rebase -i --root Ich habe meinen Zweig umgeschrieben, weil ich dachte, ich könnte den ersten Commit umschreiben, der sich vom Master unterscheidet (der GitHub für Windows Standardansicht ist der Vergleich mit dem Master, der die Gesamtheit der Daten verbirgt).

Ich habe mir einen Silicon-Valley-Bart wachsen lassen, während sich 900+ Commits in Sublime geladen haben. Als ich das Projekt ohne Änderungen beendete, lud ich meinen Akku auf und rasierte mich, während alle 900+ individuellen Commits nonchalant rebased wurden und ihre Commit-Zeiten auf jetzt zurückgesetzt wurden.

Entschlossen, Git zu schlagen und die Originalzeiten zu bewahren, löschte ich dieses lokale Repository und klonte es erneut aus dem Remote-Repository.

Nun hatte es eine letzte nicht benötigte Übergabe an den Master hinzugefügt, die ich entfernen wollte, also ging ich so vor.

Ausschöpfung der Möglichkeiten:

Ich wollte nicht, dass git revert - würde ein zusätzlicher Commit erstellt, wodurch Git die Oberhand gewinnen würde.

git reset --hard HEAD hat nichts bewirkt, nachdem ich die reflog der letzte und einzige HEAD war der Klon - Git gewinnt.

Um die neueste SHA zu erhalten, habe ich das Remote-Repository auf github.com überprüft - ein kleiner Erfolg.

Nachdenken git reset --hard <SHA> funktioniert hatte, aktualisierte ich einen anderen Zweig auf Master und 1... 2... puff! war der Commit wieder da - Git gewinnt.

Zurück zum Master, Zeit zum Ausprobieren git rebase -i <SHA> und entfernen Sie dann die Linie... leider ohne Erfolg. " Wenn Sie hier eine Zeile entfernen, wird diese Verbindung verloren gehen. ". Ah...neue Funktion beschönigt den N00b trollen im 2.8.3 Versionshinweise .

Die Lösung:

git rebase -i <SHA> dann d, drop = remove commit .

Um das zu überprüfen, habe ich in einen anderen Zweig ausgecheckt, und voila - kein versteckter Commit zum Holen/Pullen vom Master.

https://twitter.com/holman/status/706006896273063936

Ich wünsche Ihnen einen guten Tag.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X