Skip to content

Instantly share code, notes, and snippets.

@mtei
Last active July 2, 2023 05:00
Show Gist options
  • Star 14 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mtei/d4e64dee304088d7662771c024e3d2c7 to your computer and use it in GitHub Desktop.
Save mtei/d4e64dee304088d7662771c024e3d2c7 to your computer and use it in GitHub Desktop.
qmk firmware の追いかけ方とプルリクのやり方

qmk firmware の追いかけ方とプルリクのやり方

この文書では、コマンドラインから git を使って qmk_firmware をクローンして、ブランチを作ってプルリクエストを出す手順の概要を説明しています。

参考資料

本文書を読んだあとで qmk_firmware のドキュメントの以下のものにも目を通して置くとより一層理解が深まると思います。

目次

0. 最初の準備

以下の順に実行します。

0-1. GitHub に自分のアカウントを作成する

やり方の詳細はこの文書では省略します。参考資料を探して参照してください。

GitHub 入門 ~アカウントを作成する方法~

0-2. https://github.com/qmk/qmk_firmware をフォークする。

やり方の詳細はこの文書では省略します。参考資料を探して参照してください。

GitHubのヘルプ - リポジトリをフォークする

0-3. 手元の PC にクローンする

以下を実行します。

$ git clone https://github.com/MY_ACCOUNT/qmk_firmware
$ cd qmk_firmware

この時点で、手元(のPC)に qmk_firmware リポジトリが出来上がり、この リポジトリの中では、親リポジトリ(GitHub 上の自分のアカウントの qmk_firmware リポジトリ)は、origin という名前になります。

0-4. フォーク元の QMK の qmk_firmware リポジトリをリモート登録する

手元(のPC)の qmk_firmware リポジトリから参照できるように、フォーク元の QMK の qmk_firmware リポジトリをリモート登録します。

(既に $ cd qmk_firmware したものとします)
$ git remote add qmk https://github.com/qmk/qmk_firmware

この時点で、手元(PC)の qmk_firmware リポジトリの中では、フォーク元の QMK の qmk_firmware リポジトリの名前は、qmk になります。

確認してみましょう。

$ git remote -v
origin https://github.com/MY_ACCOUNT/qmk_firmware (fetch)
origin https://github.com/MY_ACCOUNT/qmk_firmware (push)
qmk    https://github.com/qmk/qmk_firmware (fetch)
qmk    https://github.com/qmk/qmk_firmware (push)

実は フォーク元のリポジトリの名前は、upstream をつけるのが慣例です。 他の資料をみると、そうなっている例が多数あります。 しかしここでは、名前が指している対象がわかりやすい qmk ですませます。

QMK のリポジトリのブランチ情報を取得しておきます。

$ git fetch qmk

ブランチのリストを見てみましょう。自分のアカウントのリポジトリのマスターブランチ origin/master と QMK のリポジトリのマスターブランチ qmk/master があることが確認できます。

$ git branch -a
* master
  remotes/origin/HEAD -> origin/master
  remotes/origin/master
  remotes/qmk/master
  その他ごちゃごちゃ沢山

以後、自分のリポジトリの master ブランチは、QMK の qmk_firmware リポジトリの master ブランチと履歴も含めて同一になるように運用する方針とします。

つまりローカルでは master ブランチへの commit、または他のブランチから master ブランチへの merge はやらないことにします。

1. QMK の qmk_firmware リポジトリとの同期のとりかた

前節の最後の手順の直後では、QMK, 自分のアカウントのフォーク、手元(PCの)それぞれの master ブランチは同じ履歴になります。しかし QMK にあらたなコミットが追加されると、QMK の master の履歴はのびていきます。

こうなったとき、自分のアカウントの qmk_firmware リポジトリ、手元(PC)の qmk_firmware リポジトリは、おいてけぼりになります。これは自分で同期させなければなりません。 GitHub には、フォークした自分のリポジトリと元のリポジトリを同期させる直接の手段は用意されていません。

