データサイエンティストのための Git 入門
チーム開発編
Author : 宇賀神みずき
皆様こんにちは。AWS の パートナーソリューションアーキテクトの 宇賀神みずき こと しょぼちむ(@syobochim) です。9 月に入りましたが皆さまいかがお過ごしでしょうか ? この記事を書いている数日間は、めちゃくちゃ暑い日々が続いています。外に出るとジリジリと肌が焼ける感覚がします。暑い。皆さまも体調にはお気をつけください。
本連載では「チーム開発を意識した Git の使い方」をデータサイエンティストの方に向けてご紹介します。
初回の記事 では、Git のクローンやコミットなど基本的な操作をご紹介しました。今回は、チームでの開発に不可欠なブランチの作成やマージ、プルリクエストの作り方をご紹介します。
初回の記事と同じように、Git の操作には Amazon SageMaker Studio Lab (以降、 Studio Lab) を利用します。 Studio Lab はデータサイエンティストの方に馴染みがある JupyterLab がインターネット上で無料で利用できるサービスです。Git の操作を GUI で簡単に行えるため練習に適しています。お手元のPCにインストールされている JupyterLab を使って操作を学びたい方は、jupyterlab-git のプラグインを利用すると同じ操作ができます。
初回の記事はこちら » データサイエンティストのための Git 入門
チーム開発に欠かせないブランチ
Git には複数人で開発するときに便利なブランチという機能があります。ブランチという名前の通り、本体と枝分かれさせて変更履歴を管理できます。
チームで開発をしていると、複数の人が日々いろんな機能を開発したり変更したりしますよね。変更履歴の保存場所が一つしかないと、全員が同じ場所にいろんな機能の変更をコミットしていくことになり、お互いに影響を与えたり管理が複雑になったりしてしまいます。また、誰かの変更によって他の人の環境が正常に動かなくなってしまうかもしれません。
そんな事態にならないように、開発する機能や課題の単位でブランチを作りましょう。ブランチ上で作成した変更履歴は他のブランチに影響を与えません。新しく作ったブランチ上で想定通り機能が動くことを確認したら、チームで使っているブランチに統合します。
ブランチには名前が付けられます。 GitHub リポジトリの「data-scientist-git-practice」にアクセスして、画面の左上を見てみましょう。「main」と書いているのがこのリポジトリのデフォルトとして設定されているブランチ名です。
実は、昔は GitHub のデフォルトブランチ名に「master」が使用されていました。しかし、近年は人権問題を背景として 「master」「slave」という用語を避けようという動きがあります。そのため、 GitHub のデフォルトブランチ名も現在では「main」が使われています。
ブランチを作成するときに開発者の名前をつけてその人専用のブランチとして開発を進めるチームが稀にあります。しかし、そうしてしまうとブランチが長く保持されるようになり、そのブランチにて色々な機能開発が行われ、最終的に統合するときにたくさんの修正が入ってブランチの統合が難しくなってしまう、ということが起こります。そのため、ブランチは作業単位や課題単位とし、ブランチを長く持ちすぎないように注意しましょう。ブランチが長く、多く残りすぎてしまうと、ブランチの管理自体が難しくなってしまいます。
練習用のリポジトリを用意しよう
まずは練習用に利用するリポジトリを Studio Lab 上にクローンしていきましょう。(フォークやクローンの方法については初回記事で解説をしているので、操作に迷った方はそちらを見てみてくださいね。)
今回はデータサイエンティストが Git の練習をするためのリポジトリである data-scientist-git-practice を使います。リンクをクリックし、 GitHub のページが開いたら画面右上の「Fork」のボタンをクリックしてリポジトリをフォークしましょう。
Create a new fork のページではそのままの設定で 「Create fork」をクリックします。
しばらく待つとあなたのアカウントに data-scientist-git-practice のリポジトリが作成されます。
「Code」のボタンをクリックし、 HTTPS のタブをクリックします。表示された .git で終わる URL をメモしておきましょう。
メニューバーの「Git」をクリックして、「Clone Git Repository」をクリックします。表示されたポップアップの「Git repository URL (.git)」に先ほどメモした URL を入力し、「Project directory to clone into」は何も入力せず、「Clone」のボタンをクリックします。
「No Conda environment file found」のポップアップが表示されたら「Dismiss」ボタンをクリックしてください。リポジトリには Conda の環境定義は入っていないので Dismiss をして大丈夫です。
この操作によって、 data-scientist-git-practice フォルダが Studio Lab 上に作成されました。今回はこのローカルリポジトリを利用します。
ブランチを作ろう
Git リポジトリにブランチを作っていきましょう。ブランチは GitHub の画面からでも作れますが、今回は Studio Lab 上のローカルリポジトリでブランチを作成します。
まず、左のサイドバーの上から 3 つ目にある、 Git の操作をするためのアイコンをクリックします。Current Branch に 「main」と表示されていますね。これは今 main ブランチを操作・編集していることを示します。
Current Branch をクリックすると「main」「origin/main」「origin/HEAD」の 3 つのブランチ名が表示されます。まだ一つもブランチを作ってないのに、なんで 3 つも表示されてるの ? と思われた方もいるのではないでしょうか。
ブランチ名の origin と頭についているものは、GitHub 上にあるリモートリポジトリと紐ついています。 origin/main ブランチは、あなたがコピーした時点のリモートリポジトリの main ブランチを示しています。また、 origin/HEAD はリモートリポジトリをクローンした時にダウンロードされる最新のコミットを表しています。この 2 つを直接操作することはないので、ひとまず無視しても大丈夫です。
それでは作業用のブランチを作っていきましょう。
「New Branch」のボタンをクリックしてください。表示されたポップアップの「Name」の欄に add-notebook と記載し、「Create branch based on...」で main が選択されていることを確認したら、 「Create Branch」ボタンをクリックしましょう。そうするとブランチの一覧に add-notebook が追加され、 Current Branch も add-notebook に変更されたと思います。これで main ブランチから add-notebook ブランチに移動していることがわかります。
add-notebook ブランチで作成した変更履歴は main ブランチに影響を与えません。add-notebook ブランチで新しく作った機能が想定通り動くことを確認したら、 main ブランチに統合します。その手順を確認していきましょう。
新しいブランチにコミットしよう
add-notebook ブランチでファイルを変更してみましょう。
notebooks フォルダにある sample_notebook.ipynb をコピーしてください。ファイル名を右クリックするとメニューが表示されるので、「Duplicate」を選択するとファイルを複製できます。新しくできたファイルを右クリックして、「Rename」を選択し、ファイル名を変更しましょう。ファイル名は <お名前>-notebook.ipynb としてください。私は syobochim-notebook.ipynb としました。
ファイルができたら、それをコミットしましょう。左のサイドバーから再び Git のメニューを選び、 Untracked にあるファイルにカーソルを合わせます。プラス (+) マークが表示されるので、それをクリックして、ファイルが Staged に移ったことを確認しましょう。
画面下部のコミットメッセージに「練習用のNotebookを作成」と記載し、「COMMIT」ボタンをクリックします。表示された「Who is commiting?」には、ご自身のお名前とメールアドレスを入力してください。
これで add-notebook ブランチにコミットが出来ました。 main の状態を確認してみましょう。 作成した <お名前>-notebook.ipynb をエディタで開いている場合はそれを閉じて、ブランチ一覧の main をクリックします。Current Branch が main に変更されたらブランチの切り替えは成功です。
<お名前>-notebook.ipynb を作成した notebooks フォルダを見ると、 <お名前>-notebook.ipynb が無くなっています。これは <お名前>-notebook.ipynb を作成したコミットが add-notebook ブランチだけに保存されており、 main ブランチにはコミットされていないことが理由です。このように、ブランチを使うと他のブランチに影響を与えずに作業ができます。
ブランチを GitHub にプッシュしよう
ローカルリポジトリにある add-notebook ブランチの変更をリモートリポジトリにプッシュしましょう。
プッシュする前に、認証のために GitHub のアクセストークンの作成をしておきましょう。アクセストークンの作成方法については GitHub の公式ドキュメント「個人アクセストークンを使用する」をご参照ください。(repo の権限が設定されたアクセストークンが必要です。)
ブランチの一覧から add-notebook にブランチを切り替えます。ブランチ一覧から add-notebook ブランチを選択し、Current Branch に add-notebook が表示されていることを確認してください。
Git のメニューに表示されている "雲と上矢印" が書かれたボタンをクリックします。
ポップアップが表示されるので、 GitHub のユーザー名とアクセストークンを入力し、 OK をクリックします。(パスワードでの認証は利用できないのでご注意ください。)
これで、 GitHub へコミットがプッシュされました !
GitHub にブランチが作成されていることを確認しましょう。ご自身のアカウントに作成された data-scientist-git-practice リポジトリのページを開き、 main と書いてあるプルダウンをクリックしましょう。add-notebook が表示されていれば、ブランチのプッシュは成功しています。
add-notebook をクリックすると、ブランチを切り替えられます。 add-notebook ブランチに切り替え、 notebooks フォルダを開いてみましょう。<お名前>-notebook.ipynb が作成されています。
プルリクエストを作ろう
GitHub には、プルリクエストというレビューに利用できる機能があります。プルリクエストを使って、ブランチ間での変更内容の確認をしたり、チームメンバー間で改善について話し合ったりできます。変更内容に問題がなければ、ブランチの変更を main ブランチに統合します。
GitHub の左上にある Pull requests のタブをクリックします。「New pull request」のボタンをクリックしましょう。そうすると、Comparing changes と表示されたページが開き、その下にリポジトリとブランチが 2 つ表示されています。これは、矢印の左の場所に対して、右の場所の変更を反映するという設定です。
デフォルトでは、フォーク元の data-scientist-git-practice リポジトリの main ブランチに対して、 自分がフォークした data-scientist-git-practice リポジトリの main ブランチの内容を反映するという設定になっています。main ブランチは変更していないので「There isn’t anything to compare」というメッセージが表示されています。
左側の変更先として指定しているリポジトリを自分の data-scientist-git-practice に変更し、右側の変更元に指定しているブランチを main から add-notebook に変更してみましょう。そうすると、画面の下部の表示が切り替わり、コミットと変更差分が表示されました。
「Create pull request」ボタンをクリックしましょう。入力フォームが表示されたので、プルリクエストの概要と説明を入力します。私はタイトルをそのままに、説明欄に「自分用の練習ノートを作成」と入力しました。「Create pull request」をクリックします。そうすると、プルリクエストが作成されました。
プルリクエストを確認してマージしよう
レビュアーになった気持ちで、プルリクエストの内容を確認し、問題がなければ main ブランチに統合しましょう。ブランチの内容を統合することをマージといいます。
プルリクエストのページの「Commits」タブから、レビュー対象のコミット一覧を確認できます。今回は 1 つだけが表示されていますが、開発をしている時はもっとたくさんのコミットがあると思います。
「Files changed」タブから、レビュー対象のファイル差分を確認できます。ファイル差分は、追加された行は先頭が「+」に背景色が緑色、削除された行は先頭が「-」に背景色が赤色で表示されます。今回はファイルの追加をしただけなので、全ての行が先頭が + に背景色が緑色になっています。
「Conversation」タブではこのプルリクエストに対するコメントを記載できます。レビュー指摘や改善ポイントなどはここに書きましょう。
レビュー内容に問題がなければ「Merge pull request」ボタンをクリックします。「Confirm merge」ボタンをクリックすると、変更が main ブランチに反映されます。「Delete branch」をクリックすると、GitHub上の add-notebook ブランチが削除されます。不要になったブランチは削除しておきましょう。
「Code」タブに移動して notebooks フォルダの中を見てみましょう。 <お名前>-notebook.ipynb が作成されていて、 add-notebook ブランチの内容が main ブランチに統合されたことがわかります。
コミュニケーションを楽しもう
プルリクエストなどのコミュニケーションの場でよく見かけるのが、 LGTM という言葉です。これは「Looks Good To Me」の略語で「良いと思う」「問題ないと思う」といった意味で利用されます。プルリクエストの承認をする時のコメントとして使われることが多いです。
LGTM と書かれた面白い画像を貼ることもよくあります。「 LGTM ジェネレーター 」でネット検索すると色々な LGTM 画像を見つけられるサイトが見つかります。画像を使ってコミュニケーションをすると、ちょっとその場がほっこりするのでオススメです。
LGTM の他にもさまざまな言葉が使われているので、興味がある方は是非調べてみてください !
まとめ
本記事では、チーム開発をする上で必須となるブランチの作成と、ブランチ上での作業をプルリクエストで統合する方法を説明しました。ブランチごとに作業を分けることで、他の人の作業に影響を与えずに開発が進められます。ただ、ブランチ間の差分が多くなりすぎるとレビューをする人も、どこを見て良いのかわからず、レビューが大変になってしまいます。作業用のブランチは息が長くなりすぎないように注意してください。
今回は GitHub を使って解説しましたが、他のリポジトリホスティングサービスでもプルリクエストの機能を持つものがたくさんあります。(AWS の Code Commit もその一つです。) 興味がある方は他のサービスも調べてみてくださいね。
さあ ! 今日からデータサイエンティストの方も開発チームの一員になる準備ができました!開発者とコラボレーションして、楽しくチーム開発を進めていきましょう !
筆者プロフィール
宇賀神 みずき (しょぼちむ)
アマゾン ウェブ サービス ジャパン合同会社
パートナーソリューションアーキテクト
SIer でのアプリケーション開発者を経験後、2020 年にパートナーソリューションアーキテクトとして AWS Japan に入社。主に開発者の方に向けてセミナーやワークショップを提供しています。
初心者向けの『いちばんやさしいGit&GitHubの教本』という本も書きました。
インドア派で家から一歩も出ずに生きられるよう画策中。
AWS を無料でお試しいただけます