1. ホーム
  2. git

[解決済み] githubでプロジェクトに貢献する、「masterの上に自分のプルリクエストをリベース」する方法

2023-01-13 23:13:11

質問

私はgithub上のプロジェクトに貢献しています。github上のプロジェクトは upstream で、github でフォークしたレポは origin で、私の local のレポをパソコンで見ることができます。

git checkout -b feature
# Working on feature
git commit -a -m 'only commit on feature'

そして、プルリクエストを送信します。

git push origin master

プルリクエストをレビューし、関係のない変更を行う必要があります。他の誰かがコミットし upstream/master

今度は私が upstream のメンテナから "rebase my pull request on top of master"

これは私の物語です(Law and Orderの効果音を挿入)......。

私はプルリクエストに何の変更も加えていませんし、ブランチフィーチャーに同じコミットがあるままです。

git checkout master
git fetch upstream
git checkout feature
git rebase master
=> "Current branch feature is up to date."
git push origin feature
=> "Everything up-to-date"

私は理解できません。誰かがコミットしてマージしたことが分かっているのに、どうしてこんなことが可能なのでしょうか。 upstream/master にプルリクエストをプッシュした後 origin/feature ?

このような場合、どのような手順が正しいのか、どなたか教えていただけませんか?

どのように解決するのですか?

上流レポのフェッチしか表示されません。それは実際にはローカル ブランチのいずれをも更新しません。それは の知識を更新するだけです。 upstream . あなたは upstream/master が完全に master と同じように git pull にリベースする前に master にリベースする前に、あるいはもっと単純に upstream/master .

すなわち

git checkout master
git pull upstream master
git checkout feature
git rebase master

または

git checkout feature
git rebase upstream/master

更新しました。

ローカルの feature ブランチを修正したら、それを origin に戻してプルリクエストの更新を終了します。あなたがプッシュしたのは feature を一度プッシュしているので、単純に push というのも、リベースは履歴を変更し、もはや fast-forward ではないからです。通常、" non-fast-forward" でプッシュが失敗した場合、プルを実行することでそれを解決しますが、プルは 2 つの異なる履歴を結合するだけで、それは絶対に望んでいることではありません。つまり、あなたの古い(リベース前の) feature ブランチが新しい (リベース後の) ブランチと一緒になってしまうのです。あなたが望むのは を上書きする origin/feature の状態を、新しい feature ブランチの状態で、古いブランチの記録をすべてダンプします。つまり、fast-forward でないにもかかわらず、プッシュを強制的に行うには git push -f origin feature . 注意: 強制プッシュは 危険 で、コミットを失う可能性があります。何をやっているのか絶対に分かっている場合のみ使用してください。例えば、ここでは意図的にプレベースにある古い無駄なコミットを削除したい場合です。 feature ブランチにある古い無駄なコミットを削除したい場合です。