Gitの変更を破棄できないようです


124

コマンドラインから以下を確認した後:

# On branch RB_3.0.10
# 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:   index.htm

次のコマンドを入力して、変更を破棄しようとしています。

git checkout -- index.htm

しかし、git statusを再実行すると、まったく同じに見えます。チェックアウトが機能していないようです。私は何か間違ったことをしていますか?Windows / cygwinでGIT 1.6.1.2を使用しています。

# On branch RB_3.0.10
# 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:   index.htm

4
git checkout HEAD -- index.htm(代わりにインデックスからチェックアウトすると、最後にコミットされた状態からチェックアウト)動作しますか?
JakubNarębski、2009年

3
git checkout HEAD -- index.htm私のために働いた!
Ben Tideswell 2014

回答:


52

これはしばらくの間私を悩ませてきました、私がチェックしたいと思うほとんどすべてのレポジトリは私が捨てることができなかった変更を持っていました。要するに、私は上記のすべてを試しましたが、何もうまくいきませんでした。これは、(Macで)通常の状態に戻すために行ったものです。

Completely remove the autocrlf & safecrlf settings from ~/.gitconfig
Completely remove the autocrlf & safecrlf settings from your repo's local config ./.git/config
git rm --cached -r .
git reset --hard

7
上記のすべてを試した後、これは私(Windows)で私のために働いた唯一のものでした
Anders

ありがとうございました!アンダースが言ったように、この解決策も私のために働いています。autocrlfを#autocrlfに置き換えました
David

37

これが私の経験です、次の変数を設定します.git/config

[core]
    autocrlf = false
    safecrlf = false
    eol = crlf

次にを実行する$ git checkout HEAD .と、機能します。しかし$ git checkout -- .、奇妙ではありません!

* gitバージョン1.9.3


35

git diffファイルにはどのような変更が表示されますか?Windowsでは、このような問題を引き起こす行末の問題を見てきました。その場合は、git config core.autocrlfとの設定を確認してくださいgit config core.safecrlf。いくつかあり、ここでこれらの設定のドキュメントが

私が言うには、もしあなたがgit svnsubversionとの統合に使っているなら、それautocrlfがオフになっていることを確認してください。私が言うことができることから、この構成では壊れているだけであり、変更checkoutを元に戻すためにを実行したときに、ほとんどのツールはファイルが変更されたと考えます。

あなたはあなたが問題を見ている場合はgit checkout、次にgit statusファイルを示して、まだ変更され、git diffショーはファイルは、ファイル内のすべての行に変更され、これはあなたが見ている問題です。

core.autocrlf

trueの場合、ファイルシステムからの読み取り時にテキストファイルの行末のCRLFをLFに変換し、ファイルシステムに書き込むときに逆変換します。変数をinputに設定できます。この場合、変換はファイルシステムからの読み取り中にのみ行われますが、ファイルは行末にLFが書き込まれます。現在、「テキスト」と見なされる(つまり、autocrlfメカニズムの対象となる)パスは、純粋に内容に基づいて決定されます。

core.safecrlf

trueの場合、core.autocrlfによって制御されるCRLFの変換が元に戻せるかどうかをgitチェックします。Gitは、コマンドが作業ツリー内のファイルを直接または間接的に変更するかどうかを確認します。たとえば、ファイルをコミットしてから同じファイルをチェックアウトすると、作業ツリーに元のファイルが生成されます。これがcore.autocrlfの現在の設定に当てはまらない場合、gitはファイルを拒否します。変数を「警告」に設定できます。その場合、gitは不可逆的な変換についてのみ警告し、操作は続行します。...


core.autocrlf = true core.safecrlfが設定されていません。これをWindowsでtrueに設定する必要がありますか?2つの違いは何ですか?

git svnを使用している場合は、両方ともオフのままにしておきます。さらに詳細を追加しました。
1800情報

4
私は彼がそれを少なくとも90度回転させることを意味していると思います
vijrox

2
core.autocrlfとcore.safecrlfの両方をtrueに設定すると、「git reset --hard HEAD」を実行して、問題のあるファイルで検出された変更を破棄できました。
Aleksey、2018年

19

合格する必要があると思います -f

manページから(man git-checkout、GIT-CHECKOUT(1)):

-f、--force
インデックスまたは作業ツリーがHEADと異なる場合でも続行します。
これは、ローカルの変更を破棄するために使用されます

たとえば、現在のブランチの変更を破棄し、別のブランチに切り替えます。

git checkout -f master

7
-fを何に渡しますか?答えを完全にするのは良いことです
PandaWood 2016年

@マット私の意図は別のブランチをチェックアウトすることではありませんでした。私は本当に覚えていますが、質問から判断していないので、答えは2009年からですが、私は私が合格するためのものだと思う-fのチェックアウトに- <ファイル名>のようにgit checkout -f -- filename
HASEN

@hasen明確化を求めていた3つのコメントがあったため、「たとえば」を追加しました。一例では、他の用途を排除するものではない-f
マット・H

私のために働いた。git checkout -f master「Already on 'master'」をスローしましたが、変更は失われました。
クリスチャン

11

@ 1800情報が示唆するように、それは行末である可能性がありますが、別の可能性は、違い(チェックアウトコマンドを使用してこれらのファイルを元に戻せないこと)がファイルモードの1つであることです。これは私に起こったことです。私のバージョンのgitでは、これを使用してこれを見つけることができます

git diff index.htm

