2011-07-03 16 views
73

http://norbauer.com/notebooks/code/notes/git-revert-reset-a-single-file違い "gitのチェックアウト - <filename> - " 私はポストを発見した

しかし、それでもまだ、私はそれぞれ第1及び第二のいずれかを使用する必要がありますどのような状況で

  1. git checkout <filename>

  2. git checkout -- <filename>

の違いが何であるかを知らないのですか?

+1

[Git checkout double dashesの意味](http://stackoverflow.com/q/13321458/456814)も参照してください。 –

答えて

149

特別な「オプション」--は、「この点以降のすべての引数を、ファイル名として扱う」という意味です。これはGit固有のものではなく、一般的なUnixコマンドラインの規約です。通常は、引数がオプションではなくファイル名であることを明確にするために使用します。

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

git checkout も、後続の引数が必要にコミットそのオプションの「treeish」パラメータ指定しないことを意味する--かかります。

だから、この文脈では、常に --を使用する 安全をだが、あなた 必要それあなたが元に戻したいファイルが -で始まる、またはブランチの名前と同じ名前を持つ場合。ブランチ/ファイル曖昧さ回避のためのいくつかの例:

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" 

およびオプション/ファイル曖昧さ回避:あなたは名前が-で始まるブランチを持っている場合

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" 

私はあなたが何をするかわかりません。おそらく最初にそれをしないでください。このモードで


。 「チェックアウト」は他にもいくつかのことを行うことができます。 gitが他のほとんどのVCSと同じように「復帰」するのではなく、「チェックアウト」サブコマンドのモードとして「コミットされていない変更を破棄する」ことを選択した理由を理解できませんでした。

+11

git checkout は支店をチェックアウトします。 git checkout - は、ファイルのインデックスバージョンをチェックアウトします。 – dunni

+3

残念ながら、残念ながらgitのドキュメントでは実際にこのことについては説明していません – Carlton

+1

"Unix convention"に関しては、実際にはオプションと引数の間のセパレータとして '--'が広く実装されています。コマンドラインオプション( 'man 3 getopt'を参照)、' getopt(1) 'を使用するシェルスクリプト、そしてそれを実装するいくつかのプログラムを処理するためにPOSIX' getopt(3) 'を使うプログラム/自分自身ではあるが、働くことは万一保証されていない。 – arielf

5

--に続くものは、ファイル名(プログラム引数ではない)として扱われます。これは、たとえば、ダッシュで始まるファイル名がある場合などに重要です。

関連する問題