2010-11-25 16 views
44

Zunächst ist Git saugt. Ich weiß, ich weiß, es sollte die beste Sache seit geschnittenem Brot sein, aber es ist scheiße. Es ist wie wenn man versucht, sich mit einer Kettensäge zu rasieren: ein kleiner Fehler und überall sind Blut und Zähne. Vielleicht, wenn ich tatsächlich eine genaue Unterscheidung zwischen einem Kopf, einem Ref, einem Commit, einem Ast, einem Stengel, einem Gnargel und einem Whizpoo machen könnte, könnte das etwas einfacher sein, aber für einen normalen Sterblichen mit nur 10 Jahren Erfahrung von SVN, Perforce und RCS, sieht alles wie ziemlich launisch schwarze Magie aus.Einen schlechten Pull rückgängig machen

Jetzt aus irgendeinem Grund hat git pull nie für mich gearbeitet. Ich bekomme eine 10-Zeilen-Fehlermeldung, die bisher so hilfreich war wie das Wort "error". Das googeln der Fehlermeldung erzeugte eine breite Palette von Vorschlägen, die nur gemeinsam hatten, dass sie keinerlei sichtbare Auswirkungen hatten. Aber das ist nicht das Problem von heute: Ich habe mich daran gewöhnt, git pull origin branch einzugeben.

Heute blätterte ich zwischen zwei Zweigen hin und her, "Master" und "Lounge" und im Moment war ich in der Meisterbranche. Ich wollte die letzten Änderungen vom Remote-Repository zum lokalen abrufen, aber ich habe mich vertippt. Anstatt zu schreiben git pull origin master, schrieb ich git pull origin lounge und dann, ohne zu denken, in den richtigen Befehl eingegeben.

Es gibt keinen Beweis für den ersten (sehr schlecht) in log ziehen, nur zwei Merges vom Master:

commit 0c6be9569bab0581244ea8603bf2edfee82cdd7b 
Merge: 43fdec5... db09f0d... 
Author: Malvolio <[email protected]> 
Date: Wed Nov 24 20:38:58 2010 -0500 

Merge branch 'master' of github.com:xcompanyx/xRepositoryX 

commit db09f0d79d744d6a354142041b47ff5d748999f3 
Merge: 81b6c3d... fc73e25... 
Author: Malvolio <[email protected]> 
Date: Wed Nov 24 17:38:16 2010 -0800 

Merge branch 'master' of github.com:xcompanyx/xRepositoryX 

commit 81b6c3d04b7c464f8750a56282635526a5ef83a1 
Author: Michael <[email protected]> 
Date: Wed Nov 24 17:38:07 2010 -0800 
    the last commit I did 

Aber Dateien neu in der Lounge Zweig erstellt gibt es in meinem Repository.

So, jetzt bin ich fertig, oder? Soll ich einfach mein Repository anzünden, die Fernbedienung erneut klonen, alle nicht gedrückten Änderungen manuell anwenden und es auf Git ansaugen lassen oder gibt es eine Beschwörung, die ich rezitieren kann, um alles besser zu machen? Würde es helfen, wenn ich eine Ziege opferte?

+15

@Robert - Aber dann würde ich nicht so ein nettes Lachen bekommen. –

+0

Und zu dem ursprünglichen Problem, ich entschied mich, mit der Möglichkeit zu experimentieren, wenn es sagte "Merge branch 'master" "es bedeutete wirklich" Zusammengeführt [einige unbekannte und ungenannte] Zweig [mit dem aktuellen Zweig, der, wie Sie wissen, ist genannt] 'Meister' ". Ich habe einen harten Reset auf 81b6 versucht. Das schien zu funktionieren (obwohl, seltsamerweise, der nächste Zug vom Ursprung abgerufen einige Dateien geändert viel früher), aber wie bei allem Ding Git, muss ich nur meine Daumen drücken. – Malvolio

+7

Ich würde gerne versuchen, Ihnen zu helfen, aber Sie haben die Hälfte Ihrer Post angegriffen die SCM Sie fragen, wie zu verwenden, und versäumt, tatsächlich genug Informationen zur Beantwortung Ihrer Frage bereitzustellen. Willst du wirklich Hilfe oder einfach nur schimpfen? – Cascabel

Antwort

36

Verwenden Sie git reflog, um zu sehen, worauf Ihr Kopf zeigte, bevor Sie es vermasselt haben.

48ab8d [email protected]{0}: pull: Fast-forward 
a34bda [email protected]{5}: commit: my last commit message 

Nun zeigen Sie Ihre Master-Zweig zurück auf den Commit vor dem schlechten Zug:

Sie sollten so etwas wie sehen

git reset --hard a34bda

Fertig. Als wäre es nie passiert.

+7

re-flog? Hört sich gruselig an. – Piskvor

+0

Danke, ich muss Reflog mehr untersuchen, aber ja, "Reset" schien definitiv den Trick zu machen. Ich bin immer noch neugierig auf die Art, wie es im Protokoll aussieht, aber die Art, wie es auf der Festplatte aussieht, ist korrekt. Und @Piskvor: Ich habe es auch beim ersten Mal als Re-Flog gelesen. Was sagt das über uns aus? – Malvolio

+0

'git reflog' ist der Befehl, den Sie verwenden, wenn' git' die Seele aus Ihnen herausgeschlagen hat und Sie Ihr Problem immer noch nicht gelöst haben. Just 'git reflog' und genießen Sie eine weitere Woche von dem Werkzeug, das Ihr Leben leichter machen soll, über den Kopf geschlagen werden. Es ist wirklich die einzige gute Nomenklatur im gesamten Befehlssatz dieser POS-Software. * "Danke, Git! Darf ich noch einen Fehler haben!" * – AJB

6

Ich kann Ihre Geschichte nicht vollständig aus Ihrer Frage verstehen, aber im Allgemeinen, wenn Sie zwei Zusammenführungen machen (ein Pull ist eine Zusammenführung), ist es ganz einfach, eine von ihnen zu entfernen.

- o - o - o - A - M1 - M2 (master) 
       //
     - o - o - o / (origin/lounge) 
        /
      - o - o (origin/master) 

Der offensichtlichste Weg:

git checkout master 
git reset --hard A 
git merge origin/master 

Dies verwendet Ihre lokal gespeicherte Version des Master-Ursprung, wenn Sie zusammenführen möchten, was jetzt da draußen ist, verwenden Sie git pull origin master.

Verwandte Themen