2016-03-25 12 views
0

git reset(--hardを含む)について知っていますが、コミットを完全に削除するわけではなく、ツリーを調整するだけです。私はgit gcを調べましたが、それは決して永久に決してコミットを削除することはありません。私はfilter-branchについて知っていますが、それはコミットからファイルを削除するだけですが、コミットはしません。Git:ローカルコミットをgitデータベースから完全に削除する方法

は、このトピックの周りに円スタックオーバーフローの質問がたくさんありますが、私は質問に対する本当の答えを見つけることができません。どのように本当にが削除ローカルコミット(またはコミットのシリーズ)、そののでデータベース内のどこにも存在しなくなりました。それがブランチチップに限定された方法だったら、それはいいでしょう。

編集:私の間違いでした。私はgitkを使っていて、F5を使ってツリー全体を表示していました。しかし、F5は「更新」を行い、シフト-F5は「再読み込み」を行います。そして、shift-F5を使って完全にリロードしない限り、実際には実際には削除されません。あなたのブランチが、このようになります場合は

+0

'git reset -hard origin/master'を実行してください – Sid

+0

この記事に従って手順を実行してください。 https://help.github.com/articles/remove-sensitive-data/ –

+1

最初に、origin/masterはリモートリポジトリ用です。第二に、get reset - 一般的な信念に反して、hirtはコミットを削除しません。リポジトリツリー全体を見ると、それらは依然として存在します。 – Nairebis

答えて

1

A <-- HEAD 
| 
B 
| 
C <-- to be removed 
| 
D 

、あなたがCをコミット削除するには、次のコマンドはあなたを助けるかもしれない:

git rebase -i D  # if you have D's sha1 handy 
# OR 
git rebase -i C^ # parent of C (which is the same as D in this simple example) 

一度発行され、エディタがすべてでポップアップ表示しますDの子、すなわちA,B、およびCから開始して、の予定リストにコミットします。そのエディタウィンドウでコミットCの行を削除してファイルを保存するだけです。

+0

これは元のコミットを削除しません。彼らはまだそこにいるでしょう。私はその正確なシナリオを試みました。 rebaseは別のブランチになりますが、ツリー全体を見ると、古いコミットはそのまま残ります。 – Nairebis

+2

@Nairebisどこを見ましたか?ギトク? SHIFT-F5(リロード)を押します。あなたは_local_についてコミットしました。すでにプッシュしましたか?その後、 'プッシュ-f' – PerlDuck

+0

GAH!あなたはちょうどそれを正しく打つ...私はGitkを使用していたし、シフトF5の代わりにF5を使用していた。私はシフトF5をして、彼らは消えた。ダメージ。 – Nairebis

0
  1. resetrebase、あるいはfilter-branchを使用して、任意の refまたはタグから到達不能にコミットしてください。 (そこから到達できないコミットように、どのようにgit gc --prune=all(。データベースからの到達不能オブジェクトを削除する。REFLOG期限切れgit reflog expire --expire=now --all
  2. git pruneremove the file from all branches).
  3. にフィルタ分岐を使用することもトリックを行っているだろうが、git gc無地
  4. gitオブジェクトストアは、SHA1ハッシュに従って格納されています。ハッシュの最初の2文字は、ディレクトリ最後の38は、そのディレクトリ内のファイル名です。

だからあなたの問題のSHA1ハッシュコミット場合12345ABCDEF...は、それはあなたが程度とハッシュ心配している特定のブロブのSHA1ハッシュ(ファイルの内容)を見つけることができ、本当に偏執的であるために.git/objects/12/345ABCDEF...

に住んでますですそれをgit hash-object <filename>とし、そのハッシュをDBで確認してください。

関連する問題