最新のコミットのみのGitHubでプルリクエストを送信する


280

私はgithubでプロジェクトをforkし、ローカルマスターに変更を加え、githubでオリジンにプッシュしています。プルリクエストを送信したいが、最後のコミットのみを含めたい。github.comのプルリクエストUIには、最後の9つのコミットが表示されますが、それをフィルタリングする方法がわかりません。

新しいローカルブランチを作成する必要があるかどうかを確認しようとしていましたが、チェックして、どういうわけかリセットするか、アップストリームにリベースしましたか?次に、私のマスターからの最後のコミットをIDで新しいローカルブランチに適用し、それをプルリクエストに使用しますか?

私は概念を正しく理解し、必要なことを行うための適切なコマンドラインを理解しようとしています。


そして、他のすべてのコミットでプルリクエストを行うとどうなりますか?私はgitがすでに取り込んだコミットを無視する(または渡す)のに十分賢いと思いましたか?
jayarjo

3
おそらく、上流はまだコミットを受け入れていないか、または望んでいません。
Michael Scott Cuthbert 2014年

@jayarjoたとえば、アップストリームに送信したくない他の変更を加えました。たとえば、gitを変更してメインリポジトリを無視すると、必要はありません。gitでは簡単なことは何もありません。
マーティン

関連:Git(ソフトウェア)とGitHub(Webサービス)でのプルリクエストの違いに関する詳細
RBT

回答:


302

基本的には新しいブランチを作成し、それに追加したいコミットをチェリーピックする必要があります。

注:checkout / cherry-pickコマンドの前にこれらが必要になる場合があります

git remote add upstream <git repository>

git remote update

git checkout -b <new-branch-name> upstream/master

git cherry-pick <SHA hash of commit>

git push origin <new-branch-name>

その後、<new-branch-name>githubにブランチが表示され、それに切り替えて、必要な変更を加えたプルリクエストを送信できます。


32
またgit remote add upstream <git repository>git remote updategit checkout -bアップストリームアップストリーム/マスターを実行する必要があります。
plainjimbo 2013年

6
これは機能しますが、本来の方法ではありません。上流のブランチと上流/マスターが異なり、プルリクエストのマージが上流で最初に行われない場合は常に異なるためです。そのため、stackoverflow.com / a / 5256304/1904815を実行することをお勧めします。
JonnyJD 2013

2
詳しく説明すると、これは技術的な問題ではなく、論理的な問題です。アップストリームで何かをしたい場合(そこからのマージなど)、「real-upstream」ブランチを追加するか、アップストリームをリセットする必要があります(追加の変更のためのプルリクエスト用のローカルブランチを残しません)。
JonnyJD 2013

15
変更された1行のコードのPRを作成するためだけに、なぜ追加のブランチが必要なのですか?githubの誰かがこれを熟考しましたか?
CodeManX 2015

2
@JonHannaいいえ...なぜブランチをマージする必要があるのですか?なぜコミットをマージできないのですか?
Kevin Krumwiede

57

元のリポジトリにもある最新のコミットから新しいブランチを作成します。

git branch new-branch origin/master
git checkout new-branch

次に、を使用git cherry-pickして、プルリクエストを実行する単一のコミットを取得します。このコミットのあるブランチが呼び出されfeature、必要なコミットがこのブランチの最新のコミットである場合、これは

git cherry-pick feature

このパッチが競合することなく適用されると仮定すると、プルリクエストを実行できるブランチができました。

次のステップでは、featureブランチをどうするかを決める必要があります。このブランチでの変更をまだ公開していない場合、最良の手順はおそらく、このブランチをnew-branchに基づいてリベースすることです(これがによって自動的に行われない場合は、最後のコミットを削除しますgit rebase)。


チェリーピックの後にこのメッセージが表示されます。コミットに追加されたものはありませんが、追跡されていないファイルが存在します(追跡するには「git add」を使用してください)。すべては私のマスターにありますが、上流からブランチを作成する必要があります。
Kevin Hakanson、2011年

5
featureがすでにでコミットされている場合、の間はorigin/master何も起こりませんcherry-pick。新しいブランチは、upstream/master(すなわち、ケビン・ハカンソンの回答)からのものでなければなりません
ohho

26

私はフォークをフォークしていて、元のプロジェクトにプルリクエストを送信したい状況になってしまいました。

