の奇妙な動作に気付きましたgit diff
:
いくつかの作業ファイルを HEAD と比較したい、たとえばdir/a.h
and dir/a.cc
.
使用するgit diff HEAD
とうまく機能しますが、変更したファイルはこれら 2 つ以上です。そこで、コマンドを に変更しましたgit diff HEAD -- * a.*
。驚いたことに、HEAD でこれら 2 つのファイルを見つけることができず、それらを新しく追加されたものとして扱います。
$ git diff --stat HEAD
dir/a.cc | 32 ++++++++++----------------
dir/a.h | 12 +++++-----
2 files changed, 18 insertions(+), 26 deletions(-)
$ git diff --stat HEAD -- *a.*
dir/a.cc | 208 +++++++++++++++++++++++++++
dir/a.h | 142 ++++++++++++++++++
2 files changed, 350 insertions(+), 0 deletions(-)
================================================== =====================
更新: コード ベースに特別なことを避けるために、テスト用に新しいディレクトリと 2 つの新しいファイルを追加しました。
最初に dir2/bh と dir2/b.cc をコミットしました。どちらのファイルも 1 行の内容しかありません。次に、これらのファイルに小さな変更を加えて、git diff をテストしました。
これは正しい動作です:
$ git diff --stat HEAD
dir2/b.cc | 2 +-
dir2/b.h | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
これも正しいです:
$ git diff --stat HEAD -- dir2/*b.*
dir2/b.cc | 2 +-
dir2/b.h | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
しかし、これは奇妙です (両方のファイルを新規として扱います):
$ git diff --stat HEAD -- *b.*
dir2/b.cc | 1 +
dir2/b.h | 1 +
2 files changed, 2 insertions(+), 0 deletions(-)
@Chronial、私はレポのルートディレクトリにいます。@jszakmeister、これらの 2 つのファイルは新しいだけなので、名前の変更/移動とは関係ないようです...
「gitステータス」は正しいです:
$ git status
# On branch master
# Changes not staged for commit:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: dir2/b.cc
# modified: dir2/b.h
#
no changes added to commit (use "git add" and/or "git commit -a")
bashの「*」マッチングに関する問題ではないかと思います。しかし、まだ行動が理解できません...