web-dev-qa-db-ja.com

既にターゲットブランチにあるコミットを示すGitHubプルリクエスト

GitHubでマスターではないブランチへのプルリクエストを確認しようとしています。ターゲットブランチはマスターの背後にあり、プルリクエストはマスターからのコミットを示していたため、マスターをマージしてGitHubにプッシュしましたが、更新後もプルリクエストにコミットと差分が表示されます。 GitHubのブランチにmasterからのコミットがあることを確認しました。プルリクエストにまだ表示されるのはなぜですか?

また、プルリクエストをローカルでチェックアウトしましたが、マージされていないコミットのみが表示されます。

95
lobati

プルリクエストはターゲットブランチへの変更を追跡しないようです(GitHubサポートに連絡し、2014年11月18日にこれが仕様によるものであるとの応答を受け取りました)。

ただし、以下を実行することで、更新された変更を表示することができます。

http://githuburl/org/repo/compare/targetbranch...currentbranch

必要に応じて、githuburlorgrepotargetbranch、およびcurrentbranchを置き換えます。

または、hexspriteが彼の答えで指摘したように、クリックして強制的に更新することもできます Edit PRで、一時的にベースを別のブランチに変更してから再び元に戻します。これにより、警告が生成されます。

ベースを変更してもよろしいですか?

古いベースブランチからの一部のコミットがタイムラインから削除され、古いレビューコメントが古くなる可能性があります。

PRに2つのログエントリを残す

enter image description here

77
Adam Millerchip

これは良い回避策です。 GitHubでPRを表示するときにEditボタンを使用して、ベースブランチをmaster以外のものに変更します。次に、それをmasterに戻すと、最新のコミットからの変更のみが正しく表示されるようになります。

47
hexsprite

要約すると、GitHubはプルリクエストのコミット履歴を自動的にリベースしません。最も簡単なソリューションは次のとおりです。

解決策1:リベース

feature-01からmasterにマージするとします:

git fetch Origin
git checkout feature-01
git rebase Origin/master
git Push --force

フォークで作業している場合、上のOriginupstreamに置き換える必要があるかもしれません。元のリポジトリのリモートブランチの追跡の詳細については、GitHubフォークリポジトリの更新方法を参照してください。

解決策2:新しいプルリクエストを作成する

イントロmasterfeature-01からマージするとします:

git checkout feature-01
git checkout -b feature-01-rebased
git Push -u Origin feature-01-rebased

feature-01-rebasedのプルリクエストを開き、feature-01のプルリクエストを閉じます。

22

これを修正する1つの方法はgit rebase targetbranchそのPR。その後、git Push --force targetbranch、Githubは正しいコミットと差分を表示します。何をしているのかわからない場合は注意してください。リベースを行うために最初にテストブランチをチェックアウトしてから、git diff targetbranchそれがあなたが望むものであることを確実にするために。

13
Elijah Lynn

これに遭遇してGitHubプルリクエストの動作に混乱している他の人にとって、根本的な原因は、PRがソースブランチとターゲットブランチの共通の祖先に対するソースブランチチップの差分であることにあります。したがって、ソースブランチのすべての変更が共通の祖先まで表示され、ターゲットブランチで発生した可能性のある変更は考慮されません。

ここで利用可能な詳細情報: https://developer.atlassian.com/blog/2015/01/a-better-pull-request/

共通の祖先ベースの差分は危険なようです。 GitHubに、より標準的な3ウェイマージベースのPRを作成するオプションがあればいいのにと思います。

8
David K. Hess

次を~/.gitconfigファイルに追加する必要があります。

[rebase]
    autosquash = true

これにより、 this answer が示すものと同じ結果が自動的に得られます。

これは here から取得しました。

8
Elena

これは、ターゲットブランチからマージされたコミットをスカッシュするときにGitHubで発生します。

ターゲットブランチからのマージを含め、デフォルトのマージ戦略としてGithubとの組み合わせを使用していました。これにより、新しいコミットが導入され、GitHubは、この押しつぶされたコミットが既にマスターにあるものと同じであることを認識しません(ただし、ハッシュが異なります)。 Gitはそれを適切に処理しますが、GitHubですべての変更が再度表示されるため、確認するのが面倒です。解決策は、スカッシュアンドマージの代わりに、これらのプルアップアップストリームコミットを定期的にマージすることです。別のブランチを依存関係として自分のブランチにマージする場合は、git merge --squashそして、他のブランチが実際にマスターになったときにマスターからプルする前に、その単一のコミットを元に戻します。

3
achilleverheye

私はこれの背後にある理論について正確に確信していません。しかし、私はこれを数回取得し、以下を実行することでこれを修正することができました。

git pull --rebase

これにより、元のリポジトリマスターブランチから変更がフェッチされ、マージされます(ポイントがある場合)

次に、変更をgithubクローンリポジトリ(ターゲット)に強制的にプッシュします。

git Push -f Origin master

これにより、githubクローンと親リポジトリが同じgithubコミットレベルになり、ブランチ間で不要な変更が表示されなくなります。

0
Chanaka udaya