2016-06-29 20 views
3

Ich habe mehrere Commits zu meinem lokalen Zweig estimation gemacht und schob sie auf den Remote-Zweig estimation.Git wieder mehrere commits

Jetzt möchte ich die letzten 3 commits vollständig entfernen.

Ich versuchte git reset HEAD^ und git reset HEAD --hard 3 mal zu tun, aber wenn ich versuchte, die Änderungen zu drücken, klagte es über Spitze des HEAD nicht ausgerichtet.

Wie mache ich das?

EDIT:

Die Geschichte sieht wie folgt aus:

commit e572aab4e18

commit e21e7310bc4

commit 4f372a513da

commit 31a4ac607ae

commit a1a6e3f02dd

würde Ich mag Top 4 und zu entfernen, um commit a1a6e3f02dd und mache sowohl lokalen und Remote-Zweig auf demselben Kopf zurück.

+0

können Sie nach dieser Antwort suchen: http://StackOverflow.com/a/1470452/1475228 –

Antwort

3

Erstens: Sie sollten dies nur tun, für einen Zweig, dem Sie nicht teilen; Wenn die Zweigstelle von anderen Benutzern ausgecheckt wird, werden durch diesen Prozess ihre lokalen Kopien nicht mehr mit der Gegenstelle synchronisiert und sie können nicht mehr nur Commits in den Zweig schieben. Dies kann aussortiert werden, aber es ist möglicherweise ein Durcheinander.

Da, wenn ich Sie richtig verstehe, Sie in dieser Situation sind:

xxxxxxx Bad commit #3 
yyyyyyy Bad commit #2 
zzzzzzz Bad commit #3 
wwwwwww This and everything before it are fine 

Sie wollen entsprechen den Commits nach wwwwwwww und fixieren die Fern Zweig fallen zu lassen.

Als Erstes sichern Sie den Zweig, in dem Sie operieren, so dass Sie ihn wiederherstellen können, wenn Sie Fehler machen, und dann zu dem Zweig zurückkehren, von dem Sie die Commits entfernen möchten.

git checkout -b broken-estimation 
git checkout estimation 

Run git log die SHA1 des ersten finden Sie behalten möchten verpflichten. Sobald Sie das SHA1 haben, setzen Sie den Zweig an, dass:

git reset --hard kkkkkkk 

wo kkkkkk die SHA1 des ersten ist verpflichten Sie auf dem Zweig halten wollen.

Führen Sie erneut git log aus, um sicherzustellen, dass Sie die gewünschte SHA1 als die Spitze dieser Verzweigung haben; Es sollte das erste Commit sein, das Sie in der git log Ausgabe sehen. Wenn Sie die Anzahl der Commits nicht verringert haben, wiederholen Sie die git reset --hard mit dem richtigen SHA1, um weitere Commits zu entfernen.

Wenn Sie zu viele Commits entfernt, stellen Sie die estimation Zweig aus dem Backup Sie nahm:

git checkout -B estimation broken-estimation 

und die git log wiederholen Sie den SHA1 des begehen finden Sie an der Spitze wollen, gefolgt von git reset --hard kkkkkkk (mit kkkkkkk ist die SHA1, die Sie wirklich wollten), um die unerwünschten Commits nach diesem Commit zu löschen.

Sobald Sie den Zweig in den gewünschten Zustand haben, können Sie den festen Zweig auf der Fernbedienung drücken, die alte Version zu ersetzen:

git push -f the_proper_remote estimation 

Sobald Sie sicher sind, dass Ihre Reparaturen korrekt sind, können Sie die Sicherungskopie der Branche löschen:

git branch -d broken-estimation 
+0

Das funktionierte einwandfrei. –

5

Wenn Sie bereits die Commits geschoben (und nicht wollen, eine Kraft-Push zu tun und überschreiben Daten im Remote-Repository, es gibt ein paar Dinge, die Sie tun können):

Sie können git revert anstelle von git reset:

$ git revert ~4..HEAD 

Oder Sie git checkout verwenden können und dann die Änderungen zu übernehmen:

$ git checkout ~3 -- . 
$ git commit 

git revert werden 3 separate Rückzugsverpflichtungen machen. Mit der Methode git checkout können Sie die Änderungen in nur einem einzigen Commit wiederherstellen.

In Ihrem Fall könnten Sie dies tun:

$ git reset --hard $REMOTE/$BRANCH 
$ git checkout a1a6e3f02dd -- . 
$ git commit 
+0

Danke Mipadi. Ich bin etwas verwirrt, also habe ich mehr Informationen zur Verfügung gestellt. Kannst du bitte einen Blick darauf werfen –

+0

@chintans: Meine Antwort aktualisiert. – mipadi

+0

Danke, aber jetzt ist mein Zweig 'a1a6e3f02dd', aber ich möchte nur alle 4 commits komplett entfernen, so dass meine lokale remote brach beide Punkte' a1a6e3f02dd'. –

0

Sie können es in drei Befehle tun:

Zuerst die Geschichte des Fern Zweig umschreiben:

git push origin +a1a6e3f02dd:estimation 

Hinweis: Das "+" bewirkt, dass es sich um einen "Force-Push" handelt. Dieser Befehl sagt "erzwinge a1a6e3f02dd als die Spitze des Ursprungs/Schätzungszweiges".

Sobald das erledigt ist, müssen Sie nur Ihre lokale „Schätzung“ Zweig mit der Fernbedienung ein synchronisiert zu bekommen:

git checkout estimation 
get reset --hard origin/estimation 

Und Sie sind fertig! Aber seien Sie gewarnt: "git reset --hard" wird alle unerlaubten Arbeiten, die Sie in diesem Projekt haben, zunichte machen.

Wenn andere auch mit dem Zweig "Schätzung" arbeiten, und sie haben bereits Ihre 4 "schlechten" Commits in ihre Filialen gezogen, dann wird es ein bisschen Koordinationsschwierigkeiten geben. Aber nach meiner Erfahrung sind alle Warnungen und Ermahnungen über "Geschichte der gemeinsamen Zweige nie neu schreiben" übertrieben. Es sollte neu formuliert werden: nie Geschichte von langlebig Shared Branches schreiben.