Den Unterschied der Verzweigung zwischen SVN und Git verstehen

44

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?

Radex
quelle
8
Interessant - normalerweise checken Sie mit SVN nur den Stamm oder Zweig, an dem Sie arbeiten, aber ich verstehe, was Sie meinen.
HorusKol
20
Sie hatten einen fehlerhaften Workflow in SVN, jetzt versuchen Sie, ihn in Git zu spiegeln (während selbst ein guter SVN-Workflow nur teilweise für Git anwendbar ist). Beste Lösung - alle SVN-Gewohnheiten vergessen und von vorne anfangen
Lazy Badger
6
git cloneist eher wie svnadmin hotcopyoder svnrdump+ svnadmin loadals wie es ist svn checkout. Mit gitfordern 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.
Chepner
1
In Bezug auf das Hotfix- git-flow
Problem sollten Sie
5
@ LazyBadger es ist nicht unterbrochen Workflow, wenn es die Entwicklung erleichtern und Wert zur Verfügung gestellt. Es gibt keinen richtigen Weg, um Zweige zu verwenden.
Dietbuddha

Antworten:

67

Ich bin ein Benutzer von SVN und lerne jetzt GIT.

Willkommen in der Bande!

SVN Umerziehung

In SVN ich in der Regel [...]

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 stashentfernt , 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":

  • Während mercurial Änderungssätze intern verfolgt und speichert, verfolgt und speichert Git Revisionen (dh Status des Inhalts eines Verzeichnisbaums) genau wie Subversion. Aber anders als Subversion Git führt verschmilzt durch die jeweils zwischen dem einzelnen beteiligten Zweig an den Unterschieden suchen und eine gemeinsamen Vorfahren Revision (ein echter 3-Punkt-merge), so das Ergebnis ist sehr ähnlich wie für Mercurial: Zusammenführen ist viel einfacher und weniger Fehler anfällig als in SVN.
  • Während Sie in Git verzweigen können, indem Sie das Repository klonen (wie es bei Mercurial üblich ist), ist es weitaus üblicher, in einem Git-Repository einen neuen Zweig zu erstellen. (Das liegt daran, dass Git-Verzweigungen lediglich (verschiebbare) Zeiger auf Revisionen sind, wohingegen mercurial-Verzweigungen permanente Bezeichnungen sind, die auf jede Revision angewendet werden. Diese permanenten Bezeichnungen sind normalerweise unerwünscht. Daher funktionieren mercurial-Workflows in der Regel, indem das gesamte Repository für unterschiedliche Entwicklungen geklont wird.)

In SVN ist alles ein Verzeichnis (aber Sie sollten es nicht unbedingt als solches behandeln)

Aber ich habe dich unterbrochen. Sie sagten?

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.

Wenn Sie damit meinen, dass Sie den Stammordner des SVN-Repositorys ausgecheckt haben (oder einen anderen Ordner, der mehr als trunkeinem Zweig entspricht, z. B. im herkömmlichen SVN-Repo-Layout den branchesOrdner, 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 cloneein Repository haben, erledigt Git mehrere Dinge. Grob:

  1. Es erstellt den Zielordner und darin den .git/Unterordner mit der "Datenbank"
  2. Es überträgt die Referenzen (Tags, Verzweigungen usw.) aus der Datenbank des Ursprungsrepositorys und erstellt eine Kopie davon in der neuen Datenbank, wobei es ihnen einen leicht geänderten Namen gibt, der sie als "entfernte" Referenzen kennzeichnet.
  3. Es überträgt alle Revisionen (dh Dateibaumzustände), auf die diese Referenzen verweisen, sowie alle Revisionen, auf die diese Revisionen direkt oder transitiv (ihre Eltern und Vorfahren) verweisen, in die neue Datenbank und speichert sie, so dass die neuen entfernten Referenzen tatsächlich vorhanden sind auf etwas verweisen, das im neuen Repository verfügbar ist.
  4. Es wird ein lokaler Zweig erstellt, der die Remote-Revision verfolgt, die dem Standardzweig des Ursprungsrepository entspricht (normalerweise master).
  5. Es überprüft die lokale Niederlassung.

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 .gitUnterordners) 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 Sie gitBefehle.

Git-Zweige sehen und mit Git-Zweigen interagieren

Derzeit klone ich ein Repo und einen bestimmten Zweig mit gitk.

Die Version von gitkI 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 Verwendung gitk, überprüfen eine Filiale?

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 würde gerne wissen, ob der von mir beschriebene Git-Prozess "Standard" ist und [...]

