削除したい2番目のファイル(最初は現在.gitignoreにあるJetBrainsの.ideaフォルダーファイル)でこのコマンドを実行していますが、次のことができません。
git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch gf5/console/basic.php' --Prune-empty --tag-name-filter cat -- --all
Cannot rewrite branches: You have unstaged changes.
それで、リストされていないときにgitが参照している「ステージングされていない」ファイルをどのようにして知ることができますか、そしてこれをどのように修正しますか?
PS問題はスタッシュではありません。私はこのレポにスタッシュを持っておらず、スタッシュも行っていません。
注:私はgit status
そしてこれを受け取る:
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: gf5/console/basic.php
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
//(and a whole long list of files)
あはは!私は何が起こっているのか理解しました。少し洞察を得るために最後の数文を読んでください。
答えは最初に行うことでした:
git status
これは、変更されたファイルをREDで示しました。これは、gitの頭の中で何らかの形で「削除」されていることを意味していると思います。私はそれからしました:
git add --all
そこから、SourceTreeを使用してすべてのステージングされたファイルをコミットしました(申し訳ありませんが、コマンドラインにずっととどまりませんでした)。私は先に進み、同時にサーバーに変更をプッシュしましたが、それはオプションです。
その後、上記のコマンドは正常に機能しました。
上記のコマンドを別のファイルで実行しようとすると、同じ問題が発生しました。だから私は再びgit status
を実行しましたが、履歴から削除したばかりのファイルがまだthereであることがわかりましたので、これを行う必要があります:
git rm /previous_file_you_just_removed_from_history.php
また、明確にするために、filter-branchコマンドはすべてのコミットからそのファイルの履歴を削除しますが、そのファイルに加えた変更は削除しません。つまり削除されたファイルは、その時点までに行ったすべての変更の合計です。これが他の誰かのためにこの概念を明確にするのに役立つことを願っています。
私はこれと同じ問題を抱えていました。新しいクローンの直後にすべてのファイルが変更されたものとして表示され、Tortoise Gitがチェックアウトとコミット時にすべてのファイルの行末を自動的に変更していたことが原因であることがわかりました(私の場合)。
この動作を防ぐには、リポジトリ設定ウィンドウでAutoCrLf
設定を無効にします(Git
-> Config Source [Local]
-> AutoCrlf
) この質問。 で説明されているように