2012-03-15 18 views
0

私の地元のレポは、以下のコミットが含まれていますローカルgitリポジトリで特定のコミットを削除するには?

A ---- B ---- C ---- D ---- E 
     \ 
     1 ---- 2 
      \ /
      1.1 

文字入りの変更はリモートレポにあります。変更1、1.1、および2は、私のローカルレポの一時的な変更で、もはや必要ではありません。これらは、Bの上にコミットされていない変更を含むstashを作成したときに自動的に作成された可能性があります。その隠しは削除されました。私は歴史をあまり複雑にしたくないので、私はこれらを取り除きたいのです。

ローカルリポジトリを吹き飛ばし、リモートリポジトリを再度クローニングすることで、これを明確に取り除くことができますが、これは重い手作りのようです。リモートリポジトリにないローカルブランチがあります。

私がこれまで読んできたことから、複数のコミットを1つにまとめる方法が議論されています。コミットオブジェクトを削除する際に何も見つかりませんでした。私はまた、コミット2 >の<ハッシュをgit pruneしようとしましたが、何もしませんでした。

コミットオブジェクト1,1,1,2を取り除くにはどうすればよいですか?

ありがとうございます。

答えて

1

あなたはgitkに示されている状況を説明するものですか?完全リフレッシュ(Ctrl-F5)後も同じですか?同じままであれば、 "2"をコミットすることを指す参照がまだあります。その参照を削除してください(おそらくブランチ)、ブランチ全体が消えます。後でガベージコレクションはコミットオブジェクトを削除します。

+0

ありがとうございます! F5(リフレッシュ)はそれをしなかったが、Ctrl + F5(リロード)はしなかった。私はリフレッシュがそれを状態に残すだろうとは気付かなかった、まあ、新鮮ではない;-)。 – mbells

2

気になるコミットに行き、HEADとして設定してください。 gitのガーベッジは、ある時点の後に1.1と2を集めます。同じことについて移動する

git checkout sha-of-1 
git reset --hard HEAD 

別の方法は、次のようになります。

  • は、あなたが気にポイントから新しいブランチを作成します。
  • 他のすべてのブランチを削除します。

    git checkout sha-of-1 
    git checkout -b new-branch 
    git branch -D 'the branches that have 1.1 and 2' 
    
1

ちょうど起源/マスター(E)にそれをリセットし、あなたはmasterブランチ上で作業していると仮定:

git checkout master 
git reset --hard origin/master 

これはあなたの緩いオブジェクトをコミットオブジェクトを作成し、あなたはgitのGCを行う次回のクリーンアップされます

0

@Bombeと@Magnus Skogが正しいです(Lakshman Prasadは近いですが、あなたは1も取り除きたいと言っていました)。しかし、おそらくあなたが意味することは: "私は目に見える参照(すなわち、ブランチとタグの名前)を1,1,2に投げたことがあり、git gcを実行しても、私はまだ見ることができるのでコミットしている彼らはSHAによって、彼らはあまりにも多くのディスクスペースを占有している "。

これが当てはまる場合、最も簡単なのは、待つだけです。見えない参照は、スペースがgc'edされないため、おそらくreflog(.git/logs/)にあります。それらはしばらくしてから期限切れとなり、それらはコミットされますすることができます。または、git reflog --expire-unreachableを使用すると、強制的に期限切れにすることができます。 git reflog expire and git fsck --unreachableも参照してください。

関連する問題