Gitについて学んだこと

[修正] 2020.9.2
間違った理解をしていましたので、いくつか修正しています

## はじめに
Gitについてインストールからはじめ学んだことを自分用のメモとして残していきます。
また、新しく勉強したら そこも随時更新していきたいと思います。

(間違っているところがありましたらご指摘いただけると幸いです！)

##Gitとは？
Gitはバージョンを管理してくれるシステムのこと。

- ファイルの過去の変更履歴を見れる
- 変更してから変更前に戻したいなーって時は戻って復元できる
- 共同開発するときには大元から枝分かれさせて各々で作業ができ、後から作業内容を統合できる

（＝同じ場所を同時に編集していて、それに気づかずファイルを上書き！ってことを防げる）

などなど複数人で作業するときにより便利となってくる模様

##Gitをインストールする
まず[こちら](https://docs.github.com/ja/github/getting-started-with-github/set-up-git)のサイトを見ながら（Gitをセットアップするの部分）Gitをインストール
↓
私のmacに command line toolというものが まだ入っていないことが判明
>command line toolとは、キーボードを使い命令を入力して操作するツールのこと
マウスなども使える直感的で分かりやすいアプリケーション（wordやsafariなど）と区別して、前者はCUI（Character User Interface）、後者はGUI（Graphical User Interface）と分類される

↓
command line toolを インストール

参考記事：
[Xcodeをインストールせずに、Command Line Toolsをインストールする方法](https://qiita.com/iwaseasahi/items/eb820762600c815ab100#:~:text=Command%20Line%20Tools%E3%81%A8%E3%81%AF,%E3%81%99%E3%82%8B%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%81%AE%E3%81%93%E3%81%A8%E3%81%A7%E3%81%99%E3%80%82)

↓
Gitインストール完了！

####補足
自分の名前とメールアドレスをGitに登録しておく

```
git config --global user.name 名前
git config --global user.email メールアドレス
```
これでコミットするときにコミット内容と一緒に名前とアドレスがローカルリポジトリに書き込まれる
逆に登録していなければコミットできないので登録必須

##Git作業の流れ

1. `git init`：ローカルリポジトリを新規作成する
init = initialize（初期化）の略
リポジトリは倉庫みたいなもの
これをすることで裏で .gitディレクトリ（設定ファイルとか）というものが作成されている


2. `git add ファイル名`：ファイルを追加、ステージングにコミットする
現在いるディレクトリ以下全て追加したい場合は`git add .`
ドットが現在いるディレクトリを表している


3. `git status`：現在の変更状況を確認する
<font color="red">ステージングされていない</font>ファイル（git add前）は<font color="red">赤色</font>で表示される
<font color="green">ステージングされた</font>ファイル(git add後)は<font color="green">緑色</font>で表示される


4. `git commit -m "メッセージ"`：ステージングに追加したファイルをローカルリポジトリに記録する
コミットメッセージは変更内容がわかるように書く（ファイル変更、新規作成、削除など）

ここまでがローカルでの流れ！

##GitHubにプッシュするまでの流れ
1. GitHub上でリモートリポジトリを作成する
参考記事：
[【GitHub超初心者入門】この前初めてGitHubを使い始めたエンジニア見習いが書くGitHubの使い方と実践～とりあえず一緒に動かしてみようぜ！～](https://qiita.com/nnahito/items/565f8755e70c51532459)


2. `git remote add origin リモートリポジトリURL`：ローカルで作成したリポジトリとリモートのリポジトリを紐付ける


3. `git push origin master`：ローカルリポジトリをリモートリポジトリ（GitHub）に送信（プッシュ）する


GitHubにプッシュ完了！

##Gitコマンド
####現在のディレクトリ内を表示する
~~`ls`　listの略。
ディレクトリに何が入っているか確認できる~~
→こちらはGitコマンドではなくLinuxコマンドでした


####隠しディレクトリ（.gitディレクトリ）を表示する
~~`ls -a`~~
→Linuxコマンド

####今までの変更履歴を一覧で表示
`git log`　誰がいつ何を変更したのか確認できる
####git addする前の変更分を見る
`git diff ファイル名`　differenceの略。
####git addした後の変更分を見る
`git diff --cached ファイル名`　ファイル名を書かなかった場合は、修正したファイル全部の内容を見ることができる
####現在持っているブランチを確認する
`git branch`　デフォルトで「master」ブランチが用意されるので、最初は`*`masterと表示される
（`*` は現在いる場所を表す）

`git branch -a`　全てのブランチを表示する

ブランチについて　参考記事：
[図解！ Gitのブランチ・ツリーをちゃんと読む](https://qiita.com/jesus_isao/items/2a0495c973a4c911c2cc)

####ブランチを新しく作成
~~`git checkout -b 好きなブランチ名`~~
→ブランチ作成のみの場合、正しくは `git branch ブランチ名`

####ブランチを作成＋そのブランチに移動
`git checkout -b ブランチ名`　（上記と認識違いをしていたので修正）

####ブランチを切り替える
`git checkout 切り替えたい先のブランチ名`
####ブランチにマージする
`git merge マージ先のブランチ名`　マージとはブランチ 'A' にブランチ 'B' の変更を取り込むこと
'A' にいる状態で、'git merge B' とすると 'B' の変更分が 'A' に取り込まれる

####ブランチ切り替え以外で使えるcheckout
`git checkout コミットハッシュ　対象のファイル名`
対象ファイルをコミットハッシュ時の状態に戻せる

`git checkout ステージング追加前のファイル`
ステージング前(git add前)なら変更を元に戻せる

#####補足
ステージング後(git add後)の場合はcheckoutが使えないので
`git reset ステージング追加後のファイル`　を使う

####コミット履歴を消す
`git reset コミットハッシュ`　コミットハッシュとはそれぞれのコミットに割り振られたID番号のこと
(指定したコミットハッシュ以降の) コミット履歴は消えるが、自分のファイルでの変更内容は残ったまま

`git reset --hard コミットハッシュ`　変更内容も全て消える

※ git reset はチーム開発では基本的に使わない（メンバーのコミット履歴と不整合が起きるため）
####変更を行う前に戻す
`git revert コミットハッシュ`　（指定したコミットハッシュの）変更を行う(一つ)前の状態に戻せる
例えばファイルを新規作成をしていたのなら、ファイルを削除
コードを修正していたのなら、修正前に戻せる

`git revert  --abort`　revertを取り消す

####指定したコミットハッシュ時のファイル内容を見る
`git show コミットハッシュ:ファイル名`　

***
####リモートリポジトリの最新状態をローカルに反映させる
`git pull origin master`　共同作業では他の誰かがmasterブランチを更新していることもあるので、プルして情報を取得する

`git pull` は `git fetch （情報取得）` と `git merge (取り込み)` を合わせたもの


##ファイルをバージョン管理から外す
####コミットさせない（変更履歴に残さない）方法
セキュリティ的に漏れてはいけないファイル（パスワードが書かれているなど）がある時のために履歴に残さないようにできる

#####パターン１
1. `.gitignore`ファイルを作業ディレクトリに作成
2. `.gitignore`ファイルに除外したいファイル名を記述する

#####パターン２
[git ignore.io](https://www.toptal.com/developers/gitignore) でフレームワークを入力すると、適切な.gitignoreファイルが作成できるのでそれをコピペ

####すでにコミット済みのファイルを削除する
`git rm ファイル名`　removeの略。　ファイルごと削除
`git rm -r ディレクトリ名`　ディレクトリごと削除
`git rm --cached ファイル名`　ファイルは残す

***
参考にさせて頂いた記事

- Gitでやりたいこと、ここで見つかる
https://qiita.com/shimotaroo/items/b73d896ace10894fd290

- 【Git】新人エンジニア、git pushまでの道
https://qiita.com/yukibe/items/9ef9d54f2e7d53cfb51c