[解決済み] git status は変更を表示するが、git checkout -- <file> は変更を削除しない。
質問
作業コピーの変更をすべて削除したいのですが、どうすればいいですか?
実行中
git status
は、変更されたファイルを表示します。
何をやってもこれらの変更が削除されないようです。
例
rbellamy@PROMETHEUS /d/Development/rhino-etl (master)
$ git status
# On branch master
# Changed but not updated:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: Rhino.Etl.Core/Enumerables/CachingEnumerable.cs
# modified: Rhino.Etl.Core/Pipelines/SingleThreadedPipelineExecuter.cs
# modified: Rhino.Etl.Tests/Rhino.Etl.Tests.csproj
# modified: Rhino.Etl.Tests/SingleThreadedPipelineExecuterTest.cs
#
no changes added to commit (use "git add" and/or "git commit -a")
rbellamy@PROMETHEUS /d/Development/rhino-etl (master)
$ git checkout -- Rhino.Etl.Core/Enumerables/CachingEnumerable.cs
rbellamy@PROMETHEUS /d/Development/rhino-etl (master)
$ git status
# On branch master
# Changed but not updated:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: Rhino.Etl.Core/Enumerables/CachingEnumerable.cs
# modified: Rhino.Etl.Core/Pipelines/SingleThreadedPipelineExecuter.cs
# modified: Rhino.Etl.Tests/Rhino.Etl.Tests.csproj
# modified: Rhino.Etl.Tests/SingleThreadedPipelineExecuterTest.cs
#
no changes added to commit (use "git add" and/or "git commit -a")
rbellamy@PROMETHEUS /d/Development/rhino-etl (master)
$ git checkout `git ls-files -m`
rbellamy@PROMETHEUS /d/Development/rhino-etl (master)
$ git status
# On branch master
# Changed but not updated:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: Rhino.Etl.Core/Enumerables/CachingEnumerable.cs
# modified: Rhino.Etl.Core/Pipelines/SingleThreadedPipelineExecuter.cs
# modified: Rhino.Etl.Tests/Rhino.Etl.Tests.csproj
# modified: Rhino.Etl.Tests/SingleThreadedPipelineExecuterTest.cs
#
no changes added to commit (use "git add" and/or "git commit -a")
rbellamy@PROMETHEUS /d/Development/rhino-etl (master)
$ git reset --hard HEAD
HEAD is now at 6c857e7 boo libraries updated to 2.0.9.2 and rhino.dsl.dll updated.
rbellamy@PROMETHEUS /d/Development/rhino-etl (master)
$ git status
# On branch master
# Changed but not updated:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: Rhino.Etl.Core/Enumerables/CachingEnumerable.cs
# modified: Rhino.Etl.Core/Pipelines/SingleThreadedPipelineExecuter.cs
# modified: Rhino.Etl.Tests/Rhino.Etl.Tests.csproj
# modified: Rhino.Etl.Tests/SingleThreadedPipelineExecuterTest.cs
#
no changes added to commit (use "git add" and/or "git commit -a")
解決方法は?
このような動作が発生する原因は、複数あります。
行末の正規化
私もこの手の問題が発生したことがあります。それは、gitが自動的にcrlfをlfに変換してしまうことに起因しています。これは典型的な例で、一つのファイルの中で改行が混在している場合に起こります。インデックスでは正規化されているのに、git が作業ツリーのファイルと差分を取るために再度正規化し直すと、結果が違ってしまうのです。
しかし、これを解決したいのであれば、以下のように コア.autocrlf に変更し、すべての行末をlfに変更してから、再度有効にしてください。あるいは、こうすることで完全に無効化することもできます。
git config --global core.autocrlf false
の代わりに
core.autocrlf
を使用することもできます。
.gitattribute
ファイルを作成します。こうすることで、そのリポジトリを使用するすべての人が同じ正規化規則を使用するようにでき、改行コードがリポジトリに混入するのを防ぐことができます。
また コア.safecrlf 非可逆的な正規化が行われる際に git に警告させたい場合は、warn に設定します。
ギットの マンページ はこう言っています。
CRLF変換は、わずかな確率で を使用すると、データが破損する可能性があります。 コミット時にCRLFをLFに変換し、コミット時に チェックアウト時にLFをCRLFに変更します。ファイル LFとCRLFが混在している場合 コミット前に再作成することはできません。 を使用します。テキストファイルの場合、これは 行を修正します。 のみとなるようにします。 の末尾がリポジトリに表示されます。しかし バイナリファイルが誤って テキストに分類されることがあります。 はデータを破損してしまいます。
大文字・小文字を区別しないファイルシステム
大文字小文字を区別しないファイルシステムでは、同じファイル名で大文字小文字を区別したものがリポジトリにある場合、git は両方をチェックアウトしようとしますが、ファイルシステム上に残るのは片方だけです。git が2つ目のファイルを比較しようとすると、間違ったファイルと比較してしまうのです。
解決策としては、大文字小文字を区別しないファイルシステムに変更するか、片方のファイルを別のファイルシステムにリネームしてコミットするかですが、ほとんどの場合、これは実行不可能です。
関連
-
[解決済み] 現在のGit作業ツリーからローカル(未追跡)ファイルを削除する方法
-
[解決済み] Git が追跡したファイルを .gitignore に登録したまま「忘れる」ようにするにはどうしたらいいですか?
-
[解決済み] ローカルファイルシステムからファイルを削除せずに、Git リポジトリからファイルを削除する
-
[解決済み] Git でファイルの一部分のみをコミットする
-
[解決済み] detached HEADとmaster/originの連携はどうすればいいですか?
-
[解決済み] Git で、別のブランチの変更を選択的にマージしたり選択したりするにはどうすればよいですか?
-
[解決済み] git のコミットを削除しても、変更は維持できますか?
-
[解決済み] 単一ファイルのハードリセット
-
[解決済み】"git pull" でローカルファイルを強制的に上書きするには?
-
[解決済み】Gitバージョン管理でファイルの変更履歴を見る
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】ERROR: Error cloning remote repo 'origin'.
-
gitコミット発生 ! [リモート拒否] master -> master (pre-receive hook declined) 解決策
-
[解決済み】Git Push Error: リポジトリデータベースにオブジェクトを追加する権限が不足しています。
-
[解決済み] このリポジトリで別の git プロセスが実行されているようです。
-
[解決済み] 複数のコミットをチェリーピックする方法
-
[解決済み] GitHubに空のブランチを作成する
-
[解決済み] Git - node_modules フォルダをどこでも無視するようにしました。
-
[解決済み] git リモートリポジトリには、ローカルブランチにマージされていないコミットが含まれています。
-
[解決済み] エラーです。リベースを使用してプルできません。あなたはステージングされていない変更を持っています
-
[解決済み] git reset --hard の後に残る未ステージ化変更点