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


136

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

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


これは、PRをマージする動作に影響しますか?
Nathan Hinchey

いいえ、Githubの差分だけです。
ロバティ

セルフホストのGitlabが同じ動作をするかどうか誰かが知っていますか?
ジェフウェリング

2
この動作を変更することに関心があることを表明するために、全員がGitHubに連絡することをお勧めします(support.github.com/contact)。彼らが私たちから連絡がない場合、彼らはこれがどれほど重要であるかを知らず、永遠にこのようになるでしょう。
steinybot

回答:


107

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

ただし、次の操作を行うと、更新された変更を表示できます。

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

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

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

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

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

そしてPRに2つのログエントリ残します

enter image description here


4
ええ、私はしばらく前にサポートに連絡し、同じ応答を得ました。彼らはこの状況に最適化していません。それは少しイライラします。これを回避する方法は、リベースしてプッシュアップを強制するか、プルを閉じて新しいプッシュを作成することです。
ロバティ2014年

4
この回答は問題を解決するのではなく、ユーザーが本当の差分を確認できるようにするだけです。
FearlessFuture

4
問題は、「プルリクエストにまだ表示されるのはなぜですか?」でした。それはその質問に答えます。
Adam Millerchip 2016年

3
良い回避策については私のコメントをチェックしてください。PR編集ボタンを使用して別のブランチに切り替え、元のベースブランチに戻るだけで、差分を再計算できます。
hexsprite 2017年

11
これを変更するためのdear-githubリクエストはありますか?
vossad01 2018年

87

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


4
多くの人がこの解決策を知らないことに驚いています。元の古いプルリクエストは問題ないと思いますが、GitHubがすべての古いファイルを表示するのが好きではなかったので、これを使用しました。これにより、コメントが保持され、マージされる実際の変更のみが表示されます。ありがとう!
taranaki

2
うまくいきませんでした。
シャシャンク

いまいましい!
Anurag Hazra

3年後、これはまだ素晴らしい解決策です。数時間前にコメントされたばかりの人も見てください^^^
Ricardo Saporta

32

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

解決策1:リベース

masterfrom にマージしたいとしますfeature-01

git fetch origin
git checkout feature-01
git rebase origin/master
git push --force

フォークで作業している場合は、交換する必要があるかもしれません origin上記をとupstream。参照してください。私はGitHubのリポジトリフォーク更新方法を教えてください。元のリポジトリのリモートブランチを追跡する方法については、こちらをご覧ください。

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

イントロをマージしたいとします 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ます。


4
リベースはコミットハッシュを変更するので、既存のレビューコメントを破棄することになりますか?
haridsv

@haridsvおそらくはい。
Mateusz Piotrowski

push --forceを行うときに注意することはありますか?
Paul Bendevis

1
@haridsvそれは私の経験ではありません。レビューの途中で頻繁にリベースし、コメントが失われることはありません。私がPRに変更履歴を失うんが
ジョエル・

@JoelBerkeley私は実際にいくつかのレビューを経験しましたが、その間に著者がリベースし、コメントが完全であることを観察しました。ただし、段階的にレビューする機能は失われるため、大規模なレビューの場合、レビュアーにとって大きなペナルティになります。これで、PRに関するガイドラインがいくつかありました。そのうちの1つは、レビューを開いた後に決してリベースしないでください(まだ誰もレビューを開始していないことが確実でない限り)。マージは問題ありませんが、私たちのガイドラインは、マージの変更を競合解決以外の変更と混合しないことです。
haridsv

17

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

[rebase]
    autosquash = true

これは自動的にこの答えと同じことを達成します示すます。

私はからこれを得たここに


2
くそー、私は誤って投票をクリックしました。この答えは私を助けました。変更させてください。
Hector

@hosein Go for it。あなたは今それを行うことができるはずです。
Mateusz Piotrowski

1
これは、受け入れられた回答であるか、受け入れられた回答に含まれるべきであると思います。これは私が探していた結果を達成します!
ロナルドレイ

1
@RonaldRey gitリベースは、履歴の編集を伴うため、普遍的な解決策ではありません。誰もが他の人によって複製されないプライベートフォークで作業している場合は問題ありませんが、誰かがリポジトリを複製してから履歴を編集するとすぐに、異なる履歴が作成されます。
Adam Millerchip 2018

14

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

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

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


1
あなたが言及した理由は正しいようですが、私は混乱しています。通常、マスターが更新されるたびに、変更をブランチにバックマージします... git checkout my-branch-> git merge master。プルリクエストはすぐに更新されます。共通の祖先も更新されますか?
G.One 2016

2
この動作は、マージではなくリベースを実行すると発生するようです
G.One

1
@ G.One、本当に遅い返信ですが、そうです–そのマスターブランチからソースブランチにマージすると、定義上、共通の祖先が更新されます。マージしたマスターのコミットです。
David K. Hess

13

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


10

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

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

編集:別の解決策は、リベースしてプッシュを強制することです。クリーンだが書き換えられた履歴


1
@achilleに感謝します。これは本当に私の側の問題でした。スカッシュマージを無効にすると解決されます。
Ashvin777

0

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

git pull --rebase

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

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

git push -f origin master

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



-1

物事を台無しにすることにあまりにも心配している場合は、安全なアプローチを失敗させます。ファイルに移動して変更を手動で削除し、最後のコミットでスカッシュします

git add .  && git commit -a --allow-empty-message -m '' && git reset --soft HEAD~2 &&
git commit --edit -m"$(git log --format=%B --reverse HEAD..HEAD@{1})"

私は対立はありません、あなたは行ってもいいです!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.