Pull Request 作成手順備忘録

Githubでの初PR(pull request)がマージされたので,備忘録代わりに作成手順を記しておく.
PRしたのはこのリポジトリで,#25#26の修正である.

ブランチ作成と修正コミット

まず,修正対象となるレポジトリをcloneする.

今となっては先に自分のリポジトリにforkして,そのforkしたリポジトリをcloneした方がスムーズだったかもしれない.

修正する内容のbranchを作成し,コードを修正,作成したbranchにコミットする.今回は下記のようにした.

git checkout -b fix/start-iteration-init
git add openevolve/controller.py
git commit -m "Fix: Define start_iteration before initial program creation to avoid UnboundLocalError"

GitHubでリポジトリをフォークする

最初,上記コミットを直接リモートリポジトリへpushしたが,当然ながらオリジナルのリモートリポジトリへの書き込み権限はないのでpushできず.ChatGPTに相談しforkして自分のリポジトリにpushするやり方を教えてもらった.

  • ブラウザで本家リポジトリ(例: https://github.com/codelion/openevolve )にアクセス
  • 右上の「Fork」ボタンをクリックし、自分のGitHubアカウントにリポジトリを作成

自分のリポジトリ(myfork)をリモートに追加

git remote add myfork git@github.com:<your-username>/openevolve.git

自分のリポジトリ(myfork)にpush

git push myfork fix/start-iteration-init

自分のリポジトリ(myfork)から本家リポジトリへPull Request作成

  • GitHubの自分のリポジトリ(myfork)ページにアクセス
  • 「Compare & pull request」または「New pull request」ボタンをクリック
  • ベースリポジトリ(例: codelion/openevolve)のmainブランチに対して、自分のfix/start-iteration-initブランチからPRを作成
  • タイトル・説明を記入し、作成

既存修正(A)を新しい修正(B)にcherry-pickして開発・PRする方法

先のPRをした後,別の修正も気になったため,追加でPRしたくなったものの,先のPR(以降Aとする)がまだマージされていなかったため,下記の手順でPRを作成した.

Aの修正コミットIDを調べる

git log fix/start-iteration-init

mainから新しい作業ブランチを作成

git checkout main
git pull origin main
git checkout -b feature/new-fix

Aの修正をcherry-pickで一時的に適用

git cherry-pick <AのコミットID>

その後,Bの修正を加える.

cherry-pickの修正を除外

cherry-pickしたコミットを巻き戻し,unstageする.

git reset --soft HEAD^
git restore --staged <cherry-pickしたコミットのファイル>

HEAD^の部分は<戻りたいコミットID> としても良い.

Bの修正だけをコミット

git add <Bの修正のファイル> などでBの修正だけを選択的にステージし、コミット

pushしてPR作成

git push origin feature/new-fix

GitHubでPRを作成.

余談

openevolveはBlackによるPythonのスタイル統一をしているが,コミット前にそれを把握していなかったため,コミット後、CIによるスタイルチェックでBlackの基準に合っていないとのエラーをいただいた.

そこで homebrew でBlackをインストールし,ソースをBlackで修正して再度コミット.無事に本家レポジトリからマージ承認をいただけました.

初PR経験を通して,GitHubでのPRの流れがわかったのはもちろんのこと,gitの使い方やPythonスタイルのblackなどの知識を得ることができ,勉強になった.


Posted

in

by

Tags:

コメント

Leave a Reply

Your email address will not be published. Required fields are marked *

CAPTCHA