2010-12-21 5 views
3

Mein Master GIT-Zweig scheint einige Fehler zu haben, also würde ich gerne überprüfen, wieder zusammenführen oder möglicherweise meinen dev-Zweig über den Master-Zweig klonen, so dass der Master-Zweig eine Kopie wäre von Dev.GIT Dateien von Dev zu Master neu zusammenführen

Wie kann ich das tun? Thx.

+0

Wenn Sie sagen, der Master-Zweig hat Fehler, was meinst du? Git ist * gut * um Datenverlust zu verhindern, also was ist genau falsch gelaufen? Ein wenig mehr Informationen über genau das, was das Problem ist, wäre hilfreich. Ist "dev" von "Meister" abstammt? Wie verschieden sind sie? –

+0

Hey, ein Freund hat einen Push mit --force gemacht und nun ist der Master-Zweig "Up-to-date", aber die Dateien sind nicht :). Seltsam. – xpepermint

+0

Also haben sie mit einer Arbeitskopie in ein Repo gedrängt? –

Antwort

6

Wenn das Problem ist einfach, dass das ausgelagerte Datei mit dem Zweig nicht übereinstimmen, nur git reset verwendet normalerweise:

git reset --hard HEAD 

Das ist alles was Sie brauchen soll. Wenn Sie Master mit dev überschreiben möchten, lesen Sie weiter.


Wenn Sie Ihr Master-Zweig mit dem Inhalt Ihres dev Zweig zu überschreiben, verwenden Sie git reset etwa so:

$ git checkout master 
$ git reset --hard dev 

Und dann, wenn Sie diese irgendwo schieben wollen anderes:

$ git push origin master 

Beachten Sie, dass, wenn Ihr Dev-Zweig nicht von Ihrem Master-Zweig vorspult (was ich vermute, wird es nicht, da Sie gesagt haben, dass Ihr Master-Zweig einige vermasselte Sachen drin hat), werden Sie muß die --force Flags an dem Push-to-hinzuzufügen auf einem Remote zu überschreiben:

$ git push origin master --force 

Beachten Sie jedoch, dass dies eine Geschichte all normalen Einsprüche neu zu schreiben la git rebase beinhalten kann - wenn jemand diese Fernbedienung verwendet, Sie müssen sich mit dem Gegenstück einer Upstream-Rebase befassen.


Um dieses Problem in Zukunft zu vermeiden, Ihren Freund darauf hinweisen, dass --force mit fast nie notwendig ist. Wenn sie Konflikte bekommen, wenn sie versuchen, git push, sollten sie git pull zuerst, die Konflikte lösen, und dann git push.

+0

Hum ... Fehler: fatal: mehrdeutiges Argument 'dev': sowohl Revision und Dateiname, Verwenden Sie '-', um Dateinamen von Revisionen zu trennen. Ähm ... was soll ich machen :)? – xpepermint

+0

Sie könnten 'git log' verwenden, um die Commit ID des Kopfes von' dev' zu ermitteln und 'git reset --hard ' –

+0

zu verwenden Danke auch an @Cameron Skinner, ich habe es mit git reset --hard {id } und dann git merge dev, git push --force. Danke! – xpepermint

0

Gute Frage. Ich wollte das vor mir selbst tun und ich tat es nie. Meine beste Vermutung könnte sein, das unten zu versuchen. HINWEIS Ich bin mir nicht sicher, wie gut das für Sie funktionieren wird, da ich es nicht selbst gemacht habe.

git checkout master 

git pull origin dev 

git commit -a -m "reverted to dev" 

Dies zu tun, wird wahrscheinlich zu Konflikten führen.

+0

Hey, thx für Ihre Antwort. Es funktioniert nicht. Es funktioniert, aber überschreibt meinen bestehenden Master-Zweig nicht. Das Problem ist, dass ein Freund einen Push mit --force macht und jetzt einige Daten nicht synchronisiert sind. – xpepermint

+1

'git pull' ist äquivalent zu' git fetch' gefolgt von 'git merge'. Da 'git merge' nichts" überschreibt ", ist es in diesem Fall nicht das Richtige. – Amber

+0

@ Amber Ihre Antwort ist am besten. Ich habe vergessen - harter Zweig ich mache es immer nur auf dem aktuellen Zweig. – EnabrenTane

1

Von Sie es bemerkt scheint, gibt es drei mögliche Fälle:

  1. Der Master-Index richtigen Code enthält und die Arbeitskopie ist gebrochen.
  2. Die Arbeitskopie ist in Ordnung und der Index ist jetzt gebrochen.
  3. Beide sind kaputt.

Zuerst alles zurück. Dann:

Im Fall 1, verwenden Sie git reset --hard HEAD, um die defekte Arbeitskopie wegzuwerfen.

In Fall 2, fügen Sie alles in der Arbeitskopie hinzu und übergeben Sie es.

In Fall 3 verwenden Sie git reset --hard dev, um den Index und die Arbeitskopie wegzuwerfen. Alternativ, git reset --hard SOME_COMMIT_ID_THAT_ISN'T_BROKEN

In allen drei Fällen sagen Sie Ihrem Freund, nie --force zu verwenden, es sei denn, sie wissen wirklich, was sie tun.

Auch ist es wahrscheinlich am besten, nicht in ein nicht-bare-Repository (d. H. Eines mit einer Arbeitskopie) zu schieben. Ich würde vorschlagen, dass Sie irgendwo ein bloßes Repository einrichten, an das Sie sowohl drücken als auch ziehen, anstatt direkt in ein Repo zu gehen, das eine Arbeitskopie hat. Verwenden Sie git init --bare, um ein leeres Repo zu erstellen.

Habe ich schon alles erwähnt? Gut. TU es.

+0

Fall 3 mit Commit-ID hat funktioniert. – xpepermint

+0

Großartig! Froh, dass ich helfen konnte :) –