これは単純なはずですが、 では見つかりませんgit-scm
。
公開プロジェクトに小さなコミットをたくさん行ってきましたが、作業内容がすべて悪いです。行った作業をすべて削除したいと思います。ローカルにコミットしたものもあれば、「origin master」にプッシュしたものもあります。
最初のコミット (1 週間前) はbdbad86
... で、最新のものはe82401b
...です。
これらをすべて削除したいのですが、1つを元に戻そうとしました。
git status
# On branch master
# You are currently reverting commit e82401b.
# (all conflicts fixed: run "git revert --continue")
# (use "git revert --abort" to cancel the revert operation)
- この元に戻す作業をどのように完了すればよいかわかりません。
- それぞれのコミットを個別に実行するのではなく、すべてを吹き飛ばしたいのです。
ベストアンサー1
ここでは、あなたの作業の間に他の誰もコミットを挿入しておらず、あなたの不適切なコミットがリポジトリの履歴内で連続した範囲を形成していると仮定しています。そうでない場合は、より複雑な処理が必要になります。履歴が次のようになっていると仮定しましょう。
e82401b - (master, HEAD) My most recent private commit
...
bc2da37 - My first private commit
cf3a183 - (origin/master) My most recent bad public commit
...
292acf1 - My first bad public commit
82edb2a - The last good public commit
まず最初に、まだ公開していないコミットを削除します。これは次のコマンドで実行できます (変更内容は失われ、回復不能となることに注意してください):
git reset --hard cf3a183
同等(かつより読みやすい)です:
git reset--hard origin/master
これで、リポジトリのビューが のビューと一致しましたorigin/master
。次に、不適切な公開変更を元に戻し、元に戻すコミットとして公開します。これらの手順は、単一の元に戻すコミットを作成するためのものです。
git revert --no-commit a..b
コミットから始まるすべてのコミットを元に戻すために使用できます後 a
(注意してください!) そして commit で終わり、 commit を含みますb
。 元に戻す作業はコミットできるようにステージングされます。 したがって、ここでは次のようにします。
git revert --no-commit 82edb2a..HEAD
または、同等のものとして:
git revert --no-commit 292acf1^..HEAD
を思い出すと、HEAD
は と同じ場所を指しますorigin/master
。
コマンドを実行すると、revert
変更がステージングされ、コミットする準備が整うので、単純な を実行するだけですgit commit -m "Reverting those bad changes I accidentally pushed and made public"
。