Gitを使っていて、たまにやらかすのは、誤った変更をそのままpushして間違いが履歴に残ってしまうことです。
バージョン管理システム (VCS) のある姿としては、それはそのままにして、また修正をpushすれば問題はないのですが、できれば間違った履歴を残したくないものです。
そこで、誤ったpushを消して戻す方法を調べてみました。
目次
gitで誤った最後のpush履歴の削除、歴史の巻き戻し方法
Gitには最強のコマンド、filter-branchというのがあり、歴史を書き換えることが可能です。
filter-branchの詳細は次の通りです。
ただ、ここまでやらずとも、出来れば穏便に簡単に最後の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にしろって書いてありましたが、問題は違うようです。
リモートリポジトリの設定確認
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 |
無事に削除が完了しました!
コメント