# ギトギトのGitHub勉強会 基礎編ノート ## Gitとはなにか * Git・・・**プロジェクト丸ごとセーブ機能** * 好きなタイミングでプロジェクトを丸ごとセーブできる * セーブデータ一つのことを**コミット**と呼ぶ ### Gitのメリット * セーブしておくことで後から元に戻せること. ## GitHubとはなにか * リポジトリをアップロードするサイト * リポジトリ・・・**ひとつのプロジェクトのコミットがまとまっているもの.** * つまり,GitHubはセーブデータ(ソースコード)アップロードサイトと言える. * アップロードしたソースコードは(過去のバージョンも含めて)見ることができる. ### GitHubのメリット * **チーム開発が捗る**・・・チームみんなでソースコードが共有できるため,捗る. * **みんなに自分のソースコードを見てもらえる**・・・自分のソースコードを企業の人に見てもらえば,就職の役に立つかもしれない. ## GitHubのアカウントを作ろう * Chromeでやるのがおすすめ ### GitHubのアカウントを作る * ここにアクセス→ https://github.com/ * Sign Upを押す * Username, Email, passwordを入れ,下のクイズに答える. * アンケートに答える・・・何の言語が好きですか?とか学生さんですか?とか色々聞かれる. * FreeかProか聞かれた場合,Free(無料)を選ぶ. * 登録したメールアドレスにメールが届くので,メールの「Verify email address」を押す. ### Gitの初期設定をする * 以下のコマンドを実行 ``` git config --global user.email (あなたのメールアドレス) ``` ``` git config --global user.name (あなたのユーザー名) ``` ユーザー名はさっき「Username」で入力したアレのこと. * 具体例(筆者の場合) ``` git config --global user.email sonarmikumiku@gmail.com ``` ``` git config --global user.name sonarAIT ``` パソコンを買う度に以上2つのコマンドを実行する. ### SSH鍵を登録する * SSH鍵を登録するという行為をしないといけない.(理由はここでは書かない) * 何も考えずに以下のコマンドを入力する(ssh-keygenの時はreturn(Enter)を連打する.3回ぐらい.) ``` cd ``` ``` mkdir .ssh ``` ``` ssh-keygen -t rsa ``` ``` cat id_rsa.pub | pbcopy ``` * Windowsの人は上手くいかないので,講師に相談すること. * これが終わったら,**GitHubの設定画面**を開く. * GitHubのメインページの**右上の方にある自分のアイコン**(初期だと変な図形のアイコン)を押すと,メニューが出てくる. * そのメニューの下の方にある「**Setting**」を押す. * 左のメニューにある「**SSH and GPG keys**」を選択. * 「**New SSH key**」を押す * **Title**を入力・・・「学校でもらったMacbookの鍵」という感じで,そのパソコンに関する情報を入れる.詳しければ詳しいほどよい. * **Key**を入力・・・⌘キーとVを同時押しして,謎の文字列が出てきたら成功. * **Add SSH key**を押したら完了. ### 設定ができているかどうか確認する方法 * ターミナルで以下のコマンドを入力する. ``` ssh -T git@github.com ``` * (y/n)と言われるので,yと入力. * `Hi (あなたのUsername)! You've successfully authenticated,`・・・といった感じのメッセージが表示されたら,SSH鍵の登録は完了. SSH鍵の登録もパソコンを買う度にやらないといけない. ## リポジトリを作ろう * リポジトリとは・・・**ひとつのプロジェクトのコミットがまとまっているもの.** * GitHub上のリポジトリ(**リモートリポジトリ**)とあなたのパソコン上のリポジトリ(**ローカルリポジトリ**)を作らないといけない. ### リポジトリの初期設定をする * まずはGitHubのメインページの左の方から「**New**」を選択. * 「**Repository name**」にリポジトリの名前を入力する(プロジェクトの名前) * 「**Private**」を選択すると,自分と自分が選んだ人しか見えなくなる. * 「**Public**」を選択すると,誰もが見えるようになる. * 「**Add a README file**」にチェックを入れる. * 最後に「**Create repository**」を押す. これでリモートリポジトリが完成した. これを自分のパソコンにコピーする. ### ローカルリポジトリの作成 * ターミナルを開いて,ローカルリポジトリを作る場所にcdで移動する. どこでもいいが,どうしてもわからなかったら以下のコマンドを実行すればいい. ``` mkdir ~/src ``` ``` cd ~/src ``` これは,srcというディレクトリ(フォルダ)を作って,そのsrcに移動するという意味.この中に更にローカルリポジトリのディレクトリが入る. * ターミナルで以下のコマンドを入力. ``` git clone git@github.com:(リポジトリオーナー名)/(リポジトリ名).git ``` * リポジトリオーナーとは,初期設定ではリポジトリを作った人のことである.(後から変更可能) 今回はあなたがリポジトリオーナー. * 具体例 ``` git clone git@github.com:sonarAIT/test_repository.git ``` これでリモートリポジトリからローカルへのコピーが行われる. ## コミットをしよう `cd`でローカルリポジトリの中に移動するのを忘れないように. `cd (リポジトリ名)`で移動. * コミットの流れは,Addして,Commitして,Push. ### Addする * `git add (ファイル名)` でCommitに含むファイルを選ぶ.・・・つまり,**セーブするファイルを選ぶ**. * 具体例 ``` git add file1.c ``` * `git add -A`を実行すると,全てのファイルをaddできる. 一部のファイルだけをaddする方が稀なので,基本的にはこちらを使う. ### Commitする * `git commit -m (コミットメッセージ)`でCommitする. * コミットメッセージには,具体的にそのコミットまでに何をしたかを書く. * 具体例 ``` git commit -m "〇〇のバグを修正" git commit -m "〇〇機能を実装" ``` * **これでセーブしたことになる** ### Pushする * `git push`で**リモートリポジトリにアップロードする.** mainかmasterか知りたければ ``` git remote show origin | grep 'HEAD branch' | cat ``` で確認できる. * これで,GitHubのリポジトリと自分のパソコンのリポジトリが一致する.・・・つまり,**セーブデータをアップロード**した. #### Add, Commit, Pushまとめ * addでセーブするファイルを選び * commitで実際にセーブをして * pushでセーブデータをアップロードする ### 注意点 * **commitする単位は大きくなりすぎないように.** ・例えば,コミットメッセージが「〇〇と△△をした」だったらダメ. ・〇〇のcommitと,△△のcommitとしてそれぞれコミットするべき. ~~・こだわりすぎても面倒なので,ちょっと気を使う程度でよい.~~ * **pushしたcommitは基本的に取り消せない.** ・取り消せるけど,基本的には無理. ・取り消したいミスが見つかった場合,それを修正するコミットを作成する. ## コミットは積み重ね * コミットにはそれぞれ(最初のコミットを除いて)親コミットというものがある. 親コミットは,基本的には,そのコミットの一つ前のコミットを指す. * **コミットは時系列順に全部揃っていなければならない.**(ただし同ブランチ上に限る.) ブランチについては次回やる. * pushする時に,他者のコミットが自分のローカルに無いためにpushできないことがある. ![](https://i.imgur.com/1PSJtDn.png) (この場合,Cが他者のコミット.) このままではpushできないので,`git pull`を行う. ![](https://i.imgur.com/5bsSHwc.png) すると,全部揃うため,pushできるようになる. ## コンフリクトについて * コンフリクト・・・コミット同士の衝突. * 上記の例をそのまま使う. コミットB, C, Dの中身が以下のようだったと仮定する. ``` コミットB・・・test.cを追加 #include <stdio.h> int main() { printf("Hello B!"); return 0; } ``` ``` コミットC・・・test.cを編集(printfの中身を変更) #include <stdio.h> int main() { printf("Hello C!");//ここを変更 return 0; } ``` ``` コミットD・・・test.cを編集(printfの中身を変更) #include <stdio.h> int main() { printf("Hello D!");//ここを変更 return 0; } ``` * コミットCは他者のコミット,コミットDを自分のコミットとする. この場合,編集箇所が重なっているため,**gitはどちらを採用すればよいかわからなくなる**.このことを**コンフリクト**と呼ぶ. * 対処法としては,どちらを採用するかを決め,もう一度コミットするしかない. * コンフリクトが発生したら,先輩に相談することを推奨する. ## まとめ * ぶっちゃけaddしてcommitしてpushだけ理解できていればなんでもよい.