ローカルに変更したと思われる2つのファイルがあるリポジトリがあります。
だから私はこれで立ち往生しています:
$ 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: dir1/foo.aspx
# modified: dir2/foo.aspx
#
no changes added to commit (use "git add" and/or "git commit -a")
git diff
は、ファイルの内容全体が変更されたと言っていますが、それは実際には見えません(diffが認識できない一般的な行範囲があるようです)。
興味深いことに、これらのファイルをローカルで変更したことを覚えていません。このレポジトリは、1つのリモートレポジトリ(プライベート、GitHub.com、FWIW)で使用されます。
何を試みても、これらのローカルな変更を破棄することはできません。私はすべて試しました:
$ git checkout -- .
$ git checkout -f
$ git checkout -- dir1/checkout_receipt.aspx
$ git reset --hard HEAD
$ git stash save --keep-index && git stash drop
$ git checkout-index -a -f
つまり、 Gitのステージングされていない変更を破棄するにはどうすればよいですか? 以上で説明されているすべてを試しました。ただし、2つのファイルは「変更されたがコミットされていない」ままです。
一体何が2つのファイルをこのようにスタックさせ、一見「un-revert-table」にするのでしょうか??
追伸私がすでに試したコマンドを示す上記のリストで、私は誤ってgit revert
私が意味する場合git checkout
。申し訳ありませんが、checkout
を試してみてくださいと回答してくださった方に感謝します。質問を編集して修正しました。私は間違いなくcheckout
を試しました。
ファイルの行末は何ですか?私は彼らがCRLFであることを賭けています。もしそうなら、このガイドをチェックしてください: http://help.github.com/line-endings/
つまり、コミット時に行末をLFに変換するようにgitが設定されていることを確認し、それらのファイルをコミットする必要があります。レポジトリ内のファイルは常にLF、 gitを正しく設定すると仮定した場合のOSのネイティブ。
私は同様の問題を解決しようとして何時間も費やしました-すべてのファイルを削除してgit checkout -f
もう一度(またはこの投稿の他のバリエーション)!
これらの4つのファイルは必要でしたが、私によって変更されていませんでした。私の最終的な解決策-Gitが変更されていないことを説得します。以下は、すべてのチェックアウトされたファイルに対して機能し、「変更済み」ステータスを表示します-実際に変更されたファイルを既にコミット/スタッシュしたことを確認してください!:
git ls-files -m | xargs -i git update-index --assume-unchanged "{}"
ただし、Mac OSXでは、xargsの動作は少し異なります(コメントについてはDaniel氏)。
git ls-files -m | xargs -I {} git update-index --assume-unchanged {}
次回はこれを自分のプレースホルダーとして追加しましたが、他の人にも役立つことを願っています。
-アル
これは、私の場合に同じ問題を修正した方法です:open .gitattributes change:
* text=auto
に:
#* text=auto
保存して閉じてから、元に戻すかリセットしてください。ヒントは@Simon Eastに感謝します。
別の可能性は、違い(チェックアウトコマンドでこれらのファイルを元に戻すことを妨げる)がファイルモードの1つであることです。これが私に起こったことです。 gitの私のバージョンでは、これを使用してこれを見つけることができます
git diff dir1/foo.aspx
また、ファイルモードの変更が表示されます。ただし、元に戻すことはできません。そのために使用
git config core.filemode false
または、次を追加して、テキストエディターでgit .configを変更します
[コア]
filemode = false
これを行った後、使用できます
git reset HEAD dir1/foo.aspx
ファイルが消えます。
(このすべてを gitにモード変更を無視させるにはどうすればよいですか(chmod)? )
ローカルの変更を元に戻す:
git checkout -- dir1/foo.aspx
git checkout -- dir2/foo.aspx
変更されたものとして表示されていたいくつかのファントム変更ファイルがありましたが、実際には同一でした。
このコマンドを実行すると時々が機能します:
(gitの「スマート」をオフにしますが、多くの場合役に立たない行末変換)
git config --local core.autocrlf false
しかし、別のケースでは、.gitattributes
いくつかの行末設定が存在するルート内のファイル。特定のファイルにautocrlf
を適用しようとしていました。実際には役に立たなかったので、.gitattributes
、コミット済み、ファイルは変更済みとして表示されなくなりました。
git checkout dir1/foo.aspx
git checkout dir2/foo.aspx
また、ディレクトリの名前の大文字小文字に関連する問題が発生した可能性もあります。同僚の何人かは、ディレクトリの名前をmyHandler to MyHandler後で元のディレクトリのファイルの一部をプッシュおよびプルした場合、リモートリポジトリに2つの別個のディレクトリがあり、Windowsの場合はローカルマシンに1つしかありませんでした。 1つだけ持つことができます。そして、あなたは困っている。
それが当てはまるかどうかを確認するには、リモートリポジトリが二重構造になっているかどうかを確認します。
これを修正するには、リポジトリの外部にある親ディレクトリのバックアップコピーを作成し、親ディレクトリを削除してプッシュします。プル(ここで、削除済みとしてマークされた2番目のプルがステータスに表示されるはずです)を行い、もう一度プッシュします。その後、バックアップから構造全体を再作成し、変更を再度プッシュします。
問題をよりよく理解するために、問題を再現する方法のヒントを提供すると役立つと思います。
$ git init
$ echo "*.txt -text" > .gitattributes
$ echo -e "hello\r\nworld" > 1.txt
$ git add 1.txt
$ git commit -m "committed as binary"
$ echo "*.txt text" > .gitattributes
$ echo "change.." >> 1.txt
# Ok let's revert now
$ git checkout -- 1.txt
$ git status
modified: 1.txt
# Oooops, it didn't revert!!
# hm let's diff:
$ git diff
warning: CRLF will be replaced by LF in 1.txt.
The file will have its original line endings in your working
directory.
diff --git a/1.txt b/1.txt
index c78c505..94954ab 100644
--- a/1.txt
+++ b/1.txt
@@ -1,2 +1,2 @@
-hello
+hello
world
# No actual changes. Ahh, let's change the line endings...
$ file 1.txt
1.txt: ASCII text, with CRLF line terminators
$ dos2unix 1.txt
dos2unix: converting file 1.txt to Unix format ...
$ git diff
git diff 1.txt
diff --git a/1.txt b/1.txt
index c78c505..94954ab 100644
--- a/1.txt
+++ b/1.txt
@@ -1,2 +1,2 @@
-hello
+hello
world
# No, it didn't work, file is still considered modified.
# Let's try to revert for once more:
$ git checkout -- 1.txt
$ git status
modified: 1.txt
# Nothing. Let's use a magic command that prints wrongly committed files.
$ git grep -I --files-with-matches --Perl-regexp '\r' HEAD
HEAD:1.txt
再現する2番目の方法:上記のスクリプトで次の行を置き換えます:echo "*.txt -text" > .gitattributes
withgit config core.autocrlf=false
残りの行はそのままにします
上記のすべては何を言いますか?テキストファイルcan )CRLFでコミットします(例:-text
in .gitattributes
/またはcore.autocrlf=false
)。
後で同じファイルをテキスト(-text
-> text
)として扱いたい場合、再度コミットする必要があります。
もちろん、一時的に元に戻すことができます( Abu Assar で正解)。私たちの場合には:
echo "*.txt -text" > .gitattributes
git checkout -- 1.txt
echo "*.txt text" > .gitattributes
答えはです:ファイルを変更するたびに同じ問題が発生するので、本当にやりたいですか?.
レコードの場合:
リポジトリでこの問題を引き起こす可能性のあるファイルを確認するには、次のコマンドを実行します(gitは--with-libpcreでコンパイルする必要があります)。
git grep -I --files-with-matches --Perl-regexp '\r' HEAD
ファイルをコミットすることにより(テキストとして処理したい場合)、このリンクで提案されていることと同じことです http://help.github.com/line-endings/ このような問題を修正するため。ただし、.git/index
を削除してreset
を実行する代わりに、ファイルを変更してからgit checkout -- xyz zyf
を実行してからコミットできます。
私にとって、問題は行末に関するものではありませんでした。それは、フォルダー名の大文字小文字の変更に関するものでした(Reset_password-> Reset_Password)。このソリューションは私を助けました: https://stackoverflow.com/a/34919019/132851