2011-01-07 4 views
2

Ich habe 2 Commits (A und B) in ein neues Commit (C) gequetscht. Die vorherigen zwei Commits (A und B) wurden entfernt. Ich habe diese Commits von meinem Entwicklungsrepo auf ein zentrales (nacktes) Repository übertragen. Die git-log auf beiden Repos bestätigt, dass die Commits A und B entfernt wurden. Das Problem ist, wenn ich an einem dritten Repository ziehe, das bereits (A und B) hatte, hat es jetzt alle drei Commits (A, B und C).Git Repository ist nach der Rebase nicht mehr synchron

Ich hätte gedacht, dass der Zug diese Änderungen synchronisieren würde. Muss ich A ~ 1 auschecken und dann die neuen Änderungen zusammenführen? Dies scheint vor allem in einer Produktionsumgebung mühsam zu sein.

+2

Es wird generell empfohlen, dass git-rebase nur für Code verwendet wird, der aus genau diesem Grund nicht mit anderen Repositories geteilt wurde. Ich kann nicht erklären, warum, aber es wird Sinn machen, wenn Sie "Git von unten nach oben" lesen –

+0

[Wie kann ich wiederherstellen/resynchronisieren, nachdem jemand eine Rebase oder einen Reset auf eine veröffentlichte Branche drückt?] (Http: // stackoverflow.com/questions/4084868/how-do-i-recover-resynchronise-after-someone-pushes-a-rebase-or-reset-to-a-publ) –

Antwort

7

Dies ist meist in "Recovering from upstream rebase" abgedeckt, aber es ist ein bisschen für meinen Geschmack verschleiert.

Sie sollten wissen, dass git pull origin master genau gleich git fetch master; git merge origin/master ist. Mit anderen Worten, Sie haben Git gebeten, B und C zusammenzuführen. Es gibt einen Grund, warum es nicht ratsam ist, Änderungen, die bereits veröffentlicht wurden, erneut zuzulassen: weil es ziemlich einfach ist, die alten Commits wieder aufleben zu lassen.

Da dies ein einfacher Squash war, wird git pull --rebase in der Lage sein, dies herauszufinden. Setzen Sie den Wert an die Stelle, an der Sie sich vor dem fehlerhaften Zusammenführen befanden, und sagen Sie (oder git rebase origin/master, da Sie bereits abgerufen haben). Dies wird magisch A, B, und alle späteren Commits auf C, und es wird bemerken, dass A + B = C.

Sie möchten vielleicht dies zu den Standard, wie Sie Messes wie dies vermeiden können - Set-Konfiguration branch.<name>.rebase zu wahr.

+0

Arbeitete super danke. 'Zuerst spulst du den Kopf auf, um deine Arbeit darüber zu wiederholen ...' Der Config-Tipp ist auch sehr gut. Ich bin immer davon beeindruckt, wie mächtig Git ist. – Keyo