私が持っていた:

  • orignal_project
  • forked_project(SHAの元のプロジェクトから作成:9685770)
  • my_fork(SHA:207e29bのフォークされたプロジェクトから作成)
  • 私のフォーク(SHA:b67627b)で、元のプロジェクトに送信したいコミット

これを行うために、私は:

  1. 元のプロジェクトがフォークされたSHAから新しいブランチを作成しました
  2. 元のプロジェクトからすべてを引き出した
  3. チェリーはプルリクエストとして提出したいコミットを選びました
  4. すべてをgithubにプッシュしました

gitコマンドは次のようなものです。

  1. gitブランチmy-feature-request 9685770
  2. git checkout my-feature-request
  3. git pull https://github.com/original_project/original_project.git
  4. gitチェリーピックb67627b
  5. git push origin my-feature-request

次に、元のプロジェクトへのプルリクエストのブランチとしてmy-feature-requestを選択しました。


6

これはほとんど私にとってうまくいきました:

git checkout -b upstream upstream/master

git cherry-pick <SHA hash of commit>

git push origin upstream

唯一の違いはこれでした:

git push origin upstream:upstream

最後の行を変更して、GitHubリポジトリにgit pushがアップストリームブランチを作成し、そこからPRを作成できるようにする必要がありました。


5

現在のブランチへのプルリクエストとして分離できるようにしたいコミットをすでに作成しました。

新しいブランチをチェックアウトしました

git checkout -b isolated-pull

そして、ここで私の解決策が@Kevin Hakansonの解決策と異なるのは、このブランチを、私が比較したい履歴内の場所にリセットする必要があるためです。

git reset --hard [sha-to-diff-by]

そして、分離されたプルリクエストを作成したいコミットをチェリーピックします

git cherry-pick [my-isolated-commit-sha]

最後にそれをリモートにプッシュします

git push origin isolated-pull

そしてプルリクエストdat shi。


1

新しい(一時的な)ブランチを作成し、cherry-pickを実行し、そのブランチのプルリクエストを作成するソリューションは、私を満足させませんでした。リポジトリを変更して一連のコミットを利用可能にしたくなかったので、次の代替案を考え出しました。

まず、対象となるすべてのコミットのパッチファイルを作成します。

git format-patch -1 <sha>

興味のあるコミットが最後のコミットである場合は、HEAD代わりに使用できます<sha>

これで、パッチを適用できるソースリポジトリのメンテナにパッチを送信できます。

git branch new-branch <master or some older commit where the fork diverged>
git checkout new-branch

git am < <the patch>
...

git checkout master
git merge new-branch

最後に、これは一時的なブランチがプルリクエストによってマージされた場合と同じように見えるはずですが、fork-repositoryにその追加のブランチはありません。


0

@ kevin-hakansonの回答に基づいて、このプロセスを簡単にするために、この小さなbashスクリプトを書きました。アップストリームレポがまだ存在しない場合は追加し(URLの入力を求めます)、作成する新しいブランチの名前と、そのブランチにチェリーピックするコミットのタグ/ SHAの両方を要求します。現在ブランチまたはコミットをチェックしてから、変更を隠しておき、新しいブランチをチェックアウトできるようにします。マージ戦略は、厳選されたコミットからの変更を保持します。新しいブランチをorigin(リモートリポジトリの名前と想定される)にプッシュした後、以前のブランチまたはコミットが再度チェックアウトされ、以前の変更がスタッシュからポップされます。

if ! git remote | grep -q upstream; then
    read -p "Upstream git repo URL: " upstream
    git remote add upstream $upstream
    git remote update
fi

read -p "Feature branch name: " feature_branch
# note: giving "master" is the same as giving the SHA it points to
read -p "SHA of commit to put on branch: " sha

current_branch=$(git rev-parse --abbrev-ref HEAD)
if [ "$current_branch" == "HEAD" ]; then
    # detached HEAD; just get the commit SHA
    current_branch=$(git rev-parse --short HEAD)
fi
git stash
git checkout -b $feature_branch upstream/master
git cherry-pick --strategy=recursive -X theirs $sha
git push origin $feature_branch
git checkout $current_branch
git stash pop

(これはいくつかの簡単なテストでうまくいきましたが、私はbashプログラマーでもgitの専門家でもないので、もっと自動化できる可能性のあるケースを見逃した場合はお知らせください!)

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