Ich bin neu bei Git. Ich suche viel, aber es wurde nichts gefunden, das genau zu meinem Fall passt.
Ich habe eine persönliche WinForms-Anwendung und in meinem Remote-Repo gibt es 3 Niederlassungen (Master- und 2 Langlauf-Niederlassungen):
master #the common features are here like Core, DAL,...
north #customized for A company (long-running)
razavi #customized for B company (long-running)
An meinem Büro-PC füge ich 2 worktree
für diese north
- und razavi
-Zweige hinzu:
$ git worktree list
C:/Source/nis a6fb6e1 [master]
C:/Source/north ebc7670 [north]
C:/Source/razavi eed08a2 [razavi]
Bis jetzt ist alles in Ordnung, ich beschließe, auch von zu Hause aus an diesem Projekt zu arbeiten, aber wenn ich versuche, in diesen beiden Zweigen einen Arbeitsbaum hinzuzufügen, gibt es einen Fehler:
$git worktree add -b north ../north north
fatal: A branch named 'north' already exists.
Ich entferne den -b
-Schalter, um keinen neuen Zweig hinzuzufügen, aber es funktioniert auch nicht.
Wie kann ich eine worktree
aus einem vorhandenen Zweig hinzufügen, der nicht lokal, sondern entfernt ist?
UPDATE (Lösung)
Nach einiger Zeit fand ich die Lösung für mein Problem. Eigentlich war es ein --checkout
-Schalter, der fehlte:
$ git worktree add --checkout ../north north
Ich werde das auch in Antworten geben.
TL; DR: Sie wollten wahrscheinlich git worktree add ../north north
Zunächst eine Erinnerung (oder Information für andere, die auf diese Frage stoßen): git worktree add
Möchte einen neuen Arbeitsbaum erstellen und , um Stellen Sie gleichzeitig sicher, dass in diesem neuen Arbeitsbaum ein anderer Zweigname als in jedem anderen Arbeitsbaum verwendet wird. Dies liegt daran, dass, während jeder hinzugefügte Arbeitsbaum seinen eigenen Index und HEAD
hat, die HEAD
-Dateien gemeinsam genutzt werden die zugrunde liegenden Verzweigungszeiger im gemeinsam genutzten Repository. Das Vorhandensein von zwei verschiedenen Arbeitsbäumen mit unabhängigen Indexobjekten, aber demselben zugrunde liegenden Zweig, führt zu einigen schwierigen Problemen für die Benutzer. Anstatt zu versuchen, herauszufinden , wie mit diesen umzugehen ist - indem man entweder Programmierer ausbildet oder Werkzeuge bereitstellt, um mit den Problemen umzugehen - einfach git worktree
verbietet die Situation völlig.
Daher ist es ziemlich typisch, beim Erstellen eines neuen Arbeitsbaums einen neuen Zweignamen erstellen zu wollen. Per Definition unterscheidet sich ein neuer Filialname automatisch von jedem vorhandenen Filialnamen:
$ git checkout -b newbranch
Switched to a new branch 'newbranch'
$ git checkout -b newbranch
fatal: A branch named 'newbranch' already exists.
Das scheint ganz natürlich: Niemand wird jemals davon überrascht.
Sie führen git worktree add
Auf eine Weise aus, die der von git checkout -b
Entspricht, mit der Ausnahme, dass das Auschecken im neu hinzugefügten Arbeitsbaum erfolgt. Sie haben jedoch bereits einen Zweig mit dem Namen north
.
Wenn dieser vorhandene Zweig north
nicht nützlich ist, können Sie ihn löschen. Jetzt haben Sie keinen lokalen Zweig mit dem Namen north
und können einen neuen erstellen.
Wenn diese vorhandene north
-Verzweigung nützlich ist , löschen Sie sie nicht! Wenn es in einem vorhandenen Arbeitsbaum bereits ausgecheckt ist, wechseln Sie zu diesem Arbeitsbaum und bearbeiten Sie ihn dort. Wenn in einem vorhandenen Arbeitsbaum nicht ausgecheckt ist, können Sie einen neuen Arbeitsbaum erstellen, der habe es ausgecheckt; Sie müssen lediglich die Verwendung des Flags -b
(und des entsprechenden Zweignamens) vermeiden:
git worktree add ../north north
Beachten Sie, dass Sie sich beim Erstellen eines neuen Zweigs nicht wiederholen müssen:
git worktree add -b newbranch ../path
erstellt einen neuen Arbeitsbaum in ../path
und füllt ihn mit git checkout -b newbranch
auf. Sie benötigen den Filialnamen nur, wenn:
-b
undWenn Sie beispielsweise den vorhandenen Zweig zorg
in einem neuen Arbeitsbaum im Pfad ../zorg
Auschecken möchten, können Sie Folgendes ausführen:
git worktree add ../zorg
Da es hier weder ein -b zorg
Noch ein abschließendes Argument gibt, berechnet Git den Zweignamen mithilfe des letzten Teils von ../zorg
, Der natürlich nur zorg
ist Dadurch wird versucht, den vorhandenen Zweig zorg
in den neuen Arbeitsbaum auszuchecken.
Zusätzlich zum "Erraten des entfernten Zweigs", wie ich in meiner anderen Antwort erkläre , wird Git 2.18 (Q2 2018) eine neue Funktion bieten:
"git worktree add
" hat gelernt, einen vorhandenen Zweig auszuchecken.
Siehe commit f60a7b7 , commit 6427f87 , commit 2c27002 , commit d861d34 (24. April 2018) von Thomas Gummerer (tgummerer
) .
Geholfen hat: Eric Sunshine (sunshineco
) .
(Zusammengeführt von Junio C Hamano - gitster
- in Commit 10174da , 23. Mai 2018)
worktree: "
add
" beibringen, um vorhandene Zweige zu überprüfenDerzeit erstellt '
git worktree add <path>
' einen neuen Zweig mit dem Namen Basisname des Pfads standardmäßig.
Wenn bereits eine Verzweigung mit diesem Namen vorhanden ist, lehnt der Befehl nichts ab, es sei denn, die Option '--force
' ist angegeben.Wir können jedoch ein bisschen besser als das, und check die Verzweigung, wenn es wird nirgendwo anders ausgecheckt.
Dies wird Benutzern helfen, die einen vorhandenen Zweig in einen neuen Arbeitsbaum einchecken möchten, und einige Tastenanschläge speichern.Als aktuelles Verhalten wird einfach "
die()
" bezeichnet, wenn ein Zweig mit dem Namen der Basisname des Pfads ist bereits vorhanden, es gibt keine Rückwärtsrichtung Kompatibilitätsprobleme hier.Wir werden immer noch "
die()
" sein, wenn der Zweig in einem anderen Worktree ausgecheckt wird es sei denn, das--force
-Flag wird übergeben.
Die Dokumentation sagt jetzt :
$ git worktree add --track -b <branch> <path> <remote>/<branch>
Wenn
<commit-ish>
weggelassen wird und weder-b
noch-B
noch--detach
verwendet wird, Dann wird der Bequemlichkeit halber der neue Arbeitsbaum einem Zweig zugeordnet (nennen Sie es<branch>
) benannt nach$(basename <path>)
.
- Wenn
<branch>
nicht vorhanden ist, wird automatisch ein neuer Zweig auf der Basis von HEAD erstellt, als wäre-b <branch>
gegeben.- Wenn
<branch>
vorhanden ist, wird es im neuen Arbeitsbaum ausgecheckt, wenn es nicht an anderer Stelle ausgecheckt ist. Andernfalls lehnt der Befehl die Erstellung des Arbeitsbaums ab (es sei denn,--force
wird verwendet).
Für dieses Problem benötigt worktree add
einen --checkout
-Schalter, um dies zu tun:
$ git worktree add --checkout ../north north
$ git worktree add --checkout ../razavi razavi
Zusätzlich zu git worktree add --checkout
schlägt Git 2.16 (Q1 2018) eine weitere Alternative vor:
Die Art und Weise "git worktree add
" bestimmt, welcher Zweig von wo erstellt werden soll und ob der Checkout im neuen Arbeitsbaum ein wenig aktualisiert wurde.
Siehe commit e92445a , commit 71d6682 (29 Nov 2017) und commit 4e85333 , commit e284e89 , commit c4738ae , commit 7c85a87 (26 November 2017) von Thomas Gummerer (tgummerer
) .
(Zusammengeführt von Junio C Hamano - gitster
- in commit 66d3f19 , 19 Dez 2017)
hinzufügen der Option
worktree.guessRemote
configEinige Benutzer möchten möglicherweise die
--guess-remote
-Option in .__ eingeführt haben. Das vorherige Festschreiben ist standardmäßig aktiviert, sodass sie nicht ausgegeben werden müssen Jedes Mal erstellen sie einen neuen Arbeitsbaum.Fügen Sie eine Konfigurationsoption
worktree.guessRemote
hinzu, mit der Benutzer .__ konfigurieren können. das Standardverhalten für sich.
Die Dokumentation für git config lautet nun:
worktree.guessRemote::
Wenn mit
add
kein Verzweigungsargument und weder-b
noch-B
noch--detach
angegeben sind, erstellt der Befehl standardmäßig eine neue Verzweigung aus HEAD.
Wennworktree.guessRemote
auf true gesetzt ist, versuchtworktree add
, einen Remote-Tracking-Zweig zu finden, dessen Name eindeutig mit dem neuen Zweignamen übereinstimmt.
- Wenn ein solcher Zweig vorhanden ist, wird er ausgecheckt und als "Upstream" für den neuen Zweig festgelegt.
- Wenn keine solche Übereinstimmung gefunden werden kann, wird auf das Erstellen eines neuen Zweigs aus dem aktuellen HEAD zurückgegriffen.
Tatsächlich verdeutlicht Git 2.21 (Q1 2019) die Dokumentation für diese Option, die direkt mit "With add
" eingesprungen wurde, ohne zu erklären, dass add
ein Unterbefehl von "git worktree" ist.
Siehe commit b4583d5 (23. Dezember 2018) von Eric Sunshine (sunshineco
) .
(Zusammengeführt von Eric Sunshine - sunshineco
- in commit b4583d5 , 28. Dezember 2018)
Die Dokumentation liest jetzt:
worktree.guessRemote
:Wenn keine Verzweigung angegeben ist und weder
-b
noch-B
noch--detach
verwendet wird, erstelltgit worktree add
standardmäßig die Erstellung einer neuen Verzweigung aus HEAD.