タイトル: pushの取消し方法
SEOタイトル: git pushを取り消す方法|reset --hard+push -fとrevertの使い分け
| この記事の要点 |
|
push 取り消しの 3 つの方針
| 方針 | 概要 | 安全性 |
|---|---|---|
| A. revert で打ち消す | 新しいコミットで変更を相殺。履歴は残る | ◎ 推奨 |
| B. reset --hard + push -f | 履歴を強制的に過去へ巻き戻す | △ 個人ブランチでのみ |
| C. リモート側で reset | --shared 付きベアリポジトリ等で B が拒否されたときの最終手段 | × 共有リポへの直接操作 |
A. 推奨:git revert で打ち消す
最も安全な方法です。元の履歴は残したまま「相殺するコミット」を追加するだけなので、他の開発者を巻き込んだ事故になりません。
# 取り消したいコミット ID を確認
git log --oneline -10
# 打ち消しコミットを作成(メッセージは自動生成)
git revert c545149
# リモートへ通常 push
git push origin master
複数コミットを一気に打ち消したい場合は git revert c545149..HEAD のように範囲指定できます。マージコミットを revert したい場合は -m 1 を付けます。
B. 強制:reset --hard + push -f
「履歴から完全に消したい」「個人ブランチで誰にも影響しない」というケース限定です。main / master / release 等の共有ブランチではやらないでください。
# まずバックアップブランチを作る
git branch backup-before-reset
# 戻したいコミット(=この時点を最新にする)まで巻き戻す
git reset --hard c545149
# リモートへ強制 push
git push -f origin master
c545149 の部分には戻したいコミットのリビジョン番号を指定します。HEAD~1 のように相対指定も可能(直前 1 件を取り消し)。
失敗した場合に備えて git reflog で復旧できます。reflog は通常 90 日間残るので、慌てずに git reset --hard HEAD@{1} 等で元の HEAD に戻せます。
C. --shared 付きベアリポジトリで拒否されるとき
リモートが git init --shared --bare や git clone --bare で作られている場合、デフォルトで非 fast-forward な push(つまり force push)を拒否します。具体的には以下のメッセージで弾かれます。
remote: error: denying non-fast-forward refs/heads/master (you should pull first)
この場合はリモートリポジトリ側に SSH 接続して、サーバ上で直接ブランチを戻します。
# サーバへ SSH 接続
ssh user@git-server
# ベアリポジトリへ移動
cd /srv/git/myrepo.git
# 該当コミットへ HEAD を巻き戻す
git reset --soft c545149
--soft はワークツリーを持たないベアリポジトリでも安全に使えます。実施後は各開発者に「先頭が変わったので git fetch && git reset --hard origin/master してほしい」と必ず連絡してください。
事前に必ずやること
git branch backup-YYYYMMDDでバックアップブランチを作る- 関係するメンバーに force push の時刻と対象ブランチを事前告知する
- 取り消し対象のコミット ID(
git log --oneline)と戻したい先のコミット ID をメモする - その時点の作業を
git stashですべて退避しておく
force push 後のチームメンバーの復旧手順
誰かが force push した後、他の開発者は通常の git pull ではコンフリクトしてしまいます。以下のようにリモートの状態に強制的に合わせてもらいます。
# 最新を取得
git fetch origin
# ローカルブランチを破棄してリモートに合わせる
git reset --hard origin/master
関連
- git — 親カテゴリ
- remote: error: denying non-fast-forward —
--shared時の典型エラー - Gitで「MERGING」の状態 — マージ途中で取り消したいときの関連トラブル