Githubを使いこなす

複数人で開発したり，複数のコンピュータ（ロボットに載っているのとか，手元にあるのとか）でロボットを制御する際には，簡単にコードを共有できるGithubがやっぱり便利．

一度始めると，いちいちダウンロードしてた時代にはもう戻れない便利道具の使い方です．

# Githubとは？
Gitとは，コードのバージョンを管理するシステムのこと．つまり，前のものとの変更点をずっと保存しつつ，内容を更新していくため，万が一「ミスった！元に戻したい！」と思ったときに元に戻せるシステム．

で，GithubはGitを使用したクラウドシステムのこと．
Gitでは，変更点はローカル（自分のPC）にのみ保存され，他の人と共有できていない状態だった．
そこでGitHubでは、クラウド上（リモート）にコードや変更点を保存．複数の開発者で1つのプロジェクトの作業を行い，お互いの編集をリアルタイムで確認するなど，他の人との連携・共有が簡単にできるようになった．

# 他人のGithubを使う
他人のGithubで公開されているコードを使いたいとき，自分のPC上に落とし込むには2つの方法がある．
* [普通にダウンロードする方法](#普通にダウンロード)：
    一番楽．変更が生じた場合には，再度ダウンロードする必要があるので，出来上がったコード（ex. 製品やアプリの関連パッケージをインストールするときとか）ならおススメ．
* [git cloneする方法](#gitcloneしてみる)：
    gitをインストールする必要はあるけど，変更点の反映なども簡単にできる．未完成（開発中）のコードは絶対こっち！
    
## 普通にダウンロード
1. 欲しいコードの載ったgithubのページを開く
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3250323/f802019d-859f-f2e2-a5a7-0bfbf73772a7.png)

2. 右のほうにある緑の"code"ボタンをクリック
3. 開いたウィンドウから"Download ZIP"を選択．あとはいつも通り解凍するだけ！
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3250323/c19cf1e6-f2f0-ad78-b948-dc11ac682166.png)

## git cloneしてみる
1. [gitのインストール](#gitのインストール)
2. ターミナル上で保存したいディレクトリ位置に移動
3. 欲しいコードの載ったgithubのページを開く
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3250323/f802019d-859f-f2e2-a5a7-0bfbf73772a7.png)
4. 右のほうにある緑の"code"ボタンをクリック
5. 開いたウィンドウから，一番上にある"HTTPS"のURLをコピー．
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3250323/c19cf1e6-f2f0-ad78-b948-dc11ac682166.png)
6. 以下のコマンドをターミナルに入力
    ```
    $ git clone コピーしたURL（http://リポジトリのurl/プロジェクト名.gitとか）
	または
    $ git clone -b ブランチ名 コピーしたURL（http://リポジトリのurl/プロジェクト名.gitとか）
    ```
# 自分のGithubを使う
## 自分のコードを上げる（初回）
1. [gitのインストール](#gitのインストール)
2. [github](https://github.co.jp/)のアカウント作成＆ログイン
3. githubに上げたいフォルダをgit管理下に置く
	```
	$ cd path/to/the/directry
	$ git init
	```
4. フォルダを上げるリモートリポジトリを作成する
    自分のgithubのrepositoryページで，"New"ボタンからcreat new repository．
	このとき，readmeファイルは作成しない（既存のファイルと違うのがいるとエラーが発生する）
     ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3250323/23b435dd-8ac8-f1f9-238b-1b910f78f711.png)
5. **（初めてアップロードするときのみ）** httpのURLでpushできるように，[アクセストークンを作成](#アクセストークンの作成)	
6. branch名がgitとgithubでデフォルトの名前が異なっているので，そこを修正するためにまず空コミットする
    ```
    $ git commit --allow-empty -m "empty commit"
	```
7. main branchの作成と移動
    githubのデフォルトのbranch名がmainなので，それを作成＆そちらへ移動する
    ```cpp
    // 現在のbranch名を確認
    $ git branch
        * master
    
    // main branchの作成と移動
    //// 新規作成
    $ git branch main
    //// 移動
    $ git checkout main

    //現在のbranchの確認（mainに＊がついていればOK）
    $ git branch
        * main
          master
    ```
	
8. 以下のコマンドでインデックスに追加
	※インデックスとは，リポジトリにコミットする準備をするために変更内容を一時的に保存する場所のこと
	```cpp
     //　「.」で変更・削除・新規作成したカレントディレクトリ以下のファイルをまとめて追加できる
	$ git add .
	```
	
9. インデックスに追加されたファイルをコミット
	※コミットとは，ファイルやディレクトリの追加や変更をリポジトリに記録する操作のこと
	```
	$ git commit -m "add new file（ここには好きなコメントを入れていい）"
    ```

10. コードを載せたいgithubのページを開く
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3250323/f802019d-859f-f2e2-a5a7-0bfbf73772a7.png)
11. そのページのURLをコピー
10. フォルダを上げるリモートリポジトリを設定
	```
	$ git remote add origin コピーしたURL（https://github.com/ユーザ名/リポジトリ名.gitとか）
	```

11. ローカルリポジトリからリモートリポジトリにpushして変更を反映させる
	```
	$ git push origin main
    ```
## 自分のコードを上げる（２回目以降）
2回目以降，コードを上げる（githubを更新する）には以下のコマンドをターミナル入力すればよい．
```cpp
    // 変更点の追加
	$ git add .
	
	// コミットする（"　"の中は何でもいい）
	$ git commit -m "日付_update"
	
	// Githubに変更点を反映
	$ git push origin main

```

## コードの変更点をPCに反映
複数台のコンピュータを使って作業しているときや複数人で作業しているとき，自分のPC（ローカル）は変わってないけど，github（リモート）のコードは変更されている場合がある．

**そんな時に変更点を自分のPCにも反映する方法**
```
$ git pull
```

## gitのインストール
### for Windows
1. [gitの公式HP](https://git-scm.com/downloads)から，自分のPCのOSを選んでインストール開始
2. ダウンロードしたexeファイルを実行
3. 基本的にはデフォルトのまま「次へ」または「OK」を押す．以下だけ変更
    * **Adjusting your PATH envirinment**: 
        コマンドラインから利用したいので「Use Git from the Windows Command Prompt」を選択
        ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3250323/94e38254-c6e5-44a7-352b-fa1ae261a4ce.png)
    * configuring the line ending conversions:
        チェックアウト／コミット時のファイルの改行コードを、Windows形式、Unix形式でどのような組み合わせにするかを選択．好きな組み合わせでOKだが，今回は「チェックアウト：Win形式／コミット：Unix形式」を選択した
        ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3250323/5765655a-0eff-76f6-2a4e-539eb3344f56.png)
