2014-11-11 5 views
6

Sie geben den Befehl "git checkout foo" ein.Gibt es eine Möglichkeit, "git checkout" auszuführen und * force * das Argument als Zweigname zu interpretieren?

Wenn es einen Zweig namens "foo" noch keine Datei mit diesem Namen gibt, wechselt es zum Zweig - und wenn es eine Datei mit diesem Namen und keine solche Verzweigung gibt, aktualisiert es die Datei "foo".

Aber ich frage mich - gibt es eine Möglichkeit, den Befehl einzugeben, so dass Git bedingungslos "foo" als den Namen eines Zweigs interpretiert, egal was? Dies beinhaltet (aber ist nicht beschränkt auf) die Spezifikation, dass, wenn es keinen Zweig namens "foo" gibt, der Vorgang fehlschlägt, auch wenn eine Datei mit diesem Namen existiert.

Also - gibt es eine Möglichkeit, dies zu tun?

Danke.

+0

Ich weiß nicht, einen Weg, um zu überprüfen, die Verzweigen Sie explizit, aber es gibt eine Möglichkeit, die Datei explizit auschecken zu lassen: git checkout - master – Acey

Antwort

13

Ja, von der Referenz, gibt es diese Nutzung:

git checkout [-f|--ours|--theirs|-m|--conflict=<style>] [<tree-ish>] [--] <paths>… 

In Ihrem Fall, das läuft darauf hinaus: Hier

git checkout foo -- 

, foo-<tree-ish> entspricht und -- sagt, dass sich alles danach auf Dateinamen bezieht. Also, wenn Sie den obigen Befehl verwenden (ohne Dateinamen nach --) wird es scheitern, wenn es kein Baum-ish (Zweig) genannt foo:

fatal: invalid reference: foo 
+1

Danke. :-) Ich habe gerade Ihren Vorschlag getestet, und es funktioniert wunderbar. :-) –

2

Nur überprüft das Verhalten von Git 2.1.2 und checkout interpretiert immer den Namen als Zweigname. Sie können stattdessen eine Datei erzwingen, indem Sie ./foo verwenden.

In Ihrem Fall git checkout foo wird immer versuchen, auf Zweig foo zu wechseln.

Wenn Sie das Argument als Verzweigung erzwingen möchten, sodass selbst wenn eine Datei übereinstimmt, sie nicht aktualisiert wird, können Sie versuchen, git mithilfe von git checkout -B foo foo auszutricksen. Wenn foo existiert, wird git es auschecken und den Verzweigungszeiger auf sich selbst aktualisieren. Ist dies nicht der Fall, wird der neue Zweig nicht erstellt, da der Startpunkt fehlt.

1

Sie können eine explizite Kontrolle hinzufügen, wenn die Zweignamen zuerst existieren: es ist der Zweig vorhanden ist, und wenn ja, überprüfen heraus, dass

git show-ref --verify --quiet refs/heads/foo && git checkout foo 

wird sicherstellen. Ja, es gibt eine Race Condition (der Zweig könnte dazwischen gelöscht werden), aber hoffentlich ist das in der Praxis kein Problem.

Is there a better way to find out if a local git branch exists?

+0

Vielen Dank. :-) Wenn ich zwei Antworten als die beste Antwort überprüfen könnte, hätte ich auch Ihre überprüft - wie es ist eine sehr nahe zweitbeste. Und ja - die Race Condition ist der Tie-Breaker --- etwas, das zu einem gegebenen Zeitpunkt wahrscheinlich kein Thema ist, jedoch (a) wenn ich es als Lösung verwende, je mehr Zeit verstreicht, desto mehr wahrscheinlich, dass die seltene Situation, in der dies Probleme verursacht, zu einem bestimmten Zeitpunkt (b) gering ist, da dieses Problem ist, hat jemand anderes eine Antwort zur Verfügung gestellt, die dieses Problem überhaupt nicht hat. Daher ist Ihre Antwort eine sehr * nahe * Sekunde, aber immer noch nur der zweite Platz. –

+0

@Sophia_ES: Ich stimme dir zu - Yawars Antwort ist besser.:) –