コミット <commit-hash>
の後に行われたすべての変更を破棄したいのです。
ということで、やってみました。
git reset --hard <commit-hash>
今度はリモートで同じことをしたいと思います。どうすればいいのでしょうか?また、<commit-hash>
の後にいくつかのコミット(およびプッシュ)を行いましたが、それらをすべて破棄したいのです。ただ、途中で何かひどく間違ってしまったので、これ以上悪くしたくありません。
基本的には、自分のorigin/master
を<commit-hash>
に巻き戻したいのです。
自分のブランチがこことリモートの両方で「master」と呼ばれていて、リモートが「origin」と呼ばれていると仮定すると、次のようになります。
git reset --hard <commit-hash>
git push -f origin master
しかし、誰か他の人がリモートリポジトリで作業していて、あなたの変更を引っ張ってきた場合は、この方法は避けるべきです。 その場合は、不要なコミットを revert してから、通常通りプッシュするのが良いでしょう。
Update: あなたがプッシュした変更を他の人がプルしていることを下で説明していますので、それらの変更をすべて元に戻す新しいコミットを作成する方が良いでしょう。 Jakub Narębski氏からの回答**](https://stackoverflow.com/questions/1463340/revert-multiple-git-commits/1470452#1470452)には、これを行うための選択肢についての素晴らしい説明があります。 どの方法が最も便利かは、戻したいコミットの数や、どの方法が最も理にかなっているかによります。
ご質問の内容から、すでに git reset --hard
を使って master
ブランチをリセットしていることは明らかなので、まずは git reset --hard ORIG_HEAD
を使ってブランチを以前の状態に戻す必要があるかもしれません。 (いつものように git reset --hard
を使用する際には、git status
がクリーンであること、正しいブランチにいること、そして明らかに失われたコミットを回復するツールとして git reflog
を知っていることを確認してください)。 また、git show ORIG_HEAD
で、ORIG_HEAD
が正しいコミットを指していることを確認してください。
トラブルシューティング:。
もし、"!のようなメッセージが表示された場合[remote rejected] a60f7d85 -> master (pre-receive hook declined)"
のようなメッセージが表示された場合、特定のブランチに対してブランチ履歴の書き換えを許可する必要があります。例えば、BitBucketでは「Rewriting branch history is not allowed」と表示されていました。ブランチヒストリーの書き換えを許可する」というチェックボックスがありますので、これをチェックしてください。
ローカルの変更が失われても構わない場合は、他の回答を使用してください。この方法では、戻るコミットハッシュの選択を間違えると、リモートが破壊される可能性があります。
ローカルブランチにすでにあるコミットとリモートを一致させたいだけの場合。
1.リセットは一切行わないでください。
1.1. git log
を使って、リモートに合わせたいコミットのハッシュを見つけます。変更点を見るには git log -p
を、コンパクトなツリーを見るには git log --graph --all --oneline --decorate
を実行してください。(最後のものをシェルのエイリアスにしておくととても便利です。)
1.ハッシュをコピーします。
1.次のようなコマンドを実行します。
git push --force <remote> <the-hash>:<the remote branch>.
たとえば、以下のようになります。
git push --force origin 606fdfaa33af1844c86f4267a136d4666e576cdc:master