github:既存のプルリクエストにコミットを追加する


88

Fork&Edit this file fileボタンを使用して、githubのrailsリポジトリへのプルリクエストを開きました。

さて、PRに関するフィードバックを受け取った後、さらにいくつかのコミットを追加したいと思いました。これが私がやったことで終わったことです

$ git clone git@github.com:gaurish/rails.git #my forked repo
$ git rebase -i 785a2e5 #commit hash of my commit using which PR was opened
$ git checkout patch-3 #branch name I had to send my commits under to be shown in that PR
$ git commit -am "Changes done as per feedback"
$ git push origin patch-3

これは問題なく機能しましたが、非常に複雑なワークフローのようです。たぶん私はここで何か間違っているのですか?

私の質問は:私はこれを正しい方法でやっていますか?そうでない場合、これを行うための適切な方法は何ですか?


4
ここに来ていくつかは、これはより自分のシナリオに合うかもしれない:stackoverflow.com/questions/9790448/...を
AaronLS

4
また、このバージョンの質問/回答がより明確になっていることもわかりました:stackoverflow.com/questions/7947322/…–
ベンウィーラー

回答:


62

GitHubのツールを使用していて、1つのファイルを変更するだけなので、GitHubでファイル参照し、左上隅の[ツリー:]ドロップダウン(このpatch-3場合)から適切なブランチを選択して、[編集]を選択することもできます。このファイル"。これで、変更がこのブランチにコミットされ、プルリクエストに表示されます


10

私は最近このトピックについてブログを書きました:

この機能ブランチを最新の状態に保つにはどうすればよいですか?最新のアップストリームコミットのマージは簡単ですが、アップストリームにプッシュされたときに評価されないため、マージコミットの作成は避けたいと考えています。アップストリームの変更を効果的に再コミットすると、それらのアップストリームコミットは新しいハッシュを取得します(彼らは新しい親を取得するので)。これらのマージされたコミットは、それらの更新を個人のGitHub機能ブランチにプッシュするときにGitHubプルリクエストに反映されるため、これは特に重要です(プルリクエストを発行した後に行った場合でも)。

そのため、マージする代わりにリベースする必要があります。

git co devel #devel is ansible's HEAD aka "master" branch
git pull --rebase upstream devel
git co user-non-unique
git rebase devel

rebaseオプションとgitへのrebaseコマンドはどちらもツリーをクリーンに保ち、マージコミットを回避します。ただし、これらはリベースされている最初のコミット(最初のプルリクエストを発行したもの)であり、リモートgithubリポジトリブランチに残っている元のハッシュとは異なる新しいコミットハッシュがあることに注意してください。

両方のブランチが異なるため、これらの更新を個人のGitHub機能ブランチにプッシュすると失敗します。ローカルブランチツリーとリモートブランチツリーは、コミットハッシュが異なるため、「同期がとれていません」。Gitは、最初git pull --rebaseにプッシュしてからもう一度プッシュするように指示しますが、履歴が書き換えられたため、これは単純な早送りプッシュではありません。それをしないでください!

ここでの問題は、最初に変更されたコミットを元の状態で再度フェッチし、それらがローカルブランチの上にマージされることです。非同期状態のため、このプルは正しく適用されません。コミットが2回表示されるという壊れた履歴が表示されます。これらすべてをGitHub機能ブランチにプッシュすると、これらの変更は元のプルリクエストに反映され、非常に醜くなります。

AFAIK、これに対する完全にクリーンな解決策は実際にはありません。私が見つけた最善の解決策は、ローカルブランチをGitHubブランチに強制的にプッシュすることです(実際には、早送りではない更新を強制します)。

git-push(1)によると:

Update the origin repository’s remote branch with local branch, allowing non-fast-forward updates. This can leave unreferenced commits dangling in the origin repository.

したがって、引っ張らないで、次のように強制的に押してください。

git push svg +user-non-unique

または:

git push svg user-non-unique --force

これにより、実際にはリモートブランチが、ローカルブランチ内のすべてのもので明らかに上書きされます。リモートストリームにある(そして失敗を引き起こした)コミットはそこに残りますが、ぶら下がっているコミットになり、最終的にgit-gc(1)によって削除されます。大きな問題ではない。

私が言ったように、これはAFAICSの最もクリーンなソリューションです。これの欠点は、PRがそれらの最新のコミットで更新されることです。これは後日取得され、PRのコメント履歴に同期していないように見える可能性があります。大きな問題はありませんが、混乱を招く可能性があります。


5

master特定のabc1234リビジョンの代わりにバインドされる新しいプルリクエストを作成することもできます。

そうすれば、リポジトリへの新しいコミット/プッシュがプルリクエストに追加されます。


3

ええ-あなたは必要以上に多くの仕事をしています。追加のコミットを行ってから、強制的にプッシュするだけです。ブラウザでgithubを更新すると、元のコミットと新しくプッシュされたコミットが表示されます。

$ git commit -m "These changes are in response to PR comments"
$ git push -f origin HEAD

これは最も簡単で簡単な方法ですが、なぜそれがトップアンサーではないのか
わかり
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.