Perbedaan antara "git checkout <filename>" dan "git checkout - - <filename>"

Jawaban:

214

"Opsi" khusus --berarti "perlakukan setiap argumen setelah titik ini sebagai nama file, apa pun tampilannya." Ini bukan khusus Git, ini adalah konvensi baris perintah Unix umum. Biasanya Anda menggunakannya untuk mengklarifikasi bahwa argumen adalah nama file daripada opsi , mis

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

git checkout1 juga --berarti bahwa argumen berikutnya bukanlah parameter opsional "hierarki" yang menentukan komit mana yang Anda inginkan.

Jadi dalam konteks ini aman untuk digunakan --selalu, tetapi Anda membutuhkannya ketika file yang ingin Anda kembalikan memiliki nama yang dimulai dengan -, atau sama dengan nama cabang. Beberapa contoh untuk disambiguasi cabang / file:

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"

dan opsi / disambiguasi file:

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"

Saya tidak yakin apa yang Anda lakukan jika Anda memiliki cabang yang namanya dimulai dengan -. Mungkin jangan lakukan itu sejak awal.


1 dalam mode ini; "checkout" juga dapat melakukan beberapa hal lain. Saya tidak pernah mengerti mengapa git memilih untuk mengimplementasikan "discard uncommitted changes" sebagai mode subcommand "checkout", daripada "revert" seperti kebanyakan VCS lainnya, atau "reset" yang menurut saya mungkin lebih masuk akal dalam istilah git sendiri.

zwol
sumber
12
git checkout <name> memeriksa cabang <name>. git checkout - <name> memeriksa versi indeks dari file <name>.
dunni
3
Terima kasih, sayangnya dokumentasi git tidak benar-benar menjelaskan hal ini
Carlton
1
Mengenai "konvensi Unix": memang --sebagai pemisah antara opsi dan argumen banyak diimplementasikan. Ia bekerja untuk semua program / utilitas yang menggunakan POSIX getopt(3)untuk menangani opsi baris perintahnya, (lihat man 3 getopt), skrip-shell yang digunakan getopt(1), dan beberapa program yang mengimplementasikannya sendiri, tetapi tidak dijamin secara universal untuk bekerja.
arielf
Hah! Saya hanya membaca contoh cara kembali ketika bagaimana membuang perubahan yang berfungsi, setelah lupa melihat konvensi ini di program baris perintah lainnya, diasumsikan itu --berarti 'meniadakan perubahan' a la C / C ++ - dan telah memikirkannya sejak itu. Pikiran meledak!
underscore_d
Untuk orang seperti saya: jangan bingung dengan nama master, maksudnya file bernama master dan bukan cabang.
HarsH
7

Apa pun yang mengikuti --ini akan dianggap sebagai nama file (bukan sebagai argumen program). Ini penting jika, misalnya, Anda memiliki nama file yang dimulai dengan tanda hubung.

jtbandes
sumber