Ich bin ein Benutzer von SVN und lerne jetzt Git.
In SVN checke ich normalerweise auf meinem lokalen Rechner ein Repo aus, das alle Zweige in meinem Projekt enthält, und ich habe den Ordner für meinen Zweig ausgewählt, an dem ich interessiert bin, und dort gearbeitet.
Ich sehe einen Unterschied bei der Verwendung von Git.
Derzeit klone ich ein Repo und einen bestimmten Zweig mit gitk.
Der Projektordner enthält nur den Inhalt für diesen Zweig, und ich kann nicht alle Zweige wie in SVN sehen, was für mich etwas verwirrend ist.
Ich kann mit Git keine einfache Möglichkeit finden, alle Zweige in meinem lokalen Repository anzuzeigen.
Ich würde gerne wissen, ob der von mir beschriebene Git-Prozess "Standard" ist und einige wie korrekt oder mir etwas fehlt.
Außerdem möchte ich wissen, wie man einen Prozess handhabt, bei dem zwei Zweige gleichzeitig bearbeitet werden müssen, wenn beispielsweise ein Hotfix für den Master erstellt werden muss, aber der Inhalt eines anderen Zweigs beibehalten werden muss.
Welche Namenskonventionen werden empfohlen, um die Ordner zu erstellen, die den Zweig enthalten, der aus dem Repo in Git geklont wurde (Beispiel)
myproject-branchname
?
git clone
ist eher wiesvnadmin hotcopy
odersvnrdump
+svnadmin load
als wie es istsvn checkout
. Mitgit
fordern Sie keine Kleinigkeiten aus dem Repository an. Sie kopieren das gesamte Repository und arbeiten lokal damit. Die Änderungen werden dann in das "Quell" -Repository zurückgeschrieben, wenn Sie dies wünschen. Git und Subversion verwenden zwei völlig unterschiedliche Modelle für die Quellcodeverwaltung.git-flow
Antworten:
Willkommen in der Bande!
SVN Umerziehung
Warte einen Moment. Während CVS und SVN und andere traditionelle (dh zentralisierte) Versionskontrollsysteme (größtenteils) denselben Zweck erfüllen wie moderne (dh verteilte) Versionskontrollsysteme wie Mercurial und Git, ist es für Sie viel besser, Git von Grund auf zu lernen als versuche deinen SVN Workflow auf Git zu übertragen.
http://hginit.com ( Blick auf archive.org ) von Joel Spolsky (einer der Gründer von Stack - Exchange) ist ein Tutorial für Mercurial, nicht Git, aber es ist nullten Kapitel "Subversion Re-education" ist nützlich für Menschen aus dem SVN zu Switchen auf jeder verteiltes Versionskontrollsystem, wie es Ihnen , welche SVN Konzepte erfahren Sie müssen (vorübergehend) un -Erfahren (oder
stash
entfernt , wie Git Benutzer sagen könnte) können Sie zunächst nur an die verteilt werden Versionskontrollsystemkonzepte und die idiomatischen Workflows, die für die Arbeit mit ihnen eingerichtet wurden.Sie können also das nullte Kapitel lesen und meist nur das Wort "mercurial" durch "Git" ersetzen und sich und Ihren Verstand auf Git vorbereiten.
Das Kleingedruckte
(Sie können dies vorerst überspringen.) Während Mercurial und Git sich viel ähnlicher sind als SVN, gibt es einige konzeptionelle Unterschiede zwischen ihnen, so dass einige der Aussagen und Ratschläge in "Subversion Re-education" technisch falsch werden beim Ersetzen von "mercurial" durch "Git":
In SVN ist alles ein Verzeichnis (aber Sie sollten es nicht unbedingt als solches behandeln)
Aber ich habe dich unterbrochen. Sie sagten?
Wenn Sie damit meinen, dass Sie den Stammordner des SVN-Repositorys ausgecheckt haben (oder einen anderen Ordner, der mehr als
trunk
einem Zweig entspricht, z. B. im herkömmlichen SVN-Repo-Layout denbranches
Ordner, der alle Nicht-Trunk-Zweige enthält), dann Ich wage zu behaupten, dass Sie SVN wahrscheinlich falsch (ish) verwendet haben oder zumindest ein bisschen die Tatsache missbraucht haben, dass Trunk, Branches und Tags zusammen mit Verzeichnissen innerhalb der Revisions- / Codebasis in einem einzigen (obwohl hierarchischen) Namespace zusammengefasst sind .Während es möglicherweise verlockend ist, mehrere SVN-Zweige parallel zu ändern, ist AFAIK nicht so, wie SVN verwendet werden soll. (Obwohl ich mir nicht sicher bin, welche Nachteile das haben könnte.)
In Git sind nur Verzeichnisse Verzeichnisse
Jeder Klon eines Git-Repositorys ist selbst ein Git-Repository: Standardmäßig erhält er eine vollständige Kopie des Verlaufs des Ursprungs-Repositorys, einschließlich aller Revisionen, Verzweigungen und Tags. Aber es wird alles so bleiben, wie Sie es möchten: Git speichert es in einer Art dateibasierten Datenbank, die sich im versteckten
.git/
Unterordner des Stammordners des Repository befindet .Aber welche nicht ausgeblendeten Dateien werden im Repository-Ordner angezeigt?
Wenn Sie
git clone
ein Repository haben, erledigt Git mehrere Dinge. Grob:.git/
Unterordner mit der "Datenbank"master
).Dieser letzte Schritt bedeutet, dass Git nach der Revision sucht, auf die dieser Zweig verweist, und den dort gespeicherten Dateibaum (die Datenbank verwendet einige Komprimierungs- und Deduplizierungsmethoden) in den Stammordner des Repositorys entpackt. Dieser Stammordner und alle seine Unterordner (mit Ausnahme des speziellen
.git
Unterordners) werden als "Arbeitskopie" Ihres Repositorys bezeichnet. Hier interagieren Sie mit dem Inhalt der aktuell ausgecheckten Revision / des Zweigs. Es sind nur normale Ordner und Dateien. Um jedoch mit dem Repository per se (der "Datenbank" von Revisionen und Referenzen) zu interagieren, verwenden Siegit
Befehle.Git-Zweige sehen und mit Git-Zweigen interagieren
Die Version von
gitk
I Got kann keine Repositories klonen. Es kann nur den Repo-Verlauf anzeigen, Zweige erstellen und Zweige auschecken. Es gibt auch kein "Klonen" eines Zweigs. Sie können nur Repositorys klonen.Meinst Du Sie ein Repo mit klonen
git clone ...
und dann unter Verwendunggitk
, überprüfen eine Filiale?Ja, das ist ziemlich normal:
git clone ...
git checkout ...
oder verwenden Sie ein grafisches Tool wiegikt
Vielleicht:
git branch
git branch -r
oder alle Zweige mit auflistengit branch -a
Mit können Sie
gitk
den vollständigen Verlauf (alle Branch-Tags usw., die Ihrem lokalen Repository bekannt sind) anzeigen, indem Sie ihn mit aufrufenSo arbeiten Sie mit mehreren Zweigen parallel
Hier gibt es verschiedene Szenarien:
Eine neue (noch zu erstellende) Änderung muss auf mehrere Zweige angewendet werden
Verwenden Sie diesen Workflow:
c
aus einer Revision, die sich bereits in den Vorfahren all dieser Zweige befindet (z. B. der Revision, die den Fehler verursacht hat, wenn die Änderung ein Bugfix ist), oder aus einer Revision, deren Einführung (einschließlich aller Vorfahren) zulässig ist all diese Zweige.c
.Für jeden Zweig
b
, der die Änderung benötigt:Auschecken
b
:Zusammenführen
c
inb
:Zweig entfernen
c
:Eine vorhandene Änderung ist in einem anderen Zweig erforderlich
(... aber ohne die anderen Änderungen, die an dem Ort vorgenommen wurden, an dem sich diese Änderung befindet)
In einem Zweig
a
möchten Sie eine oder mehrere Dateien in den genauen Status ändern, den sie in einem anderen Zweig habenb
a
Abrufen des Dateiinhalts von branch
b
:(Anders als
git checkout
ohne übergebende Pfade wechselt dies nicht zur Verzweigungb
, sondern ruft nur den angeforderten Dateiinhalt von dort ab. Diese Dateien sind möglicherweise bereits auf vorhanden oder nicht vorhandena
. Wenn dies der Fall ist , werden sie mit ihrem Inhalt auf überschriebenb
.)Während Sie an einem Zweig arbeiten, möchten Sie sehen, wie sich die Dinge auf einem anderen Zweig verhalten
Schauen Sie sich den Zweig an, an dem Sie arbeiten möchten.
Dann für den Blick auf den anderen Zweig,
gitk
Versuch, die Optionsfelder von "Patch" auf "Baum" zu ändern).git worktree
, um ein separates Arbeitsverzeichnis desselben Repositorys zu erstellen (dh auch unter Verwendung der Datenbank im.git/
Verzeichnis Ihres aktuellen lokalen Repositorys), in dem Sie den anderen Zweig auschecken könnenquelle
stash
ist ideal.git stash
ist gut, um unfertige Arbeiten aus dem Weg zu räumen, zB um Äste zu wechseln und später wieder zurückzukommen.Sofern Sie nicht das Verzeichnis über dem Trunk auschecken, sind in Subversion im Allgemeinen nicht alle Zweige lokal verfügbar. In Git werden alle Inhalte (Commits, Nachrichten, Zweige usw.) immer auf jede Kopie geklont.
Nicht möglich, so Sie können
git checkout branch-name
, aber Sie können nichtgit clone something branch-name
. In Subversion sind Zweige Ordner. In Git sind Zweige Zeiger auf ein Commit.Rennen
git branch
. Standardmäßig werden nur lokale Zweige angezeigt. Verwenden Siegit branch --remote
diese Option , um entfernte Zweige anzuzeigen.quelle
--single-branch
(sogar nur den Tipp mit--depth 1
). Der Unterschied zwischen lokalen und entfernten Zweigen, der git bekannt ist, ist lediglich eine Art Etikett. Remote-Verzweigungen wird (häufigorigin
) der Name der Remote-Quelle vorangestellt . Lokale Niederlassungen haben dieses Präfix nicht. Letztendlich sind die Daten jedoch lokal verfügbar (sofern Sie dies nicht getan haben--single-branch
oder ähnliches). Wenn Siegit checkout $branchname
mit einem Zweig laufen, für den kein lokaler, sondern ein entfernter Zweig existiert, richtet git automatisch einen lokalen Zweig ein, der den entfernten Zweig "verfolgt".Da dies mit git markiert ist, hoffe ich, dass mein Mangel an SVN-Kenntnissen vernachlässigbar ist.
Sie klonen das gesamte Remote-Repository und nicht nur einen bestimmten Zweig.
Das Repository ist am besten als Datenbank gedacht, sodass Sie einen Klon des aktuellen Status der entfernten Datenbank erstellen. Aber danach arbeiten Sie an Ihrer eigenen Kopie dieser Datenbank. Wenn Sie ein Commit durchführen, ändern Sie Ihre lokale Datenbank.
Der
fetch
Befehl wird verwendet, um die lokale Datenbank mit der entfernten Datenbank synchron zu halten.Normalerweise checken Sie aus dieser lokalen Datenbank einen Zweig aus, an dem Sie arbeiten möchten. Dies ist nichts anderes als ein interner Marker für Git, wo Ihre aktuelle Arbeit begann.
Angenommen, Sie arbeiten an einem einfachen Repository, in dem es keinen Zweig
master
gibt. Sie könnten einen Blick in den.git
Ordner werfen , um die "Magie" zu enthüllen:Angenommen, Ihr letzter Commit (on
master
) war182e8220b404437b9e43eb78149d31af79040c66
, finden Sie genau das untercat .git/refs/heads/master
.Von dem Sie einen neuen Zweig abzweigen
git checkout -b mybranch
, finden Sie genau den gleichen Zeiger in der Dateicat .git/refs/heads/mybranch
.Zweige sind nichts anderes als "Zeiger". Der "funktionierende" Marker heißt a
HEAD
.Wenn Sie wissen möchten, wo Sie sich
HEAD
befinden:cat .git/HEAD
was zB sagtref: refs/heads/mybranch
, was wiederumcat .git/refs/heads/mybranch
auf einen Commit-Hash hinweist ( )78a8a6eb6f82eae21b156b68d553dd143c6d3e6f
Die eigentlichen Commits werden unter dem
objects
Ordner gespeichert (das Wie ist ein eigenes Thema).Verwechseln Sie das nicht
working directory
mit der "Git-Datenbank" als Ganzes. Wie ich oben sagte, ist Ihr Arbeitsverzeichnis nur eine Momentaufnahme (vielleicht) einer Teilmenge.Angenommen, Sie haben verschiedene Zweige. Ihr Arbeitsverzeichnis ist nur für die Arbeit an diesem Zweig vorgesehen (obwohl Sie die Arbeit von dort aus auch an anderer Stelle ablegen könnten).
In der Regel haben Sie die Möglichkeit zu sehen, welche Zweige für das Projekt definiert sind
git branch
für lokale Niederlassungengit branch --remote
für entfernte Zweigegit branch -a
für beide(oder
git branch -v
)Da es sich bei git um ein verteiltes Versionskontrollsystem handelt, ist es nicht nur möglich, sondern auch empfehlenswert, verschiedene Zweigstellen lokal / remote einzurichten.
Mein typischer Workflow ist:
Wenn die Funktion abgeschlossen ist:
WIP
rework the branch (mit interaktivem rebasing) = mache daraus ein einzelnes commitWIP
Zweig in den Feature-Zweig ein und biete an, dass (wenn du mit Github arbeitest, würde dieses Angebot eine "Pull-Anfrage" heißen), um in den stabilen (Master-) Zweig integriert zu werden.Das hängt davon ab, wie Ihr Projekt aufgebaut ist:
Angenommen, Sie haben einen Stallmeister. Und Features werden nur aus diesem stabilen Zweig entwickelt - also normalerweise hinter einem Feature-Zweig. Dann hätten Sie ein letztes Commit für den Master, das die Wurzel des Feature-Zweigs wäre.
Dann würden Sie eine auf dem Master - Zweig machen begehen und könnte entscheiden, ob fusionieren beiden Zweige zusammen oder rebase (das ist eine Art von Merge für Benutzer mit umfassenderen Anforderungen so zu sagen).
Oder Sie können jederzeit Änderungen an Zweigen vornehmen (z. B.
master
) und diese per Cherrypick auf andere Zweige übertragen.Es liegt an dir.
In der Regel erhalten Sie den Repository-Namen.
Aber es gibt Situationen, in denen dies nicht erwünscht ist:
zB klonen Sie oh-my-zsh mit
git clone git://github.com/robbyrussell/oh-my-zsh.git ~/.oh-my-zsh
Hier.oh-my-zsh
wird explizit als Ziel angegeben.quelle
Git clone
Klont tatsächlich das gesamte Repository, setzt jedoch Ihr Arbeitsverzeichnis auf den Standard (normalerweise master).Sie können andere Zweige anzeigen
git branch
, indem Sie lokale odergit branch -r
ferne Zweige anzeigen und danngit checkout
zu einem vorhandenen Zweig wechseln oder einen neuen Zweig basierend auf dem aktuellen Zweig erstellen.Sie sollten die Git-Dokumentation lesen, um weitere Einzelheiten zu erfahren, und Atlassian hat auch einige gute Artikel darüber.
quelle
Zweige in git und svn sind grundsätzlich verschiedene dinge.
In svn ist ein Zweig (oder ein Tag) ein Verzeichnis im Repo.
In Git ist ein Zweig (oder ein Tag) ein Zeiger auf ein Commit.
Mit svn können Sie, wenn Sie möchten, die Wurzel des Repos auschecken. Dies bedeutet, dass Sie jeden Zweig und jedes Tag gleichzeitig ausgecheckt haben. Leider ist dies nicht die normale Art, svn zu benutzen.
Ein Git-Zweig ist kein Verzeichnis, daher gibt es kein Äquivalent zum "Auschecken der Wurzel des Repos". Es gibt eine gewisse Unterstützung für mehrere Arbeitsbäume, so dass Sie vermutlich ein Skript zusammensetzen können, um jeden Zweig zur gleichen Zeit zu überprüfen, wenn Sie es wirklich wollten, aber es wäre eine eher ungewöhnliche Überlegung, dies zu tun.
Außerdem gibt es bei SVN genau ein Repo. Mit git hat jeder Entwickler sein eigenes Repo. Dies bedeutet, dass Entwickler offline arbeiten können, aber auch, dass unterschiedliche Entwickler eine unterschiedliche Vorstellung davon haben, was sich in den einzelnen Zweigen befindet.
Aufgrund der Tatsache, dass es sich um Verzeichnisse handelt und aufgrund des einfachen linearen Geschichtsmodells von svn haben svn-Zweige robuste Geschichten. Wenn Sie wissen möchten, was auf Zweig x am Tag y war, können Sie diese Frage leicht stellen.
Git-Zweige hingegen haben keine wirklichen Geschichten. Es gibt das "reflog", aber es ist eher als Notfallwiederherstellungsmechanismus gedacht als als eine langfristige Geschichte. Insbesondere kann das Reflog nicht aus der Ferne gelesen werden und ist standardmäßig für Bare-Repos deaktiviert.
Commits haben natürlich Historien, aber diese Historien reichen nicht aus, um die Frage zu beantworten, "was sich auf Zweig x des Repository am Datum z befand".
Sie können alle lokalen Filialen auflisten, indem Sie "Git Branch" eingeben.
Mit "git branch -a" können Sie alle lokalen und entfernten Zweige auflisten.
Ein paar Möglichkeiten.
Sie können Ihre Änderungen in den "anderen Zweig" übernehmen, zum Master wechseln, dort Ihre Arbeit erledigen und dann zurückwechseln.
Sie können auch einen zusätzlichen Arbeitsbaum erstellen. Google "Git-worktree" für die Details zur Syntax.
Ich glaube nicht, dass es eine etablierte Konvention gibt. Das gleichzeitige Auschecken mehrerer Arbeitsbäume ist die Ausnahme und nicht die Regel.
quelle