「git checkout <filename>」と「git checkout--<filename>」の違い


115

http://norbauer.com/notebooks/code/notes/git-revert-reset-a-single-file

投稿を見つけました。

しかし、それでも何が違うのか分かりません

  1. git checkout <filename>

  2. git checkout -- <filename>

どのような状況で、最初のものと2番目のものをそれぞれ使用する必要がありますか?


1
Gitチェックアウトの二重ダッシュの意味」も参照してください。

回答:


214

特別な「オプション」--は、「この後のすべての引数を、それがどのように見えるかに関係なく、ファイル名として扱う」ことを意味します。これはGit固有ではなく、一般的なUnixコマンドラインの規則です。通常、これを使用して、引数がオプションではなくファイル名であることを明確にします。たとえば、

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

git checkout1--は、後続の引数が、必要なコミットを指定するオプションの「ツリー」パラメーターではないことも意味します。

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

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"

名前がで始まるブランチがある場合、どうすればよいかわかりません-。おそらくそもそもそれをしないでください。


このモードでは1。「チェックアウト」は他にもいくつかのことができます。私がgitが他のほとんどのVCSのように「元に戻す」やgit独自の用語でより意味があると思われる「リセット」ではなく、「チェックアウト」サブコマンドのモードとして「コミットされていない変更の破棄」を実装することを選択した理由を理解していません。


12
git checkout <name>はブランチ<name>をチェックアウトします。git checkout-<name>はファイル<name>のインデックスバージョンをチェックアウトします。
dunni 2011

3
ありがたいことに、残念ながらgitのドキュメントはこれを実際に説明していません
Carlton

1
「Unix規約」について:実際--、オプションと引数の間のセパレータとして広く実装されています。これは、POSIX getopt(3)を使用してコマンドラインオプション(を参照man 3 getopt)、を使用するシェルスクリプトgetopt(1)、およびそれ自体を実装する一部のプログラムを処理するすべてのプログラム/ユーティリティで機能しますが、正常に動作することは保証されていません。
arielf 2016年

ハァッ!他のコマンドラインプログラムでこの規則を見ることを忘れて C / C ++で--「変更を無効にする」ことを意味すると想定して、私は作業中の変更を破棄する方法の例を読み返し、それ以来ずっと考えていました。吹き飛ばされた心!
underscore_d

私のような人のために:名前マスターで混乱しないでください、彼はマスターではなくブランチという名前のファイルを意味します。
HarsH

7

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.