2010-12-29 3 views
7

私は現在、gitを学んでいますが、通常はVCSに少し懐疑的です。本当にgitで何も削除されていませんか?

いくつかのtmpファイルで "experimental"というブランチを削除しましたが、作業ディレクトリでファイルが削除されていることがわかりましたので、頭が傷ついていて、これが正常かどうか疑問に思っていました。

SHAがtmpファイルのコミットを見つけ、提供されたshaを使ってブランチを再作成し、すべてのファイルとその現在の内容を再確認しました。

私が作業ディレクトリに行ったことはすべて、コミットした後に元に戻すことができますか?でき

は、多くの人々に愚かな質問のように見えるかもしれませんが、それはちょっと私を陰謀ので、私は限界

答えて

7

ファイルに対応する変更をコミットした場合、ほぼすべてのアクションを元に戻すことができます。ブランチを強制的に削除したりハードリセットを行ったりしても、git reflogまたはgit fsckを使用して緩いコミットオブジェクトを見つけることができます。

の場合、緩いオブジェクトはgit gcで時折クリーンアップされるため、しばらくしてから回復することはできません。

+0

到達不能なオブジェクトを直ちに刈り取るために 'git gc'のための低い' gc.pruneexpire'設定を意図的に設定する必要があります。最後の文は 'git gc'を手動で実行することが特別であるかもしれないことを意味します。 –

+0

@Charles:私は最後の文章を改めました。あなたが正しいです、私は手動の 'git gc'がすぐにゆるいオブジェクトをプルーニングすることを意味しませんでした。私は 'git gc'が自動的に実行されることに注意したいと思いますが、手動でも実行できます。 – 3lectrologos

+0

この回答は、ローカルのgitリポジトリにのみ適用されますか、プッシュされるとリモートに適用されますか(たとえば、集中管理されたリモートの場合)? – nha

1

git reset --hardを知りたい作業 ディレクトリに私が不可逆的に

+0

-1: 'git reset -hard'は元に戻せません。 – 3lectrologos

+0

@ 3lectrologos hmm interesting ...どうやって元に戻すことができますか? – seriyPS

+2

@ 3lectrologosは「一度コミットする」という状態を想定していると思います。 –

2

すべての変更を削除することができます一度私は をコミットして元に戻す?

はいできます。たとえば、git reflogを試してみてください。これにより、現在のブランチに というコミットのリストが表示されます。 sha1 sumで1を選択し、git checkout 45db2a...と入力します。それはコミットをチェックします。変更する場合は、その時点からgit checkout HEADまたはgit checkout -b newbranchにしてください。

git to cherryを使って、現在のHEADの上にこれらのコミットを選択することもできます(つまり、別のブランチで完了している場合は、それらを取り込むことができます)。 This質問は私ができるよりもはるかに優れています。

+0

答えを見た後、ちょっと混乱してしまいました。ちょっと混乱しますが、それほど違いはありません(少なくとも私にとってはサーバーにプッシュ/プルするときに違いがあります)。今、私はstackoverflowまたはここで質問するかどうかわからないが、なぜ "git rm" dry-runは機能しないのですか?プライベートサーバーに反映させるために、ディレクトリ全体を削除する必要がありました。私は自分のファイルを保存し、サーバ上のファイルを削除したい。 – allenskd

+0

ああ、そうだ。 'git push remotename:branchname'(奇妙な構文で、' git push branchname'はそれをプッシュします。違いは単なる ':')です。あなたが個々のコミットを使ってこれを行うことができるかどうかは分かりませんが、それは面白い質問です。 –

2

深刻なVCSの主なポイントは、プロジェクトの全履歴を永続的かつ不変な方法で保持することです。だから、いつでもあなたの仕事の任意のリビジョンに行くことができます。

gitにはストレージへの参照がない場合にオブジェクトを削除できるという点で、gitの特別な動作があります。参考文献は以下のとおりです。

  • 枝の各HEAD
  • タグ(私は参照されない注釈付きのタグがまだアクティブな基準となるのかはわからない)
  • それぞれ別によって参照されているコミットが
  • をコミット

これは、ブランチの一部であるすべてのコミットが保持され、タグ付けされる各オブジェクト(ほとんどがコミット)も保持することを意味します。gitは、最後の日に作成したすべてのオブジェクトへの参照を保持している、各ブランチ上のいわゆるreflog(非アクティブ化されていない限り)もあります。オブジェクトがブランチ、タグ、またはreflogによって参照されない場合、git gcはそれをデータベースから削除します。これは、ハッキングブランチを作成し、そこにあるものをコミットし、別のブランチにマージせずにこのブランチを削除した場合の典型的な例です。

関連する問題