web-dev-qa-db-ja.com

Git:「変更されたがコミットされていない」で頑固にスタックしている2つのファイルを元に戻す方法は?

ローカルに変更したと思われる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を試しました。

78

ファイルの行末は何ですか?私は彼らがCRLFであることを賭けています。もしそうなら、このガイドをチェックしてください: http://help.github.com/line-endings/

つまり、コミット時に行末をLFに変換するようにgitが設定されていることを確認し、それらのファイルをコミットする必要があります。レポジトリ内のファイルは常にLF、 gitを正しく設定すると仮定した場合のOSのネイティブ。

31
Tekkub

私は同様の問題を解決しようとして何時間も費やしました-すべてのファイルを削除して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 {}

次回はこれを自分のプレースホルダーとして追加しましたが、他の人にも役立つことを願っています。

-アル

106
Alan Forsyth

これは、私の場合に同じ問題を修正した方法です:open .gitattributes change:

* text=auto

に:

#* text=auto

保存して閉じてから、元に戻すかリセットしてください。ヒントは@Simon Eastに感謝します。

20
Abu Assar

別の可能性は、違い(チェックアウトコマンドでこれらのファイルを元に戻すことを妨げる)がファイルモードの1つであることです。これが私に起こったことです。 gitの私のバージョンでは、これを使用してこれを見つけることができます

git diff dir1/foo.aspx

また、ファイルモードの変更が表示されます。ただし、元に戻すことはできません。そのために使用

git config core.filemode false

または、次を追加して、テキストエディターでgit .configを変更します

[コア]

filemode = false

これを行った後、使用できます

git reset HEAD dir1/foo.aspx

ファイルが消えます。

(このすべてを gitにモード変更を無視させるにはどうすればよいですか(chmod)?

11
Eyal

ローカルの変更を元に戻す

git checkout -- dir1/foo.aspx
git checkout -- dir2/foo.aspx
3
Tadeck

変更されたものとして表示されていたいくつかのファントム変更ファイルがありましたが、実際には同一でした。

このコマンドを実行すると時々が機能します:
(gitの「スマート」をオフにしますが、多くの場合役に立たない行末変換)

git config --local core.autocrlf false

しかし、別のケースでは、.gitattributesいくつかの行末設定が存在するルート内のファイル。特定のファイルにautocrlfを適用しようとしていました。実際には役に立たなかったので、.gitattributes、コミット済み、ファイルは変更済みとして表示されなくなりました。

3
Simon East
git checkout dir1/foo.aspx
git checkout dir2/foo.aspx
2
Steve Prentice

また、ディレクトリの名前の大文字小文字に関連する問題が発生した可能性もあります。同僚の何人かは、ディレクトリの名前をmyHandler to MyHandler後で元のディレクトリのファイルの一部をプッシュおよびプルした場合、リモートリポジトリに2つの別個のディレクトリがあり、Windowsの場合はローカルマシンに1つしかありませんでした。 1つだけ持つことができます。そして、あなたは困っている。

それが当てはまるかどうかを確認するには、リモートリポジトリが二重構造になっているかどうかを確認します。

これを修正するには、リポジトリの外部にある親ディレクトリのバックアップコピーを作成し、親ディレクトリを削除してプッシュします。プル(ここで、削除済みとしてマークされた2番目のプルがステータスに表示されるはずです)を行い、もう一度プッシュします。その後、バックアップから構造全体を再作成し、変更を再度プッシュします。

1
smexy

問題をよりよく理解するために、問題を再現する方法のヒントを提供すると役立つと思います。

$ 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
with
git 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を実行してからコミットできます。

1
Marinos An

私にとって、問題は行末に関するものではありませんでした。それは、フォルダー名の大文字小文字の変更に関するものでした(Reset_password-> Reset_Password)。このソリューションは私を助けました: https://stackoverflow.com/a/34919019/132851

1
Zhenya