4. インストールが完了したら，コマンドプロンプトを起動し，以下のコマンドを実行
    バージョン表示がされればOK！
    ```
    git --version
    ```
### for Linux
1. 以下のコマンドをターミナルに入力
    ```
    sudo apt-get install git
    ```
2. Gitがインストールされたか確認
    以下のコマンドでバージョンが表示されればOK
    ```
    dpkg -l git
    ```

# トラブルシューティング
* [エラー：Support for password authentication was removed](#エラー：Supportforpasswordauthenticationwasremoved)
* [エラー：fatal: remote origin already exists](#エラー：fatal:remoteoriginalreadyexists)
* [エラー：fatal: Not a valid object name: 'master'](#エラー：fatal:Notavalidobjectname:'master')
* [エラー：Git: Could not resolve host github.com error while cloning remote repository in git](#エラー：Git:Couldnotresolvehostgithub.comerrorwhilecloningremoterepositoryingit)


## エラー：Support for password authentication was removed
* エラー内容：
    ```
    remote: Support for password authentication was removed on August 13, 2021.
    remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
    ```
    
* 原因と対処法：
    2021年8月13日以降，GitHubのリポジトリにアクセスするには，ユーザ名とパスワードではなくアクセストークンが必要になった．gtihubアカウントのマイページで作成したアクセストークンをパスワードの代わりに入力することで，GitHubのリポジトリにアクセスできるようになる．

### アクセストークンの作成
1. GitHubにログイン
2. 右上の自分のアイコンをクリック
3. "Settings"ボタンをクリック
4. 左メニューの一番下にある"Developer settings"をクリック
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3250323/9f3b6248-f3c9-92d2-e146-8934897970a5.png)
5. さらに．左メニューの「Personal access tokens」をクリック（もしβ版があったら，それではなく"Tokens(classic)"を選択）
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3250323/c5848ebe-205d-2115-bbbf-9fe164cb7799.png)
6. 右上の「Generate new token」をクリックしてアクセストークンを作成する。
    ただし，「Select scopes」は少なくとも「repo」をチェックONにする．
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3250323/5f4c9342-b047-e043-7640-dd205646e67d.png)

:::note warn
作成したトークンの値を後でもう一度確認することはできないので、作成後はその場ですぐにコピーしてどこかにとっておくこと。
:::
    
こうして作成したアクセストークンをパスワードの代わりに入力することで、GitHubのリポジトリにアクセスできるようになる。

## エラー：fatal: remote origin already exists
originが存在しているらしいのでそれを削除する
```
$ git remote rm origin originの削除
$ git remote add origin git@bitbucket.org:ユーザー名/アプリ名.git
$ git push -u origin master
```

## エラー：fatal: Not a valid object name: 'master'
Gitで新しくブランチを切り分けようとした際に表示されるエラー

* 原因：
    新しいブランチを作成するには最低1回はマスターブランチにコミットする必要があるから．（最初のコミットが完了するまでは，マスターブランチが存在しない）

* 対処法：
    何かをコミットする or 空コミットをして，マスターブランチを作成すること

	* コミットする物がある場合（＝新規作成したファイルが一つでもあるとき）：
	少なくとも一つのファイルを通常通りコミットする．ただし，コミットさえすれば別のブランチを作成できるので，pushする必要はない
	* 空コミットの場合(＝新規作成したファイルがない状態のとき)：
        ```
        $ git commit --allow-empty -m "empty commit"
    	```

## エラー：Git: Could not resolve host github.com error while cloning remote repository in git
* 原因：proxy設定（インターネット接続時のセキュリティみたいなもの？）
* 対処法：httpとhttpsにアクセスできるようにすれば，git clone やgit pushが出来るようになる
    ```
    $ git config --global --unset http.proxy
    $ git config --global --unset https.proxy
    ```