Ja, das ist ziemlich normal:

  • Klonen Sie ein Repository mit git clone ...
  • Schauen Sie sich den Zweig an, mit dem Sie arbeiten möchten, git checkout ...oder verwenden Sie ein grafisches Tool wiegikt

Ich kann mit GIT nicht alle Filialen in meinem lokalen Repository auf einfache Weise anzeigen.

  • [...] oder mir fehlt smt.

Vielleicht:

  • Sie können lokale Niederlassungen mit auflisten git branch
  • Sie können entfernte Zweige mit git branch -roder alle Zweige mit auflistengit branch -a
  • Mit können Sie gitkden vollständigen Verlauf (alle Branch-Tags usw., die Ihrem lokalen Repository bekannt sind) anzeigen, indem Sie ihn mit aufrufen

    gitk --all
    

So arbeiten Sie mit mehreren Zweigen parallel

  • 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.

Hier gibt es verschiedene Szenarien:

Eine neue (noch zu erstellende) Änderung muss auf mehrere Zweige angewendet werden

Verwenden Sie diesen Workflow:

  1. Erstellen Sie einen neuen Zweig caus 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.
  2. Nehmen Sie die Änderung in diesem neuen Zweig vor und übernehmen Sie sie c.
  3. Für jeden Zweig b, der die Änderung benötigt:

    1. Auschecken b:

      git checkout b
      
    2. Zusammenführen cin b:

      git merge c
      
  4. Zweig entfernen c:

    git branch --delete 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)

  1. Überprüfen Sie den Zweig, in dem die Änderung erforderlich ist
  2. Wählen Sie die Revision (en), die die Änderung vornehmen, in der angegebenen Reihenfolge aus

In einem Zweig amöchten Sie eine oder mehrere Dateien in den genauen Status ändern, den sie in einem anderen Zweig habenb

  1. Auschecken a
  2. Abrufen des Dateiinhalts von branch b:

    git checkout b -- path/to/a/file.txt path/to/another/file.cpp or/even/a/complete/directory/ ...
    

    (Anders als git checkoutohne übergebende Pfade wechselt dies nicht zur Verzweigung b, sondern ruft nur den angeforderten Dateiinhalt von dort ab. Diese Dateien sind möglicherweise bereits auf vorhanden oder nicht vorhanden a. Wenn dies der Fall ist , werden sie mit ihrem Inhalt auf überschrieben b.)

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,

  • Verwenden Sie entweder grafische Tools, mit denen Sie den Inhalt nicht ausgecheckter Revisionen anzeigen können (z. B. beim gitkVersuch, die Optionsfelder von "Patch" auf "Baum" zu ändern).
  • oder klonen Sie das Repository in ein temporäres Verzeichnis und checken Sie den anderen Zweig dort aus
  • oder verwenden Sie 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önnen
das-g
quelle
Für den letzten Workflow stashist ideal.
CAD97
@ CAD97 nicht, wenn Sie weiterhin am ersten Zweig arbeiten möchten, während Sie den zweiten Zweig parallel als Referenz betrachten . git stashist gut, um unfertige Arbeiten aus dem Weg zu räumen, zB um Äste zu wechseln und später wieder zurückzukommen.
das-g
1
"Mercurial Workflows klonen normalerweise das gesamte Repository für unterschiedliche Entwicklungen" - Ich habe davon gehört, aber die meisten Leute, die Git-Zweige wollen, verwenden nur Lesezeichen, anstatt das gesamte Repository zu klonen. Es ist viel einfacher.
Kevin
@ Kevin Das könnte sein. Es ist eine Weile her, dass ich zuletzt Quecksilber verwendet habe. Vielleicht war es damals anders. (Oder vielleicht waren es nur die Workflows der Community, mit denen ich es verwendet habe.)
das-g
Vielleicht sollte der Hg Init-Text "[...] weil Sie eigentlich den Mercurial-Weg hätten verzweigen sollen, indem Sie [...] Repositorys klonen" auch in dieser Hinsicht aktualisiert werden.
das-g
31

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.

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.

Derzeit klone ich ein Repo und einen bestimmten Zweig mit gitk.

Nicht möglich, so Sie können git checkout branch-name, aber Sie können nicht git clone something branch-name. In Subversion sind Zweige Ordner. In Git sind Zweige Zeiger auf ein Commit.

Ich kann mit GIT nicht alle Filialen in meinem lokalen Repository auf einfache Weise anzeigen.

Rennen git branch. Standardmäßig werden nur lokale Zweige angezeigt. Verwenden Sie git branch --remotediese Option , um entfernte Zweige anzuzeigen.

