2

チェックインしてはならないバイナリをいくつか削除したかったので、git リポジトリから機密ファイルを削除するための GitHub の指示に従いました。

git filter-branchコマンドの最初の呼び出しは次のエラーで失敗しました:

ダーティな作業ディレクトリでブランチを書き換えることはできません。

ローカルの変更があったためです。そのため、これらの変更を で隠しgit stash、filter-branch コマンドを再実行しました。

次に、GitHub の指示に従って次のコマンドを実行しました。

rm -rf .git/refs/original
git reflog expire --expire=now --all
git gc --prune=now
git gc --aggressive --prune=now

バイナリの削除は問題なく機能しているようです。ただし、今git stash list入力すると、古いマスターに追加した stash エントリが表示されません。

私が持っているのはgit stash、filter-branch コマンドを 2 回目に実行する前の出力だけです。

Saved working directory and index state WIP on master: a19db18 LOG_MESSAGE
HEAD is now at a19db18 LOG_MESSAGE

また、a19db18332b19ea41be888eccfc07e6680d8d6dd書き換えられたコミットの 1 つでした。

隠した変更を取得する方法はありますか?

4

1 に答える 1

1

stash コミット オブジェクトの SHA1 ハッシュを覚えていない限り (そうです、stash は commit オブジェクトを作成します)、stash が失われる可能性があります。1 つのオプションはgit fsck --lost-found、ダングリング コミット オブジェクトを使用して探すことです。次に、隠し場所であるものが見つかるまで、1つずつ確認する必要があります. gitk を使用してこれらすべてのコミットを表示し (git fsckこれを行う方法の例についてはヘルプ ページを参照してください)、隠しコミットをより簡単に見つけることができます。コミットを見つけたら、git cherry-pickそれぞれで使用し、競合をクリーンアップしてgit reset HEAD~2から実行できます (各スタッシュには 2 つのコミットがあるため)。あなたはそれから行ってもいいはずです。

私は stash をしたことがなく、フィルターブランチのような危険なことをしたことがありません。将来的には、進行中の作業を実際にコミットすることをお勧めします。おそらく、新しいブランチに配置します。その後、危険な操作を実行します。その後、上記のように混合リセットでコミットをロールバックできます。

于 2011-01-30T17:41:20.860 に答える