1. ホーム
  2. git

誤ってチェックアウトした後、変更内容を元に戻すには?

2023-09-13 07:39:01

質問

以下は私のレポの状態でした。

[~/rails_apps/jekyll_apps/nepalonrails (design)⚡] ➔ gst
# On branch design
# Changed but not updated:
#   (use "git add/rm <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   modified:   _layouts/default.html
#   deleted:    _site/blog/2010/04/07/welcome-to-niraj-blog/index.html
#   deleted:    _site/blog/2010/04/08/the-code-syntax-highlight/index.html
#   deleted:    _site/blog/2010/05/01/showing-demo-to-kalyan/index.html
#   deleted:    _site/config.ru
#   deleted:    _site/index.html
#   deleted:    _site/static/css/style.css
#   deleted:    _site/static/css/syntax.css
#   modified:   static/css/style.css
#
no changes added to commit (use "git add" and/or "git commit -a")

正確には、私が行った git checkout -f を実行したのですが、今、その変更はなくなりました。これは、私が行うことになっていませんでした。

[~/rails_apps/jekyll_apps/nepalonrails (design)⚡] ➔ git co -f
[~/rails_apps/jekyll_apps/nepalonrails (design)] ➔ gst
# On branch design
nothing to commit (working directory clean)
[~/rails_apps/jekyll_apps/nepalonrails (design)] ➔ 

変更を元に戻すことはできますか?

どのように解決するのですか?

プライベートなデータ(インデックスに追加されず、コミットもされていない、つまりgitに知られていないデータ)は、現在の作業ディレクトリに他のバックアッププロセスがない限り、復元できないと思います。

で提案されていない場合でも Git Aliases ページ のように、チェックアウトのエイリアスが必要だと思います。 alias rm /bin/rm -i があるように)。

[alias]
co = !sh -c 'git stash; git stash apply; git checkout "$@"'

で、' git stash; git stash apply で使用されるチェックポイント技術です。 ブライアン・キャンベル 彼の答え .

季節 プロポーズ コメントで :

co = "!git stash push -m \"co backup\"; git stash apply; git checkout \"$@\"" 

なお、バックアップの隠し場所を伝えるためのメッセージを追加しました。-

この問題は、この動作に関する以下のような議論を思い出させます。 ycombinator (抜粋) を思い出しました。


私はgitでたくさんのデータを失いました。

そのほとんどは、データを削除するときに確認を求めない無難な響きのコマンドと関係があります .

たとえば git checkout filenamesvn revert filename .

もちろん git checkout branchname は全く違うことをします。

ブランチとファイルが同じ名前を共有している場合、git はデフォルトでブランチを切り替えますが、それでも bash のオートコンプリートがその日を台無しにするのを止めることはできません。

無害な動作と危険な動作がある場合、同じコマンドでラベル付けをしないことです。


うっとうしいかもしれませんが、これは設計ミスではなく、ユーザーエラーです。git では、作業コピーを無損失に破棄したい場合、単に " git stash とすることができます。

あなたの論理では、"rm" は、以下を渡すときに確認を要求しないので欠陥があります。 -f ではなく -i . まあ、そうなんだけど。すみません。


<ブロッククオート

あなたの例えは、次のような場合、より正確になります。 rm somenameapt-get update と同じであり rm othernamerm -fr othername .

それにしても、"が正しいわけがない。 get checkout foo は、カレントディレクトリに foo というファイルがあるかどうかによって、2 つの全く異なる処理のうちの 1 つを行います。


もうひとつ、とんでもないアイディアがあります。 git checkout ... ' をダーティなワークツリー上で実行しないことです。問題は解決しました。

もうひとつは、ファイル名をブランチ名として再利用しないことです。

正直に言うと、私は不注意な'co'の呼び出しに同じ問題を抱えています。 rm の不用意な呼び出しで一日が台無しになることはありますが、私が罵声を浴びせるのは私の怠惰や愚かさに対してであって、bashの補完や' rm '