2013-05-01 5 views
5

Gitの強みの1つは、ポインタで動作するため、deleting a commit or commitsまたはcreating and deleting remote branchesなどの幅広いタスクを元に戻すのは比較的簡単です。多くの場合、実際に実行する必要があるのは、現在のブランチのHEADポインタを目的の場所に正しくリセットしてから、元に戻します。これは非常に幅広いケースを網羅しています。元に戻すのは難しい/実行不可能ないくつかのアクションはありますか?

リポジトリ全体または不正なプッシュを削除する以外に、標準のGitリポジトリで元に戻すことができない、または元に戻すことが非常に難しい、最も重要でない操作は何ですか?

+3

この点は分かりません。 – Mat

+1

この質問やそれに類似する点を私は理解しています。本質的に、それは "どこでドラゴンになるのですか?"この質問は「建設的ではない」とは遠く離れていますが、プログラマーズ・スタック・エクスチェンジにとってはより適しています。新しい技術を使い始めるとき、開発者はしばしばドラゴン、落とし穴、ブービートラップがどこにあるか知りたいと思うことがあります。 –

答えて

3
  • git cleanは、untrackedファイルを削除します。それらはgitで復元することはできません。

  • 汚れた作業ツリーを使用すると、復元が困難なものになる可能性があります。

要するに、gitによって追跡されないものは、gitによって復元できません。他のすべては回復可能です。

+0

実際、gitによって追跡されるすべてのものを復元することはできません。ブランチを削除すると永続的に見えます。ブランチの削除が起こることが明らかでない方法さえある。 'git push - mirror REMOT';ローカルのブランチがリモートにある場合、リモートブランチは非対話的に削除されます。 ([Cfのgitのヘルプページからの抜粋](https://git-scm.com/docs/git-push#_options_a_id_options_a):「--mirror [...]新しく作成されたローカルレフリーは、リモートにプッシュされますリモートエンドからエンド、ローカルに更新レフリーが力リモート側で更新され、**削除レフリーが削除されます**」) –

3

アクションを元に戻すことは困難の例は次のようになります。

git branch -D some-unmerged-branch-such-as-master 
git gc --prune=now --aggressive 

最初のいくつかのコミットへの参照を除去します。 2つ目はすべてのコミットを参照なしで削除します。

私はこの質問が、誰かのレポをゴミ箱に入れたくないのではなく、単に遊び心のある問題だと思っていますが、分散バージョン管理に内在する冗長性のため、あまり心配していません。

+0

は、このオプションの組み合わせはまた、 'reflog'によって参照されるオブジェクトをNUKEのでしょうか? – Christopher

+0

これは間違いなく不正な好奇心に近いものです。私は、Gitのソース管理能力の限界にもっと興味があります。 – joshin4colours

3

の乱用は、私がよく遭遇する最も一般的な "元に戻すのが難しい"エラーです。git stash popは常にgit stashで元に戻すことができません。考えてみましょう:

git init /tmp/trash && cd /tmp/trash  # make a new repo 
echo A > A        # create a file 
git add A 
git commit -m "Initial commit"   # add and commit it 
echo B > A        # ... now change it 
git stash        # ... and stash it 
echo C > A        # and change it and commit it again 
git add A 
git commit -m "Another commit" 
git stash pop       # now pop the stash 

popAを自動マージしようとすると、競合がスローされますが、あなたが戻ったばかりのポップのうち、再びgit stashを押すことですることはできません。これはかなり簡単な例ですが、頻繁な変更を頻繁にしていて、分岐した分岐を頻繁に切り替えて途中でポップすると、厄介な箇所に入るのは簡単です。私はgit stash dropも永久的だと信じています。間違った隠しを落とすとセーフティネットはありません。

通常、stashは、次のように設計されています。別のブランチにホップするための汚い作業インデックスを隠し、バグを修正し、コミットし、プッシュして元の状態に戻します。あなたが多くの支店で多くの変更を管理するためにそれを使用しようとすると、必然的に大きな注意を払わずにあなたを噛まなければならなくなります。

+0

これは古いエントリですが、この場合は単純に 'reset -hard'することができます。 'stash pop'は自動的にstashエントリを削除しません。 – MirMasej

0

私の経験では、人々が実行する最も一般的な不可逆的な行動はgit reset --hardです。多くの人がgit resetと書くとき、--hardは実際にはreset(おそらく--keep)しか必要としないときに自然に来るようです。

関連する問題