2011-07-03 18 views

Odpowiedz

149

Specjalna "opcja" -- oznacza "traktuj każdy argument za tym punktem jako nazwę pliku, bez względu na to, jak wygląda". To nie jest specyficzne dla Git, jest to ogólna konwencja linii poleceń Unix. Zwykle używa się go do wyjaśnienia, że ​​argumentem jest nazwa pliku, a nie opcja, np.

rm -f  # does nothing 
rm -- -f # deletes a file named "-f" 

git checkout bierze również -- oznaczać, że kolejne argumenty nie są jego opcjonalny parametr „treeish” Określanie które zobowiązują chcesz.

Więc w tym kontekście to bezpieczne używać -- zawsze, ale potrzeba że gdy plik, który chcesz przywrócić ma nazwę, która zaczyna się -, czy jest taka sama jak nazwa gałęzi. Niektóre przykłady oddział/plików dezambiguacji:

git checkout README  # would normally discard uncommitted changes 
         # to the _file_ "README" 

git checkout master  # would normally switch the working copy to 
         # the _branch_ "master" 

git checkout -- master # discard uncommitted changes to the _file_ "master" 

i opcja/plik ujednoznacznienie:

git checkout -p -- README # interactively discard uncommitted changes 
          # to the file "README" 

git checkout -- -p README # unconditionally discard all uncommitted 
          # changes to the files "-p" and "README" 

Nie jestem pewien, co zrobić, jeśli masz oddział, którego nazwa zaczyna się od -. Być może nie rób tego w pierwszej kolejności.


w tym trybie; "Checkout" może również zrobić kilka innych rzeczy. Nigdy nie zrozumiałem, dlaczego git wybrał implementację "odrzuć niezatwierdzone zmiany" jako tryb podkomendy "kasy", zamiast "przywrócić" jak większość innych VCSów, lub "zresetować", co moim zdaniem może mieć więcej sensu w warunkach własnych gita.

+11

git checkout sprawdza oddział . git checkout - sprawdza wersję indeksu pliku . – dunni

+3

Dzięki, niestety dokumentacja git tak naprawdę nie tłumaczy tego – Carlton

+1

Odnośnie "konwencji Unix": w rzeczywistości '' 'jako separator między opcjami i argumentami jest szeroko stosowany.Działa dla dowolnego programu/narzędzia używającego POSIX 'getopt (3)' do obsługi jego opcji wiersza poleceń (patrz 'man 3 getopt'), skryptów powłoki, które używają' getopt (1) 'i niektórych programów, które go implementują same w sobie, ale nie jest powszechnie gwarantowane do działania. – arielf

5

Cokolwiek następującego po -- jest traktowane jako nazwa pliku (nie jako argument programu). Jest to ważne, jeśli na przykład masz nazwy plików rozpoczynające się od kresek.