概要
- 時々やらかして、いろいろ調べることになるので簡単にまとめる
複雑でない状況とは
- 誰も誤ってプッシュしてしまったブランチを利用していない
対処法
危険な操作もあるため、バックアップを取ってから実行することをお勧めします
間違ってプッシュしたコミットを元のブランチから変更を戻す
git checkout original-branch-name
# 変更維持した状態で戻す
git reset --mixed HEAD^
HEAD^
は直前のコミットを指すので、複数のコミットを戻す場合は、HEAD~n
を使用するとよい(nは戻したいコミット数)。
ローカルで新しいブランチを作成する
git checkout -b new-branch-name
新しいブランチに変更をコミットしてプッシュする
git checkout new-branch-name
git add . # 全ての変更をステージングエリアに追加
git commit -m "新しいブランチでの変更内容の説明"
git push -u origin new-branch-name
元のブランチをローカルの状態で強制上書きする
git push --force の操作は危険が伴うため、十分に注意してください
より安全な方法をより安全な方法で強制上書きで書いておきます
git checkout original-branch-name
git push --force origin original-branch-name
より安全な強制上書き
@YuneKichiさんから教えていただきました!ありがとうございます!
git push --forceよりはgit push --force-with-lease、さらにはgit push --force-with-lease --force-if-includesを使うと、より安全になります。
とのことで、オプションをつけることでより安全になるようです!
簡単にどのようなオプションであるかを調べてみると、
--force-with-lease オプションを指定すると、ローカルの ref とリモートの ref を比較しローカルが最新か判定。最新なら push し、そうでなければが失敗してくれるので、誤って古いファイルで上書きといった悲惨な状態を回避できるようになる。
--force-if-includes オプションは、reflog に remotes/origin/main (I) が含まれていることをチェックし、直前fetch状態なら拒否してくる仕組み。
--force-with-lease オプションだけでは、直前にfetchしていると push が成功してしまうので、
--force-if-includes オプションを併用すると更に安全に行えるというのがポイント。
とのことでした。なので次のようになります
git checkout original-branch-name
git push --force-with-lease --force-if-includes origin original-branch-name
エイリアスの設定もしておくとよいとのことです