2012-03-15 17 views
46

私はgitに非常に新しく、このようなことが可能かどうか疑問に思っていましたか?古いgitコミットを取り除く

>git log --pretty=oneline --abbrev-commit 
2f05aba Added new feature 
3371cec Fixed screw up <-- I want to remove this 
daed25c Screw up   <-- and remove this. 
e2b2a84 First.    So it's like they never happend. 

これは可能ですか?

答えて

42

これはgit rebaseで可能です。以下を試してください

git rebase -i HEAD~4 

その後、エディタの対話的な指示に従ってください。最初のステップでは、コミットを「スカッシュ」します。

pick 2f05aba ... will be preserved 
squash 3371cec ... will be squashed with daed25c 
squash daed25c ... will be squashed with e2b2a84 
pick e2b2a84 .. will contain this and 3371cec and daed25c 

第2ステップでは、コミットメッセージを編集することができます。

+10

コミットを削除するのではなく、削除することについての質問はありませんか? – Richard

+1

@Stony:おそらく、それらを削除することもできます。しかし、OPのコミットコメント( "Screw up"と "Fixed screw up")から、私はもう一方を取り消していると思っていました。 – Deve

54

あなたが本当にそれを(これ以上見られないことを決して、歴史からそれらを拭く)削除したい場合は、することができます

実行リベース:

git rebase -i HEAD~4 

してから、ちょうど削除(またはコメントアウト)削除するコミットに対応する行を次のようにします。

pick 2f05aba ... #will be preserved 
#pick 3371cec ... #will be deleted 
#pick daed25c ... #will be deleted 
pick e2b2a84 ... #will be preserved 
+0

私はgithubに慣れていません。それ以降はどのように変更をプッシュしますか(私が「同期」をクリックすると、私がやったことが元に戻ります)。私はそれを持っていると思います: 'git push origin HEAD --force' –

+0

@Nicolasあなたはしません。そういうわけで、git pushは--forceを使わないで作業を拒否します。なぜならあなたは歴史を書き直しており、他の人のリポジトリを破壊するからです。すでにプッシュしている場合、唯一の選択肢は 'git revert'です。あなたが他の誰かのコードを引っ張っても、あなたが何らかの歴史を持たずにあなたの古いコミットを消去したくないのであれば、それは賢明だと思いますか? –

+0

これは現在のGitリポジトリでは単純に機能し、上流/他のGitノードは何も変更しないと思いますか? –