1

私のローカルリポジトリには、次のコミットが含まれています。

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

文字の変更はリモートリポジトリにあります。変更1、1.1、および2は、ローカルリポジトリの一時的な変更であり、不要になりました。これらは、Bの上にコミットされていない変更を加えたスタッシュを作成したときに自動的に作成された可能性があります。その隠し場所は削除されました。歴史をもっと複雑にしたくないので、これらを取り除きたいのです。

ローカルリポジトリを吹き飛ばし、リモートリポジトリを再度複製することで、これらを明確に取り除くことができますが、これは手間がかかるようです。そして、私が保持したいリモートリポジトリにないローカルブランチがあります。

私がこれまで読んだことから、複数のコミットを1つに押しつぶす方法についての議論がありました。コミットオブジェクトの削除については何も見つかりませんでした。また、「git prune <hash of commit 2>」を実行しようとしましたが、何も実行されませんでした。

コミットオブジェクト1、1.1、および2を削除するにはどうすればよいですか?

前もって感謝します。

4

4 に答える 4

4

気になるコミットに移動して、それを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'
    
于 2012-03-15T20:51:49.933 に答える
2

マスターブランチで作業していると仮定して、それをオリジン/マスター(E)にリセットするだけです。

git checkout master
git reset --hard origin/master

これにより、コミットオブジェクトがオブジェクトを失い、次にgitgcを実行したときにクリーンアップされます。

于 2012-03-15T21:06:17.780 に答える
1

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

于 2012-03-15T21:01:18.777 に答える
1

1@Bombeと@MagnusSkogは正しいです(Lakshman Prasadは近いですが、あなたも同様に取り除きたいと言っていました)。しかし、おそらくあなたが意味するのは、「私はすべての表示されている参照(つまり、ブランチ名とタグ名)を1、1.1、および2に投げ、さらにはを実行しgit gcましたが、それらを見ることができるので、まだコミットがありますSHAによって、彼らはあまりにも多くのディスクスペースを占めています。」

この場合、最も簡単なのは待つことです。スペースがgcされるのを妨げている、見えない参照は、おそらくreflog(.git/logs/)にあります。それらはしばらくすると期限切れになり、その後それらのコミットをgcすることができます。または、を使用git reflog --expire-unreachableして、それらをより早く期限切れにすることができます。gitreflogexpireおよびgitfsck--unreachableも参照してください。

于 2012-03-16T07:05:29.320 に答える