11

git を使用するのは初めてで、既存のプロジェクトを github にインポートしたかったのですが、すべてが削除されました。答えを検索した後、git pull 後に git がファイルを削除したと思います。ファイルとフォルダーを復元しようとしていますが、その方法が見つかりません。

私はまさに次のことをしました:

jesus@jesus-K52F:~/Escritorio/Django/Ujixy$ git init
Initialized empty Git repository in /home/jesus/Escritorio/Django/Ujixy/.git/
jesus@jesus-K52F:~/Escritorio/Django/Ujixy$ git add .
jesus@jesus-K52F:~/Escritorio/Django/Ujixy$ git status
# On branch master
#
# Initial commit
#
# Changes to be committed:
#   (use "git rm --cached <file>..." to unstage)
#
#   new file:   Catalogoapp/__init__.py
#   new file:   Catalogoapp/models.py
#   new file:   Catalogoapp/tests.py
#   new file:   Catalogoapp/views.py
#   new file:   Messageapp/__init__.py
#   new file:   Messageapp/models.py
#   new file:   Messageapp/tests.py
#   new file:   Messageapp/views.py
#   new file:   Ujixyapp/__init__.py
[...]

jesus@jesus-K52F:~/Escritorio/Django/Ujixy$ git push origin master
fatal: 'origin' does not appear to be a git repository
fatal: The remote end hung up unexpectedly
jesus@jesus-K52F:~/Escritorio/Django/Ujixy$ git add *
jesus@jesus-K52F:~/Escritorio/Django/Ujixy$ git status
# On branch master
#
# Initial commit
#
# Changes to be committed:
#   (use "git rm --cached <file>..." to unstage)
#
#   new file:   Catalogoapp/__init__.py
#   new file:   Catalogoapp/models.py
#   new file:   Catalogoapp/tests.py
#   new file:   Catalogoapp/views.py
#   new file:   Messageapp/__init__.py
#   new file:   Messageapp/models.py
#   new file:   Messageapp/tests.py
#   new file:   Messageapp/views.py
#   new file:   Ujixyapp/__init__.py
[...]
jesus@jesus-K52F:~/Escritorio/Django/Ujixy$ git remote add origin https://github.com/PEREYO/Ujixy.git
jesus@jesus-K52F:~/Escritorio/Django/Ujixy$ git pull origin master
remote: Counting objects: 3, done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
From https://github.com/PEREYO/Ujixy
* branch            master     -> FETCH_HEAD
jesus@jesus-K52F:~/Escritorio/Django/Ujixy$ git push origin master
Username for 'https://github.com': PEREYO
Password for 'https://PEREYO@github.com': 
Everything up-to-date
jesus@jesus-K52F:~/Escritorio/Django/Ujixy$ git init
Reinitialized existing Git repository in /home/jesus/Escritorio/Django/Ujixy/.git/
jesus@jesus-K52F:~/Escritorio/Django/Ujixy$ git add *
jesus@jesus-K52F:~/Escritorio/Django/Ujixy$ git status
# On branch master
nothing to commit (working directory clean)

今、私は次のことを修正しようとしています:

jesus@jesus-K52F:~/Escritorio/Ujixy$ git fsck --lost-found
Checking object directories: 100% (256/256), done.
dangling tree bfe11a30d57a0233d3b0c840a3b66f6421987304
jesus@jesus-K52F:~/Escritorio/Ujixy$ git status
# On branch master
nothing to commit (working directory clean)
jesus@jesus-K52F:~/Escritorio/Ujixy$ git reflog
61daa69 HEAD@{0}: initial pull

