Githubでプロジェクトを分岐し、ローカルマスターに変更を加えて、githubでOriginにプッシュしました。プルリクエストを送信したいが、最後のコミットのみを含めたい。 github.comのプルリクエストUIには最後の9つのコミットが表示されますが、これをフィルターする方法はわかりません。
私は新しいローカルブランチを作成し、それをチェックアウトし、何らかの方法でアップストリームにリセットまたはリベースする必要があるかどうかを理解しようとしましたか?次に、IDによるマスターからの最後のコミットを新しいローカルブランチに適用し、それをプルリクエストに使用しますか?
概念を正しく理解し、必要なことを行うための適切なコマンドラインを見つけようとしています。
基本的に新しいブランチを作成する必要があります&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>
ブランチが表示され、それに切り替えて、必要な変更を含むプルリクエストを送信できます。
Originリポジトリにもある最新のコミットから新しいブランチを作成します。
git branch new-branch Origin/master
git checkout new-branch
次に、git cherry-pick
を使用して、プルリクエストの対象となる単一のコミットを取得します。このコミットのあるブランチの名前がfeature
で、必要なコミットがこのブランチの最新のコミットである場合、これは
git cherry-pick feature
このパッチが競合することなく適用されると仮定すると、プルリクエストを実行できるブランチが得られます。
次のステップでは、feature
ブランチをどうするかを決める必要があります。このブランチで変更をまだ公開していない場合、最良の手順は、おそらく新しいブランチに基づいてこのブランチをリベースすることです(そして、git rebase
によって自動的に行われない場合、最後のコミットを削除します)。
フォークをフォークして、元のプロジェクトにプルリクエストを送信したいという状況になりました。
私が持っていた:
これを行うために、私は:
Gitコマンドは次のようなものでした:
次に、元のプロジェクトへのプルリクエストのブランチとして、feature-requestを選択しました。
これは私のためにほとんど働いた:
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を作成できるように、最後の行を変更する必要がありました。
私はすでにコミットを行っていたので、プルリクエストとして現在のブランチに分離できるようにしたかったのです。
だから私は新しいブランチをチェックアウトしました
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。
新しい(一時的な)ブランチを作成してチェリーピックし、そのブランチのプルリクエストを作成するソリューションは、私を満足させませんでした。リポジトリを変更して一連のコミットを利用できるようにしたくなかったので、次の代替案を思いつきました。
まず、関心のあるすべてのコミット用のパッチファイルを作成します。
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
最後に、これは一時的なブランチがプルリクエストによってマージされた場合と同じように見えるはずですが、フォークリポジトリに追加のブランチはありません。
@ 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の専門家でもないので、見逃したケースがあれば自動化できるかもしれません!)