Git初心者入門1

#このページの目的
GitやGitHubを初心者視点でリポジトリの作成からちょっとした操作を
忘れないように書いておきたいと思ったため。
※勘違いしていたり調査不足で間違っていたら指摘してやってください。

三部構成で

- Gitの基本的な使い方　ここ
- 開発サイクル
- CONFLICT

を復習していきたいと考えております。

#事前準備
- GitHubにアカウントを作成していること
- Gitをインストールしていること

#環境確認

##バージョンの確認
Gitをインストールできているか確認と現在のバージョンを確認するために以下のコマンドをshellで打ちます。

[コマンド]
`git --version`
[結果]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397568/8ac2a9e4-8e60-2a39-bfd9-801eb309118d.png)

##バージョンの更新
Gitを更新したい場合はインストールした方法によって異なる？と思いますので私がやった方法を紹介します。
Homebrewを使ってインストールしていました。
※https://news.mynavi.jp/article/20200418-1018783/ でGitの脆弱性が報告されていたので私のようにGitのバージョンが古い場合は更新しましょう。

###Homebrewを更新
[コマンド]
`brew update`

###Gitを更新
[コマンド]
`brew upgrade git`
`git --version`

[結果]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397568/a2b49e0e-fbad-7e3b-63be-44d881d9781d.png)
2.21.0→2.26.2に更新されました。

#作業

##ローカルでディレクトリの作成
[コマンド]
`mkdir git-test` 作業用のディレクトリを作成するコマンド
`cd git-test`　作業用のディレクトリに移動するコマンド
`pwd`　現在のディレクトリの場所を表示するコマンド

[結果]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397568/d0abcd4d-3289-e228-a2aa-6de8157ba9fe.png)

##Authorの設定
AuthorとはGitでコミットした時に表示されるユーザ名とメールアドレス
簡単に言えばその表示名を決める　みたいな感じです。
設定できていると自分のメールアドレスとユーザ名が表示されます。

[コマンド]
`git config --global --list`
[結果]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397568/7c2f37e9-3da9-0261-b05d-dee6c3786440.png)

設定されていなくて

```
fatal: unable to read config file ‘/Users/h-miura/.gitconfig’: No such file or directory
```
と出た場合は以下のようにコマンドを打っていきます。

`git config --global user.name {USEWR_NAME}`　Authorのユーザ名を登録
`git config --global user.email {MAIL}` Authorのメールアドレスを登録

`git config --global --list` 現在のAuthorを表示

## 作成したディレクトリをリポジトリとして作成する
作成したディレクトリ git-test/　の中で
[コマンド]
`git init` 　現在のディレクトリをリポジトリにするコマンド
`ls -la` リポジトリになると .git というファイルができているのでそれを確認するコマンド

[結果]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397568/720b45f0-b74a-b283-cceb-65831618cda5.png)

## トラッキング対象外の設定
GitHub上には載せたくないけどローカルで必要なディレクトリやファイルなどを記述すると変更があっても
コミットなどの時に無視される対象を設定できる。

[コマンド]
`touch .gitignore` .gitignoreというファイルを作成だけする
`ls -la` 作成されたか確認

[結果]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397568/6a0cb38f-0296-d33a-fa58-a0197dec765f.png)

この .gitignore ファイルに追加するとａｄｄやcommitの時に変更があっても無視されるようになる。

## 練習用のファイルを作成する
README.mdファイルを作り記述してファイルを作成します。

[コマンド]
`vi README.md` viエディタを使ってファイルを作成して編集に入るコマンド

```:README.md
# git-test
```
と入力して
`cat README.md`　README.mdファイルの中身を確認するコマンド

[結果]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397568/36719ba8-b454-9cba-6eac-242712525073.png)

## Gitのステータスを確認
ファイルに変更があった場合　トラッキング対象ならば変更されたよってことを教えてくれる。
[コマンド]
`git status` ステータスを確認するコマンド

[結果]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397568/0fbd4381-6eb6-569a-26d3-587efff9b52d.png)

トラッキング対象外を指定するファイル
今回編集したファイル
の2つを作成したのでこの2つが赤字で表示されている。

