【Sourcetree】リモートリポジトリにPushしたCommitの取消方法
はじめに
コミットしてリモートリポジトリにプッシュしてしまったけど、間違えたのでコミットをばれずにこっそり(w)取り消したい・・・というのはあるかと思います^^;
今回はその方法について書きたいと思います。
方法
最新コミットを取り消したい場合、ターミナルを開きます。
以下のコマンドを順に行うことで最新のコミット前の状態に戻すことが可能です。
※例はmasterブランチでの内容となります。
git reset --hard HEAD^
git push -f origin master
※ただし、このやり方で注意することがあります。
それはコミットした内容を他の誰かがすでにPullしてしまっていた場合は不整合が起こる可能性があるので大変危険です。
ですので、このやり方は確実に誰も触っていないことをわかっている状態で行ってください。
他に触っている可能性がある場合はRevertする方が安全です。
ん、できない場合がある・・?
例えばこんなエラーが出る。
remote: error: denying non-fast-forward
つまりリモートリポジトリでnon-fast-forwardプッシュが許可されていないよということです。
※non-fast-forwardとfast-forwardについては時間があるときにでも書きたいと思います。
denying non-fast-forwardエラーの回避策
この場合、以下何れかの方法で回避してあげる必要があります。
- リモートリポジトリでnon-fast-forwardプッシュを許可するようにする
- リモートリポジトリで直接gitコマンドを行いコミットをなかったことにする
- あきらめてrevertコマンドで安全にコミットをなかったことにする
1. リモートリポジトリでnon-fast-forwardプッシュを許可するようにする
リモートリポジトリに対して以下のコマンドを行いましょう。
git config receive.denyNonFastforwards false
例)もしローカルPCのC:\RemoteRepoがリモートリポジトリの場合で、Sourcetreeの内蔵Gitを使用している場合はコマンドプロンプトを起動し、以下のコマンドを順次入力します。
cd C:\RemoteRepo
%LOCALAPPDATA%\Atlassian\SourceTree\git_local\bin\git.exe config receive.denyNonFastforwards false
そのあと、Sourcetreeのターミナルから以下のコマンドを順に行うことで今度はエラーが出なくなるはずです。
※例はmasterブランチでの内容となります。
git reset --hard HEAD^
git push -f origin master
2. リモートリポジトリで直接gitコマンドを行いコミットをなかったことにする
リモートリポジトリに対して以下のコマンドを行いましょう。
git reset --soft HEAD~
例)もしローカルPCのC:\RemoteRepoがリモートリポジトリの場合で、Sourcetreeの内蔵Gitを使用している場合は
コマンドプロンプトを起動し、以下のコマンドを順次入力します。
cd C:\RemoteRepo
%LOCALAPPDATA%\Atlassian\SourceTree\git_local\bin\git.exe reset --soft HEAD~
そのあと、Sourcetreeのターミナルから以下のコマンドを順に行うことで今度はエラーが出なくなるはずです。
※例はmasterブランチでの内容となります。
git reset --hard HEAD^
git push -f origin master
3. あきらめてrevertコマンドで安全にコミットをなかったことにする
このやり方ではSourcetree上の樹形図に履歴自体は残ってしまいますが一番トラブルが少ない方法です。
取り消したいコミットを選択し右クリックを押して出るポップアップメニューからこのコミットを打ち消しを選択します。
はいを押します。
すると以下のようにRevertコミットされるので、後はプッシュを行えばリモートリポジトリにもコミット前の状態で反映されます。
おわりに
いかがでしたでしょうか?
Sourcetreeをミスせずにコミットするに越したことはないと思いますが、だれでもミスはするのとミスしながらSourcetreeやGitは覚えていくべきと思っているので今回のようにミスしても挽回するすべを知っておけば慌てず対応できると思います^^