2014-11-16 10 views
24

git checkout -b foo włącza foo gałęzi (nawet jeśli nie istnieje, to jest tworzony), ale jeśli foo oddział już istnieje zgłasza błąd podobny do tego:Włączyć inną gałąź (utworzyć, jeśli nie istnieje), bez sprawdzania, czy już istnieje?

fatal: A branch named 'foo' already exists. 

Co to jest polecenie, które ma następujący czek ?

  • jeśli oddział już istnieje, wystarczy przełączyć się na nim (git checkout foo)
  • jeśli gałąź nie istnieje, utwórz go i włącz go (git checkout -b foo)

Odpowiedz

37

Można spróbować:

git checkout -B foo 

Od git checkout man page:

-B Jeśli zostanie podany <new_branch> jest tworzony jeśli nie istnieje; w przeciwnym razie zostanie zresetowany. To transakcyjnej odpowiednikiem

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

Jak wspomniano poniżej, należy go ostrożnie, ponieważ powoduje zresetowania oddziału, który nie zawsze jest pożądane.
Jeśli tak zresetować oddziału przez pomyłkę z tego polecenia, you can easily revert to its previous state z:

git reset [email protected]{1} 

bgusach 's alias wymienione poniżej w komentarzu jest bezpieczniejsze (na podstawie Jiří Pavelka' s answer):

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

git switch abranch 
+0

Dzięki, guru 'git'! :-) Przyjmowanie za 4 minuty. –

+9

Zauważ, że '-B' będzie _reset_ gałęzi, zobacz moją odpowiedź na (dłuższą ...) alternatywę. – ssmith

+0

@ssmith Zdaję sobie sprawę, że (i przegłosowałem twoją odpowiedź), ale nadal wolałbym to (prostsze) podejście. – VonC

4

Komenda checkout -b tworzy nowy oddział, a następnie sprawdza w tym oddziale. Jeśli więc oddział już istnieje, nie może utworzyć nowego.

Zamiast tego trzeba zrobić:

git checkout -B <branchname> 

Powyższa komenda robi w delikatny sposób kontekstowego. Jeśli istnieje gałąź, przełącza się, jeśli nie, tworzy i kasuje.

+0

* nie może utwórz nowy. * - Chcę to obsłużyć. –

+0

@ IonicăBizău Dodano. –

+1

"tworzy i kasuje" ... i resetuje gałąź. – bfontaine

14

Zauważ dość ważny fakt, że -B będzie zresetować istniejącą gałąź przed sprawdzeniem, co Ch Nie wierzę, że Ionica chce zgodnie z jego pytaniem.

pewno nie, więc najlepiej jedno-liner mogłem wymyślić to:

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

ta może być wykonana w poręczny alias tak:

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

Uzgodnione z ssmith. Miał ten sam problem i -B nie rozwiąże go, coz zresetować.Jego rozwiązanie działa, jednak moje rozwiązanie wygląda prościej:

git checkout foo || git checkout -b foo 

To działa na mnie :)

EDIT

bezbłędnie wyjście wtw foo nie istnieje

git checkout foo 2>/dev/null || git checkout -b foo 
+0

Ach tak, znacznie prostsze i krótsze. =) Istnieje jednak raczej niewielkie zastrzeżenie, że jeśli "foo" istnieje jako coś innego niż gałąź (np. Tagi), to sprawdzi to, zamiast tworzyć gałąź, ale jest to dość ostry przypadek. – ssmith

+0

Kolejne drobne zastrzeżenie, jeśli gałąź nie istnieje, na wyjściu pojawia się błąd. @ssmith rozwiązanie jest czystsze. +1 za prostotę tak czy inaczej –

+0

@GabrielePetronella po prostu ukryć wyjście błędów, zobacz EDYTUJ –

Powiązane problemy