249

作業コピーへのすべての変更を削除したいと考えています。
実行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")
4

24 に答える 24

246

私はWindowsでこの問題を抱えていましたが、使用の影響を調べる準備ができていconfig --global core.autocrlf falseませんでした。また、隠し場所にある他のプライベートブランチやグッズを放棄して、新しいクローンから始める準備もできていませんでした. 私はただ何かを成し遂げる必要があります。今。

gitに作業ディレクトリを完全に書き換えさせるという考えで、これは私にとってはうまくいきました:

git rm --cached -r .
git reset --hard

(元の質問へのコメントで提案されているように、実行するだけgit reset --hardでは十分ではなくrm、ファイルのプレーンでもなかったことに注意してください)reset

于 2013-09-13T18:14:48.500 に答える
139

この動作を引き起こす可能性のある問題は複数あります。

行末の正規化

私もこのような悩みを抱えてきました。それは、crlfをlfに自動的に変換するgitに帰着します。これは通常、1 つのファイル内で行末が混在していることが原因です。ファイルはインデックスで正規化されますが、git が再度非正規化して作業ツリー内のファイルと比較すると、結果は異なります。

ただし、これを修正したい場合は、core.autocrlfを無効にし、すべての行末を lf に変更してから、再度有効にする必要があります。または、次のようにして完全に無効にすることもできます。

git config --global core.autocrlf false

core.autocrlfの代わりに、ファイルの使用を検討することもでき.gitattributesます。このようにして、リポジトリを使用する全員が同じ正規化ルールを使用していることを確認し、混合された行末がリポジトリに入るのを防ぐことができます。

また、元に戻せない正規化が実行されるときに git に警告してもらいたい場合は、core.safecrlfを警告するように設定することを検討してください。

gitマンページには次のように書かれています。

CRLF 変換では、データが破損する可能性がわずかにあります。autocrlf=true は、コミット時に CRLF を LF に変換し、チェックアウト時に LF を CRLF に変換します。コミット前に LF と CRLF が混在するファイルは、git で再作成できません。テキスト ファイルの場合、これは正しいことです。行末を修正して、リポジトリに LF 行末のみが含まれるようにします。ただし、誤ってテキストとして分類されたバイナリ ファイルの場合、変換によってデータが破損する可能性があります。

大文字と小文字を区別しないファイル システム

大文字と小文字を区別しないファイルシステムでは、大文字と小文字が異なる同じファイル名がリポジトリにある場合、git は両方をチェックアウトしようとしますが、ファイル システムには 1 つしかありません。git が 2 番目のファイルを比較しようとすると、間違ったファイルと比較されます。

解決策は、大文字と小文字を区別しないファイルシステムに切り替えることですが、ほとんどの場合、これは実行できないか、別のファイルシステムのファイルの 1 つを名前変更してコミットします。

于 2010-01-06T21:34:25.593 に答える
78

今後この問題が発生する場合: ファイルモードを変更すると、同じ症状が発生する可能性があります。 git config core.filemode falseそれを修正します。

于 2012-12-06T18:00:37.433 に答える
12

同じ問題を抱えた.batファイルがありました(追跡されていないファイルでそれを取り除くことができませんでした)。git checkout -- 機能しませんでした。このページの提案も機能しませんでした。私のために働いた唯一のことは、次のことでした:

git stash save --keep-index

そして、スタッシュを削除するには:

git stash drop
于 2014-02-07T00:56:32.990 に答える
9

同じ問題が 2 回発生しました。どちらの場合も、私が行ったいくつかの変更を隠してから、それらを元に戻そうとしました。変更されたファイルがたくさんあるため、変更をポップできませんでした-しかし、そうではありません! それらはまったく同じです。

上記の解決策をすべて試してみましたが、成功しなかったと思います。を試した後、

git rm --cached -r .
git reset --hard

これで、リポジトリ内のほぼすべてのファイルが変更されました。

ファイルを比較すると、すべての行を削除してから再度追加したと表示されます。

ちょっと邪魔です。私は今、将来の隠し場所を避けます..

唯一の解決策は、新しいリポジトリを複製して最初からやり直すことです。(前回作った)

于 2015-06-05T08:58:58.810 に答える
4

* text=autoこれを修正するには、レポの .gitattributes ファイル (とを定義) を一時的に削除するしかありませんでした*.c text

git status削除後に実行したところ、変更がなくなりました。.gitattributes が元の場所に戻された後でも、それらは返されませんでした。

于 2013-09-13T10:08:19.797 に答える
2

一貫した行末を持つことは良いことです。たとえば、些細なことではありますが、不必要なマージはトリガーされません。Visual Studio が行末が混在するファイルを作成するのを見てきました。

また、bash (Linux の場合) などの一部のプログラムでは、.sh ファイルを LF で終了する必要があります。

これを確実に行うには、gitattributes を使用できます。autcrlf の値に関係なく、リポジトリ レベルで機能します。

たとえば、次のような .gitattributes を持つことができます: * text=auto

あなたのケースで問題があった場合は、ファイルの種類/拡張子ごとに具体的にすることもできます。

その後、autocrlf は Windows プログラムの行末をローカルに変換できます。

C#/C++/Java/Ruby/R、Windows/Linux が混在するプロジェクトでは、これはうまく機能しています。これまでのところ問題はありません。

于 2012-06-13T03:10:41.087 に答える
2

この問題は、リポジトリへの貢献者が Linux マシンで作業している場合、または Cygwin とファイルのアクセス許可を持つウィンドウが変更されている場合にも発生する可能性があります。Git は 755 と 644 しか認識していません。

この問題の例とその確認方法:

git diff styleguide/filename

diff --git a/filename b/filename
old mode 100644
new mode 100755

これを回避するには、次を使用して git を正しくセットアップする必要があります。

git config --global core.filemode false
于 2015-04-10T13:40:15.600 に答える
2

私も同じ症状でしたが、別の原因でした。

私はできませんでした:

git checkout app.js //did nothing
git rm app.js //did nothing
rm -rf app.js //did nothing

削除されたとしても git rm --cached app.js署名され、追跡されていないファイルには app.js が表示されます。しかし、もう一度実行しようrm -rf app.jsとするとgit status、ファイルが「追跡されていません」と表示されます。

同僚と数回試したところ、Grunt が原因であることがわかりました。

がオンになっGruntており、app.js が他の 2 つの js ファイルから生成されているため、js ファイル (この app.js も) を操作するたびに、app.js を再作成する必要があることがわかりました。

于 2014-10-01T10:19:04.573 に答える
1

リポジトリをクローンして保留中の変更がすぐに表示される場合、リポジトリは一貫性のない状態にあります。ファイル* text=autoからコメントアウトしないでください。.gitattributesこれは、リポジトリの所有者がすべてのファイルを一貫して LF 行末で保存することを望んでいるため、特にそこに配置されました。

HankCa が述べているように、 https: //help.github.com/articles/dealing-with-line-endings/ の指示に従うことが問題を解決する方法です。簡単ボタン:

git clone git@host:repo-name
git checkout -b normalize-line-endings
git add .
git commit -m "Normalize line endings"
git push
git push -u origin normalize-line-endings

次に、ブランチをリポジトリの所有者にマージ (またはプル リクエスト) します。

于 2016-12-05T20:44:02.653 に答える
0

.git / config を編集して解決し、以下を追加しました。

[branch "name_branch"]
    remote = origin
    merge = refs/heads/name_branch

次に、.git/refs/heads/name_branch に移動し、最後のコミットの ID を配置しましたenter code here

于 2018-11-16T15:34:11.800 に答える