2012-04-13 10 views
67

フォーク&ファイルボタンを使用して、githubでrailsリポジトリへのプルリクエストを開きました。github:既存のプルリクエストへのコミットの追加

今、 私のPRのフィードバックを得た後、私はいくつかのコミットを追加したかったのです。ここに私が行ったことがあります。

$ git clone [email protected]: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 

これはうまくいきましたが、かなり複雑なワークフローのようです。多分私は間違ってここ何か間違っている?

私の質問は 正しい方法ですか?そうでない場合は、これを行う適切な方法は何ですか?

+3

ここに来ると、シナリオに合ったものが見つかるかもしれません:http://stackoverflow.com/questions/9790448/how-to-update-a-pull-request – AaronLS

+3

このバージョンの質問/回答はもっと明確になりました: http://stackoverflow.com/questions/7947322/preferred-github-workflow-for-updating-a-pull-request-after-code-review?rq=1 –

答えて

45

、あなたもbrowse to the file GitHubの上、「木:」の下、左上隅から適切なブランチを選択することができます(あなたのケースでpatch-3)ドロップダウン、そして今選びます"このファイルを編集する"。今、あなたの変更は、このブランチにコミットされ、あなたのプルリクエストこのトピックに関する

+0

素晴らしい、ありがとう。 – Magne

4

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

これで、リポジトリへの新しいコミット/プッシュがプルリクエストに追加されます。あなたはGitHubでのツールを使用して1つのファイルだけを変更しているので

7

Iちょうど最近bloggedに表示されます:

はどのように我々は、最新のこの機能ブランチを維持していますか?最新のアップストリームコミットを簡単にマージすることは簡単ですが、マージコミットを作成しないようにしたいと思います。これは、アップストリームにプッシュされても認識されないためです。彼らは新しい親を得る)。これらのマージされたコミットは、あなたの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 

両方リベースのオプションとのgitにコマンドをリベースすると、きれいなあなたのツリーを維持し、コミットをマージがなくなります。 しかし、それらはリベースされている新しいコミットハッシュを持っている最初のコミット(あなたが最初のプルリクエストを発行した相手)であり、リモートgithubリポジトリブランチに残っている元のハッシュとは異なります。

ここで、これらのアップデートを個人のGithubフィーチャーブランチにプッシュすると、両方のブランチが異なるため、ここでは失敗します。コミットハッシュが異なるため、ローカルブランチツリーとリモートブランチツリーは「同期していません。 Gitは最初にgit pull --rebaseを実行してから再度プッシュするように指示しますが、これは簡単な早送りプッシュではなく、歴史が書き直されてしまいます。それをしないでください!

ここで問題となっているのは、最初に変更されたコミットを最初にフェッチし、それらがローカルブランチの上にマージされるということです。同期外の状態のため、このプルはきれいには適用されません。あなたはコミットが2回現れるb0rken履歴を取得します。これらのすべてをgithubフィーチャーブランチにプッシュすると、それらの変更は元のプルリクエストに反映され、非常に醜いものになります。

AFAIK、これには完全にクリーンな解決策はありません。Gitのプッシュを1として

(1):私が見つけた最良の解決策は、(実際には非高速orwardの更新を強制的に)あなたのgithubのブランチにローカルのブランチを押し強制することです

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 

をこれが実際にはっきりoverwritます「トンは、ちょうどこのようにプッシュを強制する、引っ張りますあなたのローカルブランチのすべてを使ってリモートブランチを作成します。リモートストリームにある(そして失敗を引き起こした)コミットは残っていますが、git-gc(1)によって最終的に削除されるコミットが絡んでいます。大きな問題ではない。

私が言ったように、これはAFAICSの最もクリーンな解決策です。これの欠点は、あなたのPRが最新のコミットで更新され、後日取得され、PRのコメント履歴に同期外れて表示される可能性があることです。大きな問題はありませんが、混乱する可能性があります。

関連する問題