l0b0
quelle
4
Hm. "Standardmäßig werden nur lokale Zweige angezeigt." klingt wie es gibt andere Arten von Zweigen, die nicht lokal sind. Sie sagen aber auch: "In Git werden alle Inhalte (Commits, Nachrichten, Zweige usw.) immer auf jede Kopie geklont." . Ich finde das etwas verwirrend, denn wenn alle Zweige auf Ihre Kopie geklont sind, was sind diese mysteriösen nicht-lokalen Zweige? Vielleicht ist es zu kompliziert, in einem Kommentarfeld zu antworten.
Pipe
2
@pipe Wenn Sie Änderungen festschreiben, erstellen Sie dazu ein lokales Festschreiben, das die Festschreibung ändert, auf die der Zweig zeigt. Wenn andere Benutzer diese Änderungen erhalten sollen, müssen Sie diese Änderungen in das Remote-Repository übertragen. Dies führt dazu, dass der Remote-Zweig auf dieses neue Commit verweist. Jetzt können alle anderen diese Änderungen von dort
abrufen
9
@pipe Erstens können Sie tatsächlich nur einen Zweig mit klonen --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äufig origin) 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-branchoder ähnliches). Wenn Sie git checkout $branchnamemit 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".
Jonas Schäfer
"Es sei denn, Sie überprüfen das Verzeichnis über dem Trunk" - Ich habe die Erfahrung gemacht, dass dies ziemlich häufig ist, da es das Zusammenführen erheblich erleichtert. (Obwohl wir einen einzelnen "Live" -Zweig anstelle von Versions-Tags verwenden, beträgt dieser normalerweise nur 2-3 Kopien des Codes.)
Izkata,
1
@Izkata "es macht das Zusammenführen viel einfacher", oder?
HorusKol
3

Da dies mit markiert ist, hoffe ich, dass mein Mangel an SVN-Kenntnissen vernachlässigbar ist.

Derzeit klone ich ein Repo und einen bestimmten Zweig mit gitk.

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 fetchBefehl 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 mastergibt. Sie könnten einen Blick in den .gitOrdner werfen , um die "Magie" zu enthüllen:

Angenommen, Ihr letzter Commit (on master) war 182e8220b404437b9e43eb78149d31af79040c66, finden Sie genau das unter cat .git/refs/heads/master.

Von dem Sie einen neuen Zweig abzweigen git checkout -b mybranch, finden Sie genau den gleichen Zeiger in der Datei cat .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 HEADbefinden:

cat .git/HEADwas zB sagt ref: refs/heads/mybranch, was wiederum cat .git/refs/heads/mybranchauf einen Commit-Hash hinweist ( )78a8a6eb6f82eae21b156b68d553dd143c6d3e6f

Die eigentlichen Commits werden unter dem objectsOrdner gespeichert (das Wie ist ein eigenes Thema).

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.

Verwechseln Sie das nicht working directorymit 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 Niederlassungen
  • git branch --remote für entfernte Zweige
  • git 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:

  • Verzweigen Sie eine Feature-Verzweigung
  • Verzweigen Sie einen WIP-Zweig (Work in Progress) von diesem Zweig
  • Arbeiten Sie so, wie Sie möchten - auch wenn Sie nach einer einzelnen Zeile ein Commit ausführen. es spielt keine rolle

Wenn die Funktion abgeschlossen ist:

  • squash / WIPrework the branch (mit interaktivem rebasing) = mache daraus ein einzelnes commit
  • Füge den WIPZweig 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.

Außerdem möchte ich wissen, wie man einen Prozess handhabt, bei dem ich auf zwei Zweigen gleichzeitig wprl muss, wenn ich zum Beispiel einen Hotfix auf dem Master machen muss, aber den Inhalt eines anderen Zweigs auch behalte.

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.

Welche Namenskonventionen werden empfohlen, um Ordner zu erstellen, die den Zweig enthalten, der aus dem Repository in GIT geklont wurde, z. B. myproject-branchname

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-zshwird explizit als Ziel angegeben.

Thomas Junk
quelle
2

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 oder git branch -rferne Zweige anzeigen und dann git checkoutzu 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.

HorusKol
quelle
0

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".

Ich kann mit Git keine einfache Möglichkeit finden, alle Zweige in meinem lokalen Repository anzuzeigen.

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.

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.

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.

Welche Namenskonventionen werden empfohlen, um Ordner zu erstellen, die den Zweig enthalten, der aus dem Repository in Git geklont wurde, z. B. myproject-branchname?

Ich glaube nicht, dass es eine etablierte Konvention gibt. Das gleichzeitige Auschecken mehrerer Arbeitsbäume ist die Ausnahme und nicht die Regel.

Peter Green
quelle
2
Diese Antwort sieht unvollständig aus, warum?
gnat