web-dev-qa-db-ja.com

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

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

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

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

262
Kevin Hakanson

基本的に新しいブランチを作成する必要があります&cherry-pickそこに追加したいコミット。

注: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>

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

285
Kevin Hakanson

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

git branch new-branch Origin/master
git checkout new-branch

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

git cherry-pick feature

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

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

56
Lars Noschinski

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

私が持っていた:

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

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

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

Gitコマンドは次のようなものでした:

  1. git branch my-feature-request 9685770
  2. git checkout my-feature-request
  3. git pull https://github.com/original_project/original_project.git
  4. git cherry-pick b67627b
  5. git Push Origin my-feature-request

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

26
John Naegle

これは私のためにほとんど働いた:

git checkout -b upstream upstream/master

git cherry-pick <SHA hash of commit>

git Push Origin upstream

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

git Push Origin upstream:upstream

Git PushがGitHubリポジトリの上流ブランチを作成し、そこからPRを作成できるように、最後の行を変更する必要がありました。

6
hi_tech_lowlife

私はすでにコミットを行っていたので、プルリクエストとして現在のブランチに分離できるようにしたかったのです。

だから私は新しいブランチをチェックアウトしました

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。

5
irbanana

新しい(一時的な)ブランチを作成してチェリーピックし、そのブランチのプルリクエストを作成するソリューションは、私を満足させませんでした。リポジトリを変更して一連のコミットを利用できるようにしたくなかったので、次の代替案を思いつきました。

まず、関心のあるすべてのコミット用のパッチファイルを作成します。

git format-patch -1 <sha>

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

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

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

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

1

@ 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の専門家でもないので、見逃したケースがあれば自動化できるかもしれません!)

0
Nathan