4

私は初めて git を使用していました。複数のプログラムが記述されたディレクトリがあり、次の手順を実行しました。

  1. やった git add .
  2. それgit commitから、それから私はメッセージを受け取りましたAborting commit due to empty commit message.
  3. 次に、共通メッセージの下でファイルのグループをコミットさせてください。そのため、追加されたすべてのファイルを削除することを考えました。
  4. だから私はしたgit rm -r -f
  5. 私がするとき、ls私はすべてのコードを失いました。それらを取り戻す方法はありますか?愚かなことに、バックアップ コピーすら持っていません。

私が今までフォローしてきたこと

コマンドのいくつかを見つけた人をグーグルで検索しましたが、それらは機能していません

git stashこのコマンドを入力すると、

致命的: 不正なリビジョン 'HEAD' 致命的: 不正なリビジョン 'HEAD' 致命的: 単一のリビジョンが必要です 最初のコミットはまだありません

git reset HEAD、このコマンドを入力すると、

致命的: あいまいな引数 'HEAD': 不明なリビジョンまたはパスが作業ツリーにありません。「--」を使用してパスをリビジョンから分離します

私は本当にそれらのファイルを取り戻す必要があります!

GITを作成するために従った手順

  1. mkdir BareRepo
  2. ディレクトリでBareRepo、、、_git initgit statusgit config --bool core.bare true
  3. 次に、BareRepo のクローンを作成しましたgit clone BareRepo/ Programs/
  4. ディレクトリで、Programs上記のすべてのことを行いました
4

2 に答える 2

6

中止されたコミットからファイルを回復できる場合があります

@the-malkolm の観察に基づいています。

質問の情報から、コミットはなく、ファイルはいつでも追跡されませんでした。そのため、git は削除されたファイルについて実際には知りません。

とは言え、希望はあります。ファイルを削除する前にファイルをコミットしようとしたという理由だけで、すべてのファイルが含まれた幻のコミットが浮かんでいます。

次に例を示します。

$ git init
Initialised empty Git repository in /tmp/so/.git/
$ echo "find this text" > README.md 
$ git add README.md 
$ git commit -v 
Aborting commit due to empty commit message.
$ git rm -rf .
rm 'README.md' 
$ git status
# On branch master
# 
# Initial commit
#
nothing to commit (create/copy files and use "git add" to track)

上記は質問のイベントをシミュレートします。通常、これはコードの書き直しを開始するときです。コミットはありません。ファイルはなくなりました。

中止されたコミットを特定する

.gitただし、リポジトリを検査すると、いくつかの情報が得られます。

$ tree .git/objects/
.git/objects/
├── 91
│   └── 9cdf847a6af7c655c8de1d101385f47f33e0f9
├── d6
│   └── 7d51abe2521dcd00cec138b72f5605125c1e41
├── info
└── pack

コミットがないにもかかわらず、git リポジトリにオブジェクトがあります。2 つのオブジェクトのどちらがツリーであるかを識別する必要があります。

$ git ls-tree 919cdf
fatal: not a tree object
$ git ls-tree d67d51
100644 blob 919cdf847a6af7c655c8de1d101385f47f33e0f9    README.md
$

最初の参照はREADME.md ファイルを表す blob です。リポジトリ内のファイルごとに 1 つの blob があり、この例の 2 番目はツリー参照です

作業コピーの再作成

ツリー ハッシュが識別されると、それを使用してread-treeでインデックスを再構築できます。

$ git read-tree d67d51abe2521dcd00cec138b72f5605125c1e41
$ git status
# On branch master
#
# Initial commit
#
# Changes to be committed:
#   (use "git rm --cached <file>..." to unstage)
#
#   new file:   README.md
#
# Changes not staged for commit:
#   (use "git add/rm <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   deleted:    README.md
$

この時点で、作業コピーは空ですが、失われたファイルはコミットのためにステージングされます

それらをコミットします。

$ git commit -m "phew"

そして、リポジトリのコミットされた状態に一致するようにチェックアウトします。

$ git checkout .
$ ls
README.md  

そして、すべてのファイルが存在し、コミットされています。

于 2013-07-21T14:56:55.507 に答える