## インデックスに追加する
[コマンド]
`git add .gitignore` 　add　コマンドを使って指定のファイルをインデックスに追加する
`git add README.md`
`git status`

現在のディレクトリで変更あったもの全てをインデックスに追加するコマンド
`git add .`

[結果]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397568/e54e901f-d797-92bb-090b-730f35cca308.png)

## ローカルリポジトリに変更を記録
[コマンド]
`git commit -m "created .gitignore README.md"` -mというオプションをつけると　その後の文字列を変更内容として記述できる。 -mを付けないとエディタ画面に移動してそこで記述してセーブするようになる。
`git branch` 現在どこのブランチ(ローカルの作業場所みたいなもの)にいるかを確認する
`git status`

[結果]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397568/a52f3a25-a303-6015-8ca8-0d9efba487c7.png)

## ログの確認
いつ誰がコミットしたのか　などなどがわかる

[コマンド]
`git log` ログの確認
`git log --pretty=fuller` Author,Commiterの確認

[結果]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397568/beea7959-fea3-4caa-16ea-26ff2a77ddb8.png)

## コミット後のファイルを変更して差分などを確認する
README.mdを編集→差分確認→push　を説明します。

[コマンド]
`vi README.md`

```:README.md
# git-test
aaaa 
```
となるように　「aaaa」を追加
`cat README.md`

`git diff README.md` 変更したファイルの差分を確認する。 緑の文字で追加箇所が表示されている。
`git status` README.mdに「aaaa」を追加したので、README.mdの変更が行われている。

[結果]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397568/d62cc663-51b5-cc0c-6635-6cc81b64be35.png)

## addする前に変更を取り消したい場合(インデックスの登録を取り消す)
今回のREADME.mdへ「aaaa」の追加を取り消す場合

[コマンド]
`git checkout README.md`
`cat README.md`
`git status`

※Gitのバージョン2.23.0以降は`git restore README.md`でも良いらしい　どっちも使える

[結果]
checkoutの場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397568/8aa72b09-096a-aae1-927e-f64ec794d6a2.png)

restoreの場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397568/6a41e5e4-025c-db89-3654-584a858d6c9f.png)

編集して「aaaa」を入れたハズのREADME.mdがcommitした１つ前の状態に戻った。
変更が無かったことにされたので、ステータスも変化無しと表示される。

## addした後の変更を取り消す
[コマンド]
`vi README.md`

```:README.md
# git-test
aabbcc
```
「aabbcc」を追加

`cat README.md`
`git status` 変更内容を確認
`git add .`
`git status` addされたことを確認
`git reset HEAD README.md` or `git restore --staged README.md`(←2.23.0以降)
`git status` addの変更が取り消されている。

[結果]
git resetの場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397568/f546e175-c8d4-b578-3698-b91056e9a391.png)

git restoreの場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397568/0824daa2-e547-0320-cfaa-8699ef815b1f.png)

addが取り消されただけなので、README.mdの追記は削除されていない。

## commitの取り消し
先程add(indexに追加)を取り消したので、README.mdは編集されている。　これをローカルリポジトリに登録する。
そしてそのローカルリポジトリの登録を取り消す

[コマンド]
`git status`　現在のステータスを確認 addされていない
`cat README.md` 変更内容を再確認
`git add .`　ワーキングディレクトリからインデックスへ追加
`git status`　addされたことを確認
`git commit -m "modify README.md"` インデックスからローカルリポジトリにメッセージを付けてコミット
`git status` commitの確認
`git log` commitされたことを確認
`cat README.md` README.mdの確認
`git reset --hard HEAD^` コミットの取り消し
`cat README.md` ワーキングディレクトリの変更も全て消える。
`git log`一番上のcommitが取り消された。

[結果]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397568/cea605d0-5f76-2d61-0cf4-6e28f4d3a3cc.png)


## ローカルでの追加したり消したりの流れ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397568/b66243cc-1330-95d6-582d-59ad8f8986ba.png)


# 次回予告
次はGitHubを絡めて
issue -> branch -> add -> commit -> push、pull request -> merge
の開発サイクル
という流れを学んだのでそれを復習した記事にする予定です。