Gitを使っていて、たまにやらかすのは、誤った変更をそのままpushして間違いが履歴に残ってしまうことです。
バージョン管理システム (VCS) のある姿としては、それはそのままにして、また修正をpushすれば問題はないのですが、できれば間違った履歴を残したくないものです。
そこで、誤ったpushを消して戻す方法を調べてみました。
目次
gitで誤った最後のpush履歴の削除、歴史の巻き戻し方法
Gitには最強のコマンド、filter-branchというのがあり、歴史を書き換えることが可能です。
filter-branchの詳細は次の通りです。
![](https://urashita.com/wp-content/uploads/2015/12/git-320x320.png)
ただ、ここまでやらずとも、出来れば穏便に簡単に最後のpushをなかったことにできないか、方法を調べてみました。
例えば、次の状態にあるとします。
ここで、A、B、C、Dはコミットのことです。
1 2 |
リモート: A-B-C master ローカル: A-B-C-D master |
ローカルで変更を加えてDの状態になっています。
git push すると次のようになります。
1 2 |
リモート: A-B-C-D master ローカル: A-B-C-D master |
ここで、D は間違いだったと気づいたとします。
さて、どうすればよいでしょうか?
まず、リモートリポジトリの master のバックアップ用のブランチを作ります。
これは必須ではありませんが、念のためです。
1 |
% git push origin master:master_bak |
これで次の状態になります。
1 2 3 |
リモート: A-B-C-D master A-B-C-D master_bak ローカル: A-B-C-D master |
次に、リモートの master ブランチを削除します。
1 |
% git push origin master --delete |
1 2 |
リモート: A-B-C-D master_bak ローカル: A-B-C-D master |
ローカルを一つ戻します。
1 |
% git reset HEAD^ |
1 2 |
リモート: A-B-C-D master_bak ローカル: A-B-C master |
リモートに push します。
1 |
% git push origin master |
1 2 3 |
リモート: A-B-C master A-B-C-D master_bak ローカル: A-B-C master |
すべてが順調にいって master_bak が要らなくなったら削除します。
1 |
% git push origin master_bak --delete |
1 2 |
リモート: A-B-C master ローカル: A-B-C master |
これで通常はOKのはずです。
GitLabでエラー deleting the current branch is denied, because
ちなみに、私の所で、リモートの master ブランチを削除しようと以下のコマンドを実行しました。
1 |
% git push origin master --delete |
すると、次のエラーが出ました。
1 2 3 4 5 6 7 8 9 |
remote: error: By default, deleting the current branch is denied, because the next remote: error: 'git clone' won't result in any file checked out, causing confusion. remote: error: remote: error: You can set 'receive.denyDeleteCurrent' configuration variable to remote: error: 'warn' or 'ignore' in the remote repository to allow deleting the remote: error: current branch, with or without a warning message. remote: error: remote: error: To squelch this message, you can set it to 'refuse'. remote: error: refusing to delete the current branch: refs/heads/ecoli-moments |
うう?????
調べてみたところ、以下のページでは、リポジトリをbareにしろって書いてありましたが、問題は違うようです。
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fcdn.qiita.com%2Fassets%2Fpublic%2Farticle-ogp-background-412672c5f0600ab9a64263b751f1bc81.png?ixlib=rb-4.0.0&w=1200&mark64=aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZ3PTk3MiZoPTM3OCZ0eHQ9Z2l0JTIwcHVzaCVFMyU4MSVBN3JlbW90ZSUyMHJlamVjdGVkJUUzJTgxJUE4JUU2JTgwJTkyJUUzJTgyJTg5JUUzJTgyJThDJUUzJTgxJTlGJUU2JTk5JTgyJUUzJTgxJUFCJUUzJTgyJTg0JUUzJTgxJUEzJUUzJTgxJTlGJUUzJTgxJTkzJUUzJTgxJUE4JUUzJTgzJUExJUUzJTgzJUEyJnR4dC1hbGlnbj1sZWZ0JTJDdG9wJnR4dC1jb2xvcj0lMjMyMTIxMjEmdHh0LWZvbnQ9SGlyYWdpbm8lMjBTYW5zJTIwVzYmdHh0LXNpemU9NTYmcz1mMzZkZTA1NWIzNGFkZTA2MzgzYWEzYmVjNDE0NTljMg&mark-x=142&mark-y=57&blend64=aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZoPTc2Jnc9NzcwJnR4dD0lNDBzc21fc25vdyZ0eHQtY29sb3I9JTIzMjEyMTIxJnR4dC1mb250PUhpcmFnaW5vJTIwU2FucyUyMFc2JnR4dC1zaXplPTM2JnR4dC1hbGlnbj1sZWZ0JTJDdG9wJnM9ZTg2ZmE1YzE3ODJhYmU2NzEwMTkzYTgyYWM4NzBiYmE&blend-x=142&blend-y=486&blend-mode=normal&s=3b6c3b894057c64031b9b0d39fc69e96)
リモートリポジトリの設定確認
1 2 |
$ git config --get-all core.bare false |
上記でfalseだったらtrueにする
1 |
$ git config --bool core.bare true |
GitLabで、deleting the current branch is denied の解決方法
GitLabの管理画面にログインしてリポジトリを確認します。
デフォルトブランチが、master になっているのが原因のようです。
デフォルトブランチは削除できません。
そこで、いったんデフォルトブランチを管理画面から、master_bakに変更しておきます。
その後、リモートの master ブランチを削除すると、
1 |
% git push origin master --delete |
無事に削除が完了しました!
コメント