2016-01-07 13 views
13

私はのすべての痕跡に必要なgitブランチを持っています。私は、彼らが何をしよう確実に知らなくても、または場合は、それらを試して躊躇していブランチとそのすべての履歴をローカルおよびリモートでどのように削除しますか?

git filter-branch --index-filter 'git -D <branch>' --tag-name-filter cat -- --all 

または多分

git filter-branch --index-filter 'git rm --cached *' --tag-name-filter cat -- <branch> 

ような何かそれから私は

だろう
git push -f origin :<branch> 

が必要だと思います彼らは働くでしょう。

+0

私はそれを一度も使ったことがなく、あなたの状況にはまったく関係ないかもしれませんが、コミットしてはならない機密データを取り除こうとしているだけの場合、[BFG](https ://rtyley.github.io/bfg-repo-cleaner/)。 – DaveyDaveDave

+0

[Gitブランチをローカルとリモートの両方で削除する]の複製があります(http://stackoverflow.com/questions/2003505/delete-a-git-branch-both-locally-and-remotely) –

+1

あなたはただ削除したいのですがローカルとリモートのブランチについては、@codeWizard answer(http://stackoverflow.com/a/34657278/2531279)を参照してください。 このブランチでコミットされたコミットを取り除きたい場合は、もっと複雑で、実際には 'git filter-branch'を使う必要があります。 – Frodon

答えて

10

ヌークevilbranchとしたいとします。

ブランチの履歴をすべて削除したいとします。これには技術的に最初のコミットが含まれています。最初に、そのブランチの最初のコミットとみなすコミットを特定します。 666badとしましょうこれですべての参照を見つける必要があります。実行

git branch -a --contains 666bad 
git tag --contains 666bad 

ここでそれらをすべて削除してください。 gitコマンドを使うか、.git/refsに行くだけです。

ファイルがある可能性があるすべてのコンピュータでこれを行います。

頭が離されていないことを確認してください。

は、今、私たちはそれが( this GitHubのリンクから)もはや参照可能である、したがって、すべてのコードをすべてコミットを殺していない、とすることができます

git for-each-ref --format='delete %(refname)' refs/original | git update-ref --stdin 
git reflog expire --expire=now --all 
git gc --prune=now 

を繰り返しますが、これは各コンピュータ上で実行する必要があります。

最後に、各コンピュータでthisを使用してください。

注:666badは最初、それはどこから来たからevilbranch分割後をコミットしている、すなわち、最初はそれが唯一のevilbranchあるコミット。

+0

シェルを持っていないgithubのようなリモートから履歴を削除するにはどうしたらいいですか? – drs

+0

@drsタグを削除して、オンラインインターフェイスで分岐します。 GitHubはおそらく、人々がクローンしたときに(そのリンクだったので)どんなコミットも漏らさないだろうし、GitHubがあなたに悪いプロットを持っているのではないかと疑う。 – PyRulez

+0

[this](https://git-scm.com/book/en/v2/Git-Branching-Remote-Branches#Deleting-Remote-Branches)と[this](https:// nathanhoad)を使用することもできます。net/how-to-delete-a-remote-git-tag)を使用して、オンラインインタフェースを使用しないようにします。 – PyRulez

0

おそらくgit log --all --decorate --graph --onelineを使用するか、またはgit reflogを使用して、最初はあなたがハァハァしたいブランチにコミットして下さい影響を受けたブランチやタグ

を調査します。最初のコミットが666badであるとします。

PyRulezに記載されているヒントを使用して、このブランチで汚染されている可能性のあるタグまたはブランチを見つけることができます。

git branch -a --contains 666bad 
git tag --contains 666bad 

ブランチに関連付けられているタグがある場合は、それらをローカルおよびリモートで削除します。

git tag -d <tag name 1> <tag name 2> ...    # remove tags locally 
git push --delete origin <tag name 1> <tag name 2> ... # remove tags remotely 

クリーンアップあなたのローカルおよびリモートブランチ

チェックアウトあなたは枝の最初のコミットの親に枝上のすべてのコミットをリセットするためにgit filter-branchを削除し、使用したいブランチ:

git checkout evilbranch 
git filter-branch --force --index-filter `git reset --hard 666bad^' \ 
        --prune-empty 666bad..HEAD 

これは、空であるためコミットを削除します。

自分の原点に強制プッシュした結果

git push origin --force 

クリーンアップあなたのreflogとプルーンダングリングは

git reflog expire --expire=now --all 
git gc --prune=now 

を犯したチームメンバーの枝をクリーンアップ

必ず誰もが他くださいそれはブランチをチェックアウトして、マシン上のタグとブランチを削除しますその後、彼らはreflogとガベージコレクトを失効させます。

git tag -d <tag name 1> <tag name 2> ... 
git branch -D evilbranch 
git checkout master 
git reflog expire --expire=now 
git gc --prune=now 

最後の注意

あなたの起源はGitHubのであり、あなたのブランチがその上に任意のプル要求を持って、あなたはGitHubのサポートに連絡し、彼らはあなたのプル要求を剪定することを要求しなければならない場合。キャッシュされたビューを削除するには、それらにも連絡する必要があります。

関連する問題