以下の手順で、定期的に、あるいは必要なときに手動で同期をさせます。

手元(PC)の qmk_firmware リポジトリに、フォーク元のリポジトリの新しい情報(コミット等)を取り込み、それを GitHub 上の自分のアカウントの qmk_firmware リポジトリに push してやる必要があります。

フォーク元のリポジトリの新しい情報(コミット等)を取り込みは以下のように行います。

(既に $ cd qmk_firmware してあるものとします)
(既に $ git checkout master してあるものとします)
$ git pull qmk master

そして、GitHub 上の自分のアカウントの qmk_firmware リポジトリに push します。

$ git push origin master

確かめてみましょう。

$ git log --graph --pretty=oneline --abbrev-commit --decorate
* 9ea9806d6 (HEAD -> master, tag: 0.7.89, qmk/master, origin/master, origin/HEAD) Set up language fallback for docs, and update translation guidelines (#7403)
* 7874f297b (tag: 0.7.88) Remove CR when computing BOOTLOADER_SIZE. (#7453)
* 3541f01a7 Update led_update_kb example (#7451)
* eae21eed7 [Keymap] Adding hbbisenieks keymap for keebio/iris (#7440)
* e62ab7e25 Allow overriding of all functions in wonderland.c (#7198)
* 0270d4d5a [Keymap] changed knight ridder offset to face me on planck (#7445)
* 7e9ed2acb (tag: 0.7.87) Fix clang-format logic within CI (#7386)
* 66d473437 (tag: 0.7.86) Improve and streamline MSYS2 installation (#7232)
以下略

2. 改造の仕方と QMK qmk_firmware リポジトリへのプルリクエストの出し方

qmk_firmware に自分のキーマップやキーボードを追加する、ドキュメントの日本語訳を追加する、ドキュメントの改訂をする、などの作業をする場合は、master ブランチから分岐した別のブランチを作ってその上で作業を進めます。こういった、特定のテーマの変更のために作るブランチをトピックブランチと呼ぶことがあります。

トピックブランチの名前は、変更事項を表わす名前をつけると良いです。 例えば、XXX機能の追加であれば add_XXX_function のように、また例えば、YYYドキュメントの修正、であれば、update_YYY_document のように。

(実は、qmk_firmware の Core 部分、quantum/, tmk_core/, drivers/, platforms/, lib/ などに変更を加える場合は、master ブランチではなく develop ブランチから分岐するのですが、このケースはより上級な話題なので、この文書では取り扱いません。 PR チェックリスト互換性を破る変更/Breaking changes を参照してください。)

2-1. トピックブランチを作る

トピックブランチを分岐させるポイントを決めます。

前の節 QMK の qmk_firmware リポジトリとの同期のとりかたで示した方針通り qmk の master と自分の master が一致している場合は、最新の状態に同期させたあと master を分岐ポイントとするのが良いでしょう。

以下の様にします。

(既に $ cd qmk_firmware してあるものとします)
$ git branch update_YYY_document master
$ git checkout update_YYY_document

もしも、qmk の master と自分の master が不一致の場合は、qmk が履歴の要所要所でつけているタグを分岐ポイントとすると良いでしょう。

まず qmk の最新状態を取得します。

(既に $ cd qmk_firmware してあるものとします)
$ git fetch qmk

そして最新のタグをさがします。

$ git log --graph --pretty=oneline --abbrev-commit --decorate qmk/master
* 9ea9806d6 (tag: 0.7.89, qmk/master) Set up language fallback for docs, and update translation guidelines (#7403)
* 7874f297b (tag: 0.7.88) Remove CR when computing BOOTLOADER_SIZE. (#7453)
* 3541f01a7 Update led_update_kb example (#7451)
* eae21eed7 [Keymap] Adding hbbisenieks keymap for keebio/iris (#7440)
* e62ab7e25 Allow overriding of all functions in wonderland.c (#7198)
* 0270d4d5a [Keymap] changed knight ridder offset to face me on planck (#7445)
* 7e9ed2acb (tag: 0.7.87) Fix clang-format logic within CI (#7386)
* 66d473437 (tag: 0.7.86) Improve and streamline MSYS2 installation (#7232)
以下略

(tag: 0.7.89, qmk/master) という表示があるので、0.7.89が最新でした。以下の様にしてトピックブランチを作ります。(無理に最新でなくても、0.7.880.7.87 などの十分最近のものでも構いません)

(既に $ cd qmk_firmware してあるものとします)
$ git branch update_YYY_document 0.7.89
$ git checkout update_YYY_document

2-2. トピックブランチにコミットする

必要なだけファイルの編集とコミットを繰り返します。

$ edit file
$ git add file
$ git commit

2-3. トピックブランチを GitHub 上の自分のアカウントの qmk_firmware リポジトリoriginに pushする

以下のようにします。

(既に $ cd qmk_firmware してあるものとします)
$ git push origin update_YYY_document

2-4. GitHub 上でプルリクエストを出す

作成した、update_YYY_document ブランチをプルリクエストします。

やり方の詳細はこの文書では省略します。参考資料を探して参照してください。

GitHubのヘルプ - プルリクエストで、作業に対する変更を提案する
GitHubのヘルプ - プルリクエストの作成方法

2-5. 修正要求に対応する変更や後から気がついた変更を行う

プルリクエストを出した後も、マージされる前ならば追加の変更は可能です。 「トピックブランチにコミットする」 と 「トピックブランチをoriginに push する」 を繰り返してください。自動的にプルリクエストのなかに追加されます。

プルリクエスト上でレビュアーから修正要求があったら、上の手順で変更を追加します。

また、プルリクエスト中にレビュアーから提案された変更を GitHub 画面上で、Commit suggenstion ボタンを押して採用することも出来ます。この場合、GitHub上でコミットが作成されるので、手元のリポジトリに取りこむ必要があります。

以下のようにします。

(既に $ git checkout update_YYY_document してあるものとします)
$ git fetch origin
$ git rebase origin/update_YYY_document

2-6. qmk の qmk_firmware リポジトリにマージされたら、master ブランチの同期を行う

プルリクエストがマージされたら、master ブランチの同期 をしておくと良いでしょう。

2-7. トピックブランチを消す

用がすんだら、トピックブランチを消します。

GitHub 上の自分のアカウントの qmk_firmware リポジトリ origin のブランチを消します。

$ git push --delete origin update_YYY_document

手元のリポジトリのブランチも消します。 (後で、細かい履歴を参照したくなった時のこと考えて消す前にタグを振っておきます。以下の例では、タグの名前は prlog/update_YYY_document です。)

$ git checkout master
$ git tag prlog/update_YYY_document update_YYY_document
$ git branch -D update_YYY_document
@shelaf
Copy link

shelaf commented Nov 25, 2019

@mtei
Copy link
Author

mtei commented Nov 25, 2019

ども。

@3araht
Copy link

3araht commented Sep 18, 2020

つかぬ事を伺います。
$ git pull qmk master
をした後、git status で以下のように ilb/vusb が変更されたと認識されるようになってしまうのですが、対策方法などわかれば教えれいただけないでしょうか。よろしくお願い致します。

qmk_firmware $ git status
On branch master
Your branch is up to date with 'origin/master'.

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
	modified:   lib/vusb (new commits)

no changes added to commit (use "git add" and/or "git commit -a")

@shelaf
Copy link

shelaf commented Sep 18, 2020

これはlib/vusbサブモジュールのほうの更新があったためです。gitのコマンドでサブモジュールを更新するか、qmkなら make git-submodule とすれば同じことができます

@3araht
Copy link

3araht commented Sep 18, 2020

ご教示いただきありがとうございます!解決しました。
いくら lib/vusb qmk などで検索しても手掛かりを得ることができなかったので助かりました。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment