2009-02-24 18 views
24

Ich habe die Git/Git-Svn Lernkurve gekämpft und letzte Nacht, als Teil dieser Lernkurve, habe ich etwas sehr, sehr schlecht. Ich habe es seitdem korrigiert, aber ich hoffe, den Fehler meiner Wege zu verstehen.Verwenden von Git-Svn: Pull, Merge oder Rebase?

Ich habe ein SVN-Repository, aus dem ich den Stamm und Zweige geklont habe (Tags habe ich ignoriert, da wir nicht an denen arbeiten). Mit git, habe ich Ortsvereine für jeden der Zweige, die ich brauche zur Zeit, mit zu arbeiten:

$ git checkout -b trunk svn/trunk 
$ git checkout -b feature1 svn/branches/development/feature1 
$ git checkout -b maint svn/branches/maintenance/previous-version 

Ich habe feature1 meiner aktiven Zweig und machte ein paar Änderungen vor für ein paar Tage weg gezogen zu werden. Ich kam gestern zurück, wollte Änderungen am Kofferraum integrieren, so dass ich mit den neuesten und besten arbeiten konnte. Was ich getan habe, war ein komplettes Update aller Brances zuerst, über Git Svn Rebase (niemand sonst hatte auf der Feature1 Zweig gearbeitet). Mit allem, was von meinem SVN-Repository aktualisiert wurde, habe ich versucht, einen Rebase durchzuführen.

Mit feature1 als meine aktive Branche, ich habe eine "git Rebase Stamm" denken, dass ich Änderungen aus dem Stamm in die Feature1 Zweig ziehen würde. Es stellte sich heraus, dass ich sehr, sehr falsch lag. Nach dem Zusammenführen aller Konflikte, habe ich eine git svn dcommit und festgestellt, dass meine Änderungen auf den Stamm angewendet wurden.

Meine erste Frage ist einfach, wo war der Kernfehler in meinem Gedankenprozess? Meine zweite ist, nach viel Lesen und Googeln, sehe ich Menschen, die sich an Zügen, Zusammenführungen und Rebases beteiligen. Angesichts der Tatsache, dass ich die Änderungen in einem lokalen Zweig auf einen anderen lokalen Zweig zusammengeführt haben möchte, was sollte ich ich getan haben? Was ist die beste Vorgehensweise für dieses Szenario?

Danke für Ihre Hilfe.

Antwort

16

Das Problem, das Sie gefunden haben, ist, dass die Befehlszeilensyntax für Rebase nicht Ihren (sehr vernünftigen, IMO) Erwartungen entspricht.

$ git checkout feature1 
$ git rebase trunk 

Diese Sequenz fügt der ungeteilte feature1 auf den Kopf Stamm verpflichtet, und Sie erwarten, dass es der neue Stamm verpflichtet auf den Kopf feature1 platzieren würde. Die Syntax macht tatsächlich Sinn, wenn Sie wissen, wie das Datenmodell von Git implementiert ist (was zweifellos auch der Grund ist, warum es so ist). Aber für mich ist es das Gegenteil von dem, was ich erwarte, funktional. Es ist am besten, es als ein willkürliches Konstrukt zu lernen und nicht zu versuchen, Erwartungen zu haben.

Sie haben recht, dass Sie verstehen, wie Sie mit dem SVN Repo mit git-svn interagieren. Ignoriere also, was du beim Googlen über Push and Pull und Merge gefunden hast - es gibt eine Menge fast richtiger Diskussionen von Leuten, die so tun, als ob Push und Pull und Merge in git und svn gleich sind. Fast richtig ist immer noch falsch.

+0

Sie haben Recht, dass ich mit der Implementierung des Datenmodells nicht vertraut bin (haben Sie irgendwelche guten URIs?). Wenn ich meine Rebase-Anweisung lesen sollte, sollte ich es als "git rebase [* von * aktiver Zweig * zu *] trunk" lesen oder ist das sogar zu einschränkend? Vielen Dank. –

+0

* Git von unten nach oben * (http://www.newartisans.com/blog_assets/git.from.bottom.up.pdf) und * Git Internals * (http://peepcode.com/products/git-internals -pdf) sind beide sehr gut für das Verständnis der Git-Struktur. (Git Internals kostet $ 9; ich empfehle den Screencast auf Git nicht auf der gleichen Seite). – Paul

+0

Das ist eine gute Lektüre des Befehls. Es fällt mir schwer, mich daran zu erinnern, da das Objekt, auf das man sich einlässt, der ausgecheckte Zweig in vielen Git-Befehlen ist. – Paul

-3

Sie sollten git svn Klon -s verwenden, um komplette Svn-Baum zu klonen, einschließlich aller Zweige. Ab dann verwenden Sie Git Svn Rebaseund Git Svn DC Commit in Master mit Svn umzugehen, und Sie können regelmäßige Git Zweige für Ihren privaten Gebrauch erstellen.

+0

Das beantwortet jedoch nicht wirklich die Fragen. Ich verstehe, wie man mit git-svn von Svn kommt und es benutzt. Ich versuche zu verstehen, wie ich die Dinge in meinen lokalen Filialen verschieben kann, bevor ich es zurückgebe. Ich denke, das ist alles, egal wie die SVN-Verbindung ist. –

+1

Nun, ich fand es nützlich :) Ich wusste nicht, dass ich Git Svn Rebase anstelle von Git Svn Pull verwenden sollte. –

Verwandte Themen