GitHubでマスターではないブランチへのプルリクエストを確認しようとしています。ターゲットブランチはマスターの背後にあり、プルリクエストはマスターからのコミットを示していたため、マスターをマージしてGitHubにプッシュしましたが、更新後もプルリクエストにコミットと差分が表示されます。 GitHubのブランチにmasterからのコミットがあることを確認しました。プルリクエストにまだ表示されるのはなぜですか?
また、プルリクエストをローカルでチェックアウトしましたが、マージされていないコミットのみが表示されます。
プルリクエストはターゲットブランチへの変更を追跡しないようです(GitHubサポートに連絡し、2014年11月18日にこれが仕様によるものであるとの応答を受け取りました)。
ただし、以下を実行することで、更新された変更を表示することができます。
http://githuburl/org/repo/compare/targetbranch...currentbranch
必要に応じて、githuburl
、org
、repo
、targetbranch
、およびcurrentbranch
を置き換えます。
または、hexspriteが彼の答えで指摘したように、クリックして強制的に更新することもできます Edit PRで、一時的にベースを別のブランチに変更してから再び元に戻します。これにより、警告が生成されます。
ベースを変更してもよろしいですか?
古いベースブランチからの一部のコミットがタイムラインから削除され、古いレビューコメントが古くなる可能性があります。
これは良い回避策です。 GitHubでPRを表示するときにEdit
ボタンを使用して、ベースブランチをmaster
以外のものに変更します。次に、それをmaster
に戻すと、最新のコミットからの変更のみが正しく表示されるようになります。
要約すると、GitHubはプルリクエストのコミット履歴を自動的にリベースしません。最も簡単なソリューションは次のとおりです。
feature-01
からmaster
にマージするとします:
git fetch Origin
git checkout feature-01
git rebase Origin/master
git Push --force
フォークで作業している場合、上のOrigin
をupstream
に置き換える必要があるかもしれません。元のリポジトリのリモートブランチの追跡の詳細については、GitHubフォークリポジトリの更新方法を参照してください。
イントロmaster
をfeature-01
からマージするとします:
git checkout feature-01
git checkout -b feature-01-rebased
git Push -u Origin feature-01-rebased
feature-01-rebased
のプルリクエストを開き、feature-01
のプルリクエストを閉じます。
これを修正する1つの方法はgit rebase targetbranch
そのPR。その後、git Push --force targetbranch
、Githubは正しいコミットと差分を表示します。何をしているのかわからない場合は注意してください。リベースを行うために最初にテストブランチをチェックアウトしてから、git diff targetbranch
それがあなたが望むものであることを確実にするために。
これに遭遇してGitHubプルリクエストの動作に混乱している他の人にとって、根本的な原因は、PRがソースブランチとターゲットブランチの共通の祖先に対するソースブランチチップの差分であることにあります。したがって、ソースブランチのすべての変更が共通の祖先まで表示され、ターゲットブランチで発生した可能性のある変更は考慮されません。
ここで利用可能な詳細情報: https://developer.atlassian.com/blog/2015/01/a-better-pull-request/
共通の祖先ベースの差分は危険なようです。 GitHubに、より標準的な3ウェイマージベースのPRを作成するオプションがあればいいのにと思います。
次を~/.gitconfig
ファイルに追加する必要があります。
[rebase]
autosquash = true
これにより、 this answer が示すものと同じ結果が自動的に得られます。
これは here から取得しました。
これは、ターゲットブランチからマージされたコミットをスカッシュするときにGitHubで発生します。
ターゲットブランチからのマージを含め、デフォルトのマージ戦略としてGithubとの組み合わせを使用していました。これにより、新しいコミットが導入され、GitHubは、この押しつぶされたコミットが既にマスターにあるものと同じであることを認識しません(ただし、ハッシュが異なります)。 Gitはそれを適切に処理しますが、GitHubですべての変更が再度表示されるため、確認するのが面倒です。解決策は、スカッシュアンドマージの代わりに、これらのプルアップアップストリームコミットを定期的にマージすることです。別のブランチを依存関係として自分のブランチにマージする場合は、git merge --squash
そして、他のブランチが実際にマスターになったときにマスターからプルする前に、その単一のコミットを元に戻します。
私はこれの背後にある理論について正確に確信していません。しかし、私はこれを数回取得し、以下を実行することでこれを修正することができました。
git pull --rebase
これにより、元のリポジトリマスターブランチから変更がフェッチされ、マージされます(ポイントがある場合)
次に、変更をgithubクローンリポジトリ(ターゲット)に強制的にプッシュします。
git Push -f Origin master
これにより、githubクローンと親リポジトリが同じgithubコミットレベルになり、ブランチ間で不要な変更が表示されなくなります。