Anderen Zweig einschalten (erstellen, falls nicht vorhanden), ohne zu prüfen, ob bereits vorhanden?

74

git checkout -b fooschaltet den fooZweig ein (auch wenn er nicht existiert, wird er erstellt), aber wenn der fooZweig bereits existiert, wird ein Fehler wie der folgende ausgegeben:

fatal: A branch named 'foo' already exists.

Was ist der Befehl, der die folgende Prüfung durchführt?

  • Wenn der Zweig bereits vorhanden ist, schalten Sie ihn einfach ein ( git checkout foo)
  • Wenn der Zweig nicht existiert, erstellen Sie ihn und schalten Sie ihn ein ( git checkout -b foo)
Ionică Bizău
quelle

Antworten:

83

Update Q3 2019 (Git 2.23): Es gibt jetzt tatsächlich einen git switchBefehl !

git switch -c aBranch 

Sie würden jedoch einen ähnlichen Alias ​​benötigen:

switch = "!f() { git switch $1 2>/dev/null || git switch -c $1; }; f"

bgusach ‚s alias erwähnt unten im Kommentar ist sicherer (basierend auf Jiří Pavelka ‘ s Antwort ):

switch = "!f() { git checkout $1 2>/dev/null || git checkout -b $1; }; f"

git switch abranch

Ursprüngliche Antwort (2014) Sie können versuchen:

git checkout -B foo

Von der git checkoutManpage :

Wenn -Bangegeben ist, <new_branch>wird erstellt, wenn es nicht existiert; Andernfalls wird es zurückgesetzt. Dies ist das Transaktionsäquivalent von

$ git branch -f <branch> [<start point>]
$ git checkout <branch>

Verwenden Sie es, wie unten erwähnt, mit Vorsicht, da es den Zweig zurücksetzt, was nicht immer wünschenswert ist.
Wenn Sie den Zweig versehentlich mit diesem Befehl zurückgesetzt haben, können Sie mit:

git reset HEAD@{1}

VonC
quelle
Danke, gitGuru! :-) Akzeptieren in 4 Minuten.
Ionică Bizău
12
Beachten Sie, dass -Bwird zurückgesetzt den Zweig, siehe meine Antwort für eine (längere ...) Alternative.
Schmied
@ssmith Ich erkenne das (und habe Ihre Antwort positiv bewertet), aber ich würde diesen (einfacheren) Ansatz immer noch bevorzugen.
VonC
1
Benutze das nicht. Es wird meistens Ihren Zweig zerstören und Ihnen schöne Kopfschmerzen
bereiten
3
-1, weil die Antwort irreführend ist. Das Verhalten, das OP und die meisten Leser erwarten, ist "Wenn der Zweig bereits vorhanden ist, schalten Sie ihn einfach ein (git checkout foo)". Die erste Codezeile in dieser Antwort macht jedoch eine ganz andere Sache. Ja, es wird unten erklärt, aber was die Leute zuerst lesen und versuchen, ist dieser irreführende Code.
Nick Volynkin
64

Einverstanden mit Schmied. Hatte das gleiche Problem und -Blöst es nicht, weil zurückgesetzt. Seine Lösung funktioniert, aber meine Lösung sieht einfacher aus:

git checkout foo || git checkout -b foo

Das ist für mich in Ordnung :)

BEARBEITEN

Ohne Fehlerausgabe iff foo existiert nicht

git checkout foo 2>/dev/null || git checkout -b foo
George Pavelka
quelle
2
Ach ja, viel einfacher und kürzer. =) Es gibt jedoch die eher geringfügige Einschränkung, dass "foo", wenn es als etwas anderes als ein Zweig existiert (z. B. Tags), es eher auscheckt als den Zweig erstellt, aber es ist ein hübscher Randfall.
Schmied
Eine weitere kleine Einschränkung: Wenn der Zweig nicht vorhanden ist, wird ein Fehler in der Ausgabe angezeigt. @ssmith Lösung ist sauberer. +1 der Einfachheit halber trotzdem
Gabriele Petronella
@ GabrielePetronella einfach Fehlerausgabe ausblenden, siehe BEARBEITEN
George Pavelka
@ JiříPavelka danke, aber in meinem Anwendungsfall möchte ich die Ausgabe, aber nur die des erfolgreichen Kommentars.
Gabriele Petronella
1
Nett. Ich habe einen Alias ​​dafür gemacht ... nur für den Fall, dass es jemandem hilft:switch = "!f() { git checkout $1 2>/dev/null || git checkout -b $1; }; f"
Bgusach
22

Beachten Sie die ziemlich wichtige Tatsache , dass -Bwird zurückgesetzt einen bestehenden Zweig , bevor sie auszuchecken, was ich nicht glaube , @Ionica nach seiner Frage möchte.

Ich habe es sicherlich nicht getan, also ist der beste Einzeiler, den ich mir vorstellen kann, folgender:

git checkout $(git show-ref --verify --quiet refs/heads/<branch> || echo '-b') <branch>

Dies kann zu einem praktischen Alias ​​wie folgt gemacht werden:

[alias]
  # git cob <branch>
  cob = "!f() { git checkout $(git show-ref --verify --quiet refs/heads/\"$1\" || echo '-b') \"$1\"; }; f"
Schmied
quelle
8

Der Befehl checkout -berstellt einen neuen Zweig und checkt dann in diesen Zweig aus. Wenn also bereits ein Zweig vorhanden ist, kann er keinen neuen erstellen.

Stattdessen müssen Sie Folgendes tun:

git checkout -B <branchname>

Der obige Befehl wird kontextsensitiv ausgeführt. Wenn es einen Zweig gibt, wechselt er, wenn nicht, erstellt er und checkt aus.

Praveen Kumar Purushothaman
quelle
Es kann kein neues erstellt werden. - Ich möchte damit umgehen.
Ionică Bizău
@ IonicăBizău Das wurde hinzugefügt.
Praveen Kumar Purushothaman
3
"es erstellt und auscheckt" ... und setzt den Zweig zurück.
Bfontaine
2

Nicht sehr verschieden von dem, was George Pavelka vorgeschlagen hat, aber anstatt sich auf den Status "git checkout" zu verlassen, prüft dies das Vorhandensein und entscheidet dann über den zu verwendenden Befehl

git show-branch <branch> &>/dev/null && git checkout <branch> || git checkout -b <branch>
Kishore
quelle