最近あった話なのですがGithubのPRを作成したブランチにforce pushする機会がありまして...
その際に差分がない状態でgit pushしたら...
ナンヤト
「さっきまであったPRがない...?」
ドナイナッテンネン草
しかもcloseしたPRにforce pushしたことになってる...
😭 PRがなくなるとまずい
別にcloseされても新しくまたPR作ればいいじゃん?と思っている方もいるかもしれないですね?
実際そのケースが多いのですがPRがなくなると以下のことで結構まずいケースも結構あるんですよ
- PR上で他の人と会話していたのに、その会話がなくなる
- CIの運用方法によっては取り返しのつかないことになるかも
- そのPRに対して、レビューをしていた人がいた場合、そのレビューが該当のPRで行えなくなる(履歴は残りますが)
🔍 この現象って本当?
実際に手を動かして確認してみましょう!
準備:検証用リポジトリの作成
# 検証用のリポジトリを作成
mkdir pr-force-push-test
cd pr-force-push-test
git init
echo "# PR Force Push Test" > README.md
git add README.md
git commit -m "Initial commit"
# GitHubにリポジトリを作成(ghコマンド使用)
gh repo create pr-force-push-test --private --source=. --remote=origin --push
🚀 PRを作成してみよう
feature/test-branch
というブランチを作成して差分を作りPRを作成します。
# 新しいブランチを作成
git switch -c feature/test-branch
# ファイルを編集
echo "何か新しい内容を追加" >> README.md
git add README.md
git commit -m "Add some content"
# ブランチをプッシュ
git push origin feature/test-branch
# PRを作成
gh pr create --title "テスト用PR" --body "force pushのテスト用です"
実行完了すると以下のようにPRが作成されCIも回っていてちゃんと動いているCIですね!
🎯 本題:差分0のforce pushを実行
ここからが本番です!PRをmainブランチと同じ状態にしてforce pushしてみます。
# mainブランチの最新状態を取得
git checkout main
git pull origin main
# feature/test-branchをmainと全く同じ状態にする
git checkout feature/test-branch
git reset --hard main
# 現在の差分を確認(0になっているはず)
git diff main
# force pushを実行!
git push --force origin feature/test-branch
🔍 結果確認
Files Changedを見ると0になっていて差分がないですね。またcommitも0になっているのでこのブランチではコミットがないmainと全く同じ状態ですね
🎭 通常のpushで差分0でPR作成
差分0でpushした時PRを作成しようとするととうなるのでしょうか?
# 新しいテストブランチ
git switch -c feat/test
# 通常のpushで差分0の場合
git push origin feat/test
gh pr create --title "通常push差分0テスト" --body "force pushではない場合"
結果: 差分なしとしてPRが作成されない
🚨 実際に遭遇するケース
ケース1:reset時
# よくある間違い
git checkout feature/my-branch
git merge main # あ、逆だった...
# 元に戻そうとして
git reset --hard HEAD~1
git push --force origin feature/my-branch # PR消失...
ケース2:リベースの失敗
# rebaseで全てのコミットを削除してしまった
git rebase -i main
# (全部削除してしまった)
git push --force origin feature/my-branch # またPR消失...
🎉 気をつけます...
- GitHubのPRは 差分0 + force push で自動close される
- これは仕様であり、バグではない(最初バグかと疑ってめちゃくちゃ焦りました)
- 普段の開発では force push の前に差分確認を習慣化しよう