.. _GIT: 

GITによるグループ開発
============================================================================

.. note :: Git を用いると、ファイルの履歴を管理したり、複数人での共同作業がしやすくなります。いろんなやり方がありますが、ここでは最低限度の方法を示します。

（誰か1名が実行） PC内にリポジトリ（ローカル）を作成
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. warning :: 以下の例における、OurSketch や xxxUserxxx といった文字列は、サンプルですので、自分たちのケースに合わせてください。 

- (1) ``arduino-cli sketch new OurSketch`` （OurSketch/OurSketch.ino ファイルを作成）
- (2) ``cd OurSketch``
- (3) ``git init`` →  Initialized empty Git repository in . . . . /OurSketch/.git/ と表示される。履歴管理用の.git フォルダがつくられる。


- (4) ``git add .`` （カレントディレクトリのファイルを管理下に置く）
- (5) ``git commit -am "first commit"`` （ローカルリポジトリにコミット）
- ※このあと、下の6.〜8. を行ったあとで、9. のコマンドを実行する。 (9-1) ``git remote add origin ...``  (9-2) ``git push -u origin master``

（誰か1名が実行） サーバ上のリポジトリ（リモート）を作成
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- (6) https://git.istlab.info/ の右上で Sign in
- (7) 右上の + → New repository
- (8) 「Repository name」に、スケッチ名(例では OurSketch) を入力する。「Create an empty repository」を選ぶ。わからないうちは　public にしておいたほうが便利。
- (9) 「Create a new repository from the command line」の5行目(git remote) と6行目(git push) を、前述の5. （git commit）を実行し終えたターミナル・カレントディレクトリで実行する（ただし、main は master に置き換える。以下(9-1)(9-2)のサンプルを参考に。xxxUserxxx の部分や、スケッチ名の部分は置き換える。)

 - (9-1) ``git remote add origin https://git.istlab.info/git/xxxUserxxx/OurSketch.git`` (ローカルリポジトリの送信先を追加。正しく追加できたかは、``git remote -v`` で確認できる。間違えたら ``git remote remove origin`` としてから、(9-1) をやりなおす。)
 - (9-2) ``git push -u origin master`` で、サーバにローカルリポジトリの内容を送信する。ユーザ名とパスワードをきかれたら、6. でSign in につかったものを入力する。

- ここまでで、既存ファイルを新規リモートリポジトリに追加することができた。https://git.istlab.info/ の自分たちのリポジトリのページに行くか、(9) のWebページを再読み込みして、ファイルが反映されていればOK。


(6〜8を行ったユーザが実行) 共同編集者(Collaborators)を追加
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- (10) リモートリポジトリのページ → 左下のSettings → Collaborators タブ
- (11) グループメンバーのアカウント名を入力し、追加する。
- (12) 右下の 「Apply Changes」 をおす。
- 権限については、https://gist.github.com/hiroyuki-sato/845df22669bfdf1d621138f826c059d1 を参照してください。Collaborator Admin なら、所有者とほぼ同じ権限で、書き込みできます。

（開発に関わる人全員が実行） リモートリポジトリをclone し、自分のPCに置くローカルリポジトリ（自分の開発用フォルダ）を作成する。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- (10) リモートリポジトリのページ (例： https://git.istlab.info/git/xxxUserxxx/OurSketch ) に行き、「copy to clipboard」ボタンを押す。
- (11) 開発用フォルダを置くディレクトリに ``cd`` で移動したあと、``git clone (copyしたURL)`` を実行する。（例： ``git clone https://git.istlab.info/git/miura250/m5stickcplus.git``）
- ここまでで、ようやく共同作業用の開発フォルダが自分のPC内にできた。

（開発の注意：同じファイルを同時期に複数人で修正すると高い確率でコンフリクトが起きるので、各人が触るファイルは別途作成するほうがよい。）
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

- ファイルを追加するとき： たとえば ``OurSketch/miura.ino`` ファイルを新たに作成・保存したとする。これを共有するときは、``git add miura.ino`` としたあと、``git commit -m "作業コメント"`` でまずローカルリポジトリにコミットする。その後、コミットしたリポジトリの状態をリモートリポジトリ（サーバ）に送信するため、``git push`` を行う。
- ``git commit`` ``git push`` を行ったユーザは、ほかのユーザに、``git pull`` をするように促す。
- ``git push`` で送信したユーザ **以外** が、``git pull`` を実行すると、追加されたファイルを取得できる。
- ``git pull`` は、最新のコミットをリモートリポジトリからローカルリポジトリに同期するので、自分が編集をする前に行っておくほうがよい。頻繁に実行しても問題ない。

そのほかの方法・参考リンク
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

- （ちゃんとした方法）作業用ブランチを切って、Pull Request （プルリクエスト） を送信する方法もあります。 https://qiita.com/takeokunn/items/5bc499121a21f8c5b990 
- （邪道だが小規模少人数なら有効かもしれない方法） リモートリポジトリのWebページで、ブラウザから直接編集することもできます。ファイルを編集するには、ファイル表示画面で、右上の鉛筆アイコン（ゴミ箱の隣）を押します。ファイル新規作成は、フォルダ画面で　＋ アイコンを押します。その隣の雲形アイコンで、アップロードもできます。
- `【イラストで覚える】初心者のためのGitとGitHub用語集 <https://zukulog098r.com/git>`_

