web-dev-qa-db-ja.com

git checkout- <files>は変更を破棄しませんか?

破棄しようとしている(ファイルの現在のインデックス付きバージョンにリセットする)作業ディレクトリに変更がありますが、git checkout -- <file>は変更を破棄しません。ファイル(rm -r files)を手動で削除してから、git checkout -- .を実行しようとしました。これにより、ファイルが再度変更されたものとして表示されます。

$ git checkout -- .
$ 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:   files/Hulk.png
#   modified:   files/Hulk_2.png
#
no changes added to commit (use "git add" and/or "git commit -a")

git diffを実行すると、ファイルが変更されたことが示されます。

diff --git a/files/Hulk.png b/files/Hulk.png
index 1c256cb..1d37fe0 100644
Binary files a/files/Hulk.png and b/files/Hulk.png differ
diff --git a/files/Hulk_2.png b/files/Hulk_2.png
index 1c256cb..0717199 100644
Binary files a/files/Hulk_2.png and b/files/Hulk_2.png differ

注:一部の人々はgit checkout .を実行すると述べていますが、これはgit checkout -- .と同じ結果を実現します。 --は、ツリー化/コミットポイントをファイル/パスと区別するためにgitcheckoutコマンドで使用される表記法です。

OS:OSX 10.6 Git:1.7.10.2

21
Highway of Life

これは、同じ名前で大文字と小文字が異なる複数のファイルが原因でした。大文字と小文字を区別しないOSXでは、同じ名前で大文字と小文字が異なる複数のファイルは好みません。それらを同じファイルとして表示します。これを修正するために、私はgit mv(または単にmv)を一時ファイル名に追加し、一時ファイルを追加しました。これにより、gitは古い/誤った名前のバージョンを削除し、2回目のコミットで名前を付け直すことができました。これは、同じ名前の異なるファイルを異なるケースにできるファイルシステムで修正することもできます。

22
Highway of Life

試しましたか

git config --global core.autocrlf false

または

git config --global core.filemode false
8
vinboxx

コメントに基づいて、大文字と小文字を区別するようにリポジトリを構成する必要があります。

git config core.ignorecase false

これにより、gitは両方のファイルを追跡できます(ファイルシステムには1つしか表示されないため、非常に混乱します)。 gitが大文字と小文字の区別を正しく追跡しているときに、何が起こっているかを示すためのレプリケーション手順は次のとおりです。

git init /tmp/test && cd /tmp/test
git config core.ignorecase false
echo test>test && git add test && git commit -m "lowercase t"
mv test Test

現在、git statustestとの違いを示していません。

git status -s
 ?? Test

Testをコミットし、git ls-filesを使用して、現在追跡しているものを確認します。

git add Test && git commit -m "uppercase T"
git ls-files
 Test
 test

lsは何を報告しますか?なぜ「テスト」だけなのか

ls
 Test

最後に、テストを変更するとどうなりますか?

echo garbage>Test
git status -s
 M Test
 M test

なんてめちゃくちゃ。

6
Christopher

使用する 。の代わりに -

git checkout .
2
bluesman

何らかの理由でこれと同じことが私にも起こりましたが、大文字と小文字の区別の問題ではありませんでした。ファイルを削除してからブランチを変更すると、問題が解決しました。

1
Igor

私の場合に役立ったのは:(vinboxxの答えも改善する)

次の方法で.gitattributesを構成しました。

* text eol=crlf

(マージ後に自動的に適切な形式を使用するように-Xを再正規化したかった)

git config core.autocrlf falseの設定とともにその行を一時的にコメント化した後。すべてが正常に戻りました。

1
mpasko256

私も同じ問題に直面しました。問題のある2つのファイルにDOSの行末文字が含まれていることがわかりました。私は問題を解決するためにこれを行いました。

1-別のクローンを使用して、UNIXで終わる行を変更します。2-問題が発生していたクローンを吹き飛ばし、クローンを再作成します。

0
Badal

加えた変更をすべて破棄したい場合は、

git checkout .
0
jugglinghobo

次にこの問題を回避するために、ファイルシステムを大文字と小文字を区別するように変換することにしました。

Mac OS(10.13.4)ではかなり簡単だと嬉しく思いました。

別のファイルシステムで新しいディスクボリュームをすばやく作成することができます。

  • ディスクユーティリティを実行する
  • コンテナをクリックします
  • ボリューム(+)をクリックします

新しいボリュームに「プロジェクト」という名前を付け、フォーマットをAPFS(大文字と小文字を区別)に設定しました。

その後、すべてのプロジェクトを新しいボリュームに移動しました。

0
Jan Swiatecki