2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

githubのPRは差分0でforce pushするとえらいことになった話

Last updated at Posted at 2025-07-28

最近あった話なのですがGithubのPRを作成したブランチにforce pushする機会がありまして...
その際に差分がない状態でgit pushしたら...

スクリーンショット 2025-07-23 午後2.38.00.png

ナンヤト

「さっきまであった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ですね!

スクリーンショット 2025-07-23 午後2.42.59.png

🎯 本題:差分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と全く同じ状態ですね
スクリーンショット 2025-07-23 午後2.45.40.png

🎭 通常の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が作成されない

スクリーンショット 2025-07-23 午後2.48.33.png

🚨 実際に遭遇するケース

ケース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 の前に差分確認を習慣化しよう
2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?