jesus@jesus-K52F:~/Escritorio/Ujixy$ git cat-file -p bfe11a30d57a0233d3b0c840a3b66f6421987304
040000 tree 9196501a346cfe4347f46d82936745b78b0235b9    Catalogoapp
040000 tree 49561b4bd6adb8fe8bb1915d6bef09cd49195a97    Messageapp
040000 tree 0fb58bf9b56397443fb235e2a38045d6df7cd473    Ujixyapp
100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391    __init__.py
100644 blob dfe3388ddf2d5ba34559eb3ec56199d83cdce8bd    __init__.pyc
100644 blob bcdd55e27be9447bf6b224b8ba0cbc6802509862    manage.py
100644 blob 34c5978d8026844038d530b491828398bc3ea6c7    settings.py
100644 blob 167a6b1965426ec30c25535fe27338b61b2ae0cf    settings.pyc
100644 blob 4a7215cb90ae95d64ca30fde1c1277e0155eb4ed    urls.py
100644 blob 6eedcddafbc8854f70f44181edac8e63781cfb09    urls.pyc

しかし、すべてのファイルとフォルダーを含むディレクトリを回復するにはどうすればよいですか? 現在、別の問題を回避するために、.git フォルダーのコピーで作業しています。

4

4 に答える 4

15

ぶら下がっているツリー オブジェクトへの参照が既にあるので、順調に進んでいます。以下はうまくいくはずです: 最初にダングリング ツリーを Git のインデックスに復元します。

git read-tree bfe11a30d57a0233d3b0c840a3b66f6421987304

次に、回復したインデックスから作業ディレクトリを更新します。

git checkout-index -a
于 2013-05-07T01:24:56.940 に答える
2

ぶら下がっている木のオブジェクトを実行できたのでgit cat-file -p、回復できるはずです。それには多くの方法がありますが、すぐに思いつく 2 つを説明します。

  • ダングリング ツリーにファイルを取り込むための新しいコミットを作成します。このコミットには親がありません。

    echo "A commit to recover the dangling tree." | git commit-tree bfe11a30d57a0233d3b0c840a3b66f6421987304
    
    # Output:
    <SOME_NEWLY_CREATED_COMMIT_SHA1>
    

    新しいコミットには、先ほど見つけたダングリング ツリーの作業ツリーが含まれているはずです。上記のコマンドの出力には、作成された新しいコミット SHA1 が表示されます。

    現在の作業ツリーをこのコミットに切り替えるには:

    git checkout <SOME_NEWLY_CREATED_COMMIT_SHA1>
    

    これで、ダングリング ツリー コミットにリストされたすべてのファイルとコンテンツを確認できるはずです。ブラウズしたり、ファイルのバックアップを作成したり、好きなことをしたりできます ;)

  • 代替アプローチ:

    現在のコミットに加えて変更を取得したい場合は、このアプローチが役立つ場合があります。

    ツリーの内容を git のインデックス (つまり、この場合はステージング領域) に読み込みます。

    git read-tree bfe11a30d57a0233d3b0c840a3b66f6421987304
    

    現在チェックアウトされているブランチの上にあるステージング領域で変更をコミットします。

    git commit -m "Recover the lost files."
    

そして将来のために:

  • 常に変更をコミットしてください。将来コミットがぶら下がったとしても、(reflog を使用して) それらに到達するのははるかに簡単です。疑わしい場合は、git commitいつでもコミットを修正したり、変更を加えたり、履歴を書き換えたりすることができます。特に、git pullgit pushのようなコマンドを実行する前に、失われないように変更をコミットする必要があります。

  • リポジトリが既に初期化されていることを認識し、変更を上書きしないようにするのに十分スマートですがgit init、リポジトリで 2 回実行しないでください。git

于 2013-05-07T01:25:26.530 に答える
-1

そもそもコミットしていない場合、これらのファイルとフォルダーを回復できるとは思いません。Git は、リポジトリにコミットしたものをすべて復元できますが、そもそもコミットしていない場合、リポジトリ内にはまったくありません。これが、私が Dropbox フォルダー内で git を使用するのが好きな理由の 1 つです。

于 2013-05-07T01:11:18.650 に答える