そして、ファイルモードの変更を表示します。ただし、-fオプションを指定した場合でも、チェックアウトを使用して元に戻すことはできません。そのためには

git config core.filemode false

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

[芯]

filemode = false

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

git reset HEAD index.htm

そしてファイルは消えるはずです。

(私はこれをすべてgit ignoreモード変更(chmod)を行うにはどうすればよいですか?update-file-permissions-only-in-gitへの回答から得ました


6

OSXまたはWindowsを使用していますか?もしそうなら、問題はおそらく大文字と小文字が異なる同じ名前の2つのファイルがあることです。例えば。index.htmおよびIndex.htm

Windows、およびデフォルトのOSXでは、大文字と小文字を区別しないgitと競合する、大文字と小文字を区別しないファイルシステムを使用します。


2

私はこの問題を抱えており、上記のすべてを試した後、何もうまくいきませんでした。

私にとってうまくいったのは、ファイルがあったディレクトリを削除してからgit status、そのディレクトリ内のすべてのファイルが削除済みとしてマークされていることを確認することでした。その後、私は単にやったgit checkout -f、そしてすべてが正常に戻った。


1

私はlibGDXプロジェクトに取り組んでいて、行ったAndroid Studioすべての変更を破棄したいのですが、何もうまくいきませんでした。私が思いついた解決策は、すべての変更を新しいブランチにコミットすることでした

git checkout -b TRASH
git add .
git commit -m "discarded changes"
git checkout master

その後、必要にTRASH応じてブランチを削除できます。


1

私は同じ問題を抱えていました、上記のコメントからは何もうまくいきませんでした。私のファイルシステムでは大文字と小文字が区別されず(osxのデフォルトですが、Windowsはおそらく同じように動作します)、同じディレクトリ内に大文字と小文字の両方があり、内容が異なるファイルが存在します。私のコンピューターでは、両方の名前が同じファイルを指しているため、git statusは何をしたかに関係なく常に変更を示していました。問題を解決するには:

  • 別のコンピューターからファイルの1つを削除し、それをリポジトリにプッシュする必要がありました

  • ローカルバージョン全体を完全に削除する

  • 最初からgit cloneを実行


0

同様の問題が発生しました。存在しないか、変更されたファイルを破棄できません。私は仕事でVisual Studioを使用していますが、これはアプリの実行中にブランチを切り替えると発生することがわかりました。

git checkout捨てようとしても役に立たなかった。うまくいかないか、許可がないというだけです。

うまくいったソリューション:

  1. セーフモードに入る
  2. ファイルを破棄する

再起動は面倒ですが、これは100のことを試すよりも速く機能しました。


0

簡単な解決策があります。これが発生し(通常、予期しないWindowsのシャットダウンまたはメモリダンプから)、変更を破棄できず、ブランチを切り替えることもできない場合(Gitは十分な権限がないと言っています)。でWindows環境show all hidden files and foldersフォルダオプションから。GITディレクトリに移動し(で始まる必要が.gitあり"index.lock"ます)、ファイルを削除します。次に、Gitはやりたいことは何でもできるようにします。


0

私はいくつかを取り除くためにgit stash続いてa git stash cleanを行うことになりました。.git /または〜/ .gitに自動cr / lf構成が表示されませんでした。


0

私の場合、ディレクトリに関連する変更を破棄できませんでした。たとえば、git diffを実行すると、次のようになります。 -Subproject commit fdcccccccccccccccccccccccccccccccccccccc +Subproject commit f1bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb

そこで、そのディレクトリを呼び出して、そこにgitステータスを実行しました。ヘッドが外れた状態でした。そして、私git checkout masterはそこで走っただけです。それは私にとって正しいことを設定しました。しかし、これはここで尋ねられた正確なシナリオには役立ちません。


0

これは古い質問ですが、それでも私には関係がありました。私はオフィスの周りを尋ねるまで私の答えを見つけることができず、問題はサブモジュールにあることがわかりました。それらが更新され、独自のリポジトリにそれらの変更が反映されない場合、相違点として表示され、ヘッドをリセットしても役に立ちません。この場合は、次のコマンドを実行します。

git status update

それ物事を修正するのに役立つはずです(この特定の場合)


0

Windowsでアクセス許可の問題が発生しicacls containingFolder /reset /t /l /cたため、アクセス許可を元に戻すには、フォルダーをダブルクリックしなければなりませんでした。


0

私は次の内容の.gitattributesを持っていました:

* text=auto eol=lf

この問題を解決するには、編集.gitattributesしてこの行を削除し、行末を緩和します。次にgit reset --hard HEAD、ファイルと.gitattributesファイルを元に戻しました。


0

私にとって、この問題は、Netlify CMSを介してアップロードされ、Netlify Large Mediaハンドラーによって異なる方法で提供されるGit-LFSイメージのダウンロードの組み合わせで発生しました。

私の解決策は、これらの行をコメントアウト/削除して、~/.gitconfig以下のようにしてから、git statusもう一度チェックすることでした。

# [filter "lfs"]
#   clean = git-lfs clean %f
#   smudge = git-lfs smudge %f
#   required = true

または.gitconfig、レポルートのa を介してローカルフィルターを追加し、そこにあるlfsのフィルタールールを何らかの方法で上書きすることができます。

これが仲間を助けることを願っています。


-1

私も多少似た問題に直面し、次の手順が役立ちました。

git commit -am 'temp commit'
git pull origin master
git reset head~1
git reset head --hard

それが他の人々にも役立つことを願っています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.