Gitを分かっているようで分かっていないエンジニアが、コマンドラインでGitを学ぶと、実はGitがちゃんと理解できる

#はじめに
これまでGitの作業にはSourceTreeを使っていましたが、いまいち良さが分からず、時々気づいたらコミットするような感じでした。実はこれは、Gitの仕組みについてよく理解できていなかったからでした。コマンドラインでGitを学んだ結果、コマンドラインからGitが使えるようになるだけでなく、Gitの仕組みを理解し、SourceTreeから操作する時も意味を理解しながら作業できるようになりました。コマンドラインでGitを学んでみましょう。

# 目次
1.GitHubレポジトリをクローンする
2.初期ファイルを作成する
3.初期ファイルをプッシュする
4.開発用ブランチを作成する
5.開発用ブランチにファイルをプッシュする
6.開発用ブランチをマスターブランチにマージする

# 1.GitHubレポジトリをクローンする
GitHubでレポジトリを作成します。レポジトリはリモートに存在するため、まずはローカルにクローン(複製)します。

```terminal
$ git clone https://github.com/~/HowToUseGit.git
```
HowToUseGitフォルダができたと思います。

# 2.初期ファイルを作成する
まずはじめに、初期ファイルとして”README.md”と".gitignore"を追加しておきます。”README.md”はレポジトリの説明、”.gitignore”は無視するファイル名を記載しておきます。

```terminal
$ cd HowToUseGit
$ touch README.md
$ echo "# HowToUseGit" >> README.md
$ cat README.md 
# HowToUseGit
$ touch .gitignore
$ echo *.jpg >> .gitignore
$ cat .gitignore 
*.jpg
```

このレポジトリでは、jpgファイルを無視することになります。

# 3.初期ファイルをプッシュする
ローカルの変更を、リモートへ反映することで、初めてGitHubレポジトリが更新されます。ファイルを追加、変更、削除した場合の基本手順としては、
①`git add <ファイル名>`
②`git commit -m "メッセージ"`
③`git push origin <ブランチ名>`
となります。

```terminal
$ git init #レポジトリを初期化する
Reinitialized existing Git repository in /Users/~/ws/qiita/HowToUseGit/.git/
$ git add README.md #変更、追加、削除したファイルをステージングする
$ git add .gitignore　
$ git commit -m "first commit" #ファイルをコミットする
$ git push -u origin master #ファイルをリモートのマスターブランチへプッシュする
Counting objects: 4, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (4/4), 286 bytes | 286.00 KiB/s, done.
Total 4 (delta 0), reused 0 (delta 0)
To https://github.com/~/HowToUseGit.git
 * [new branch]      master -> master
Branch 'master' set up to track remote branch 'master' from 'origin'.
```
GitHubを確認してみます。

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247957/26aa226b-ea81-48af-0d34-c86b0fca5469.png)

ローカルの変更がリモート(GitHub)に反映されましたね。REDAME.mdと.gitignoreが追加されました。

# 4.開発用ブランチを作成する
Gitを開発で使用する場合は、開発用ブランチとマスターブランチを分けておきます。様々な開発作業は開発用ブランチで行い、一区切り付いたらマスターブランチへマージ(統合)していくのが良いです。まずは開発用ブランチを作ってみます。

```terminal
$ git status #現在ブランチの状態を確認する
On branch master
Your branch is up to date with 'origin/master'.

nothing to commit, working tree clean
$ git branch sample #ブランチを作成する
$ git branch -a #全てのブランチを確認する
* master
  sample
  remotes/origin/master
$ git checkout sample #ブランチを切り替える
Switched to branch 'sample'
$ git status #現在ブランチの状態を確認する
On branch sample
nothing to commit, working tree clean
```

# 5.開発用ブランチにファイルをプッシュする

ここでも同じです。ファイルを追加、変更、削除したら、以下の手順に従ってファイルをプッシュします。
①`git add <ファイル名>`
②`git commit -m "メッセージ"`
③`git push origin <ブランチ名>`

```terminal
$ touch sample.py
$ touch sample.txt
$ touch sample.jpg
$ git status
On branch sample
Untracked files:
  (use "git add <file>..." to include in what will be committed)

	sample.py
	sample.txt

nothing added to commit but untracked files present (use "git add" to track)
```

sample.jpgは.gitignoreで宣言された通り、無視されていますね。


```terminal
$ git add sample.py
$ git add sample.txt
git commit -m "second commit"
[sample 2a488ba] second commit
 2 files changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 sample.py
 create mode 100644 sample.txt
$ git push origin sample #ファイルをリモートの開発用ブランチへプッシュする
Counting objects: 3, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 328 bytes | 328.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
remote: 
remote: Create a pull request for 'sample' on GitHub by visiting:
remote:      https://github.com/~/HowToUseGit/pull/new/sample
remote: 
To https://github.com/~/HowToUseGit.git
 * [new branch]      sample -> sample
```

GitHubを確認してみましょう。

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247957/3f099f24-76dd-f9eb-8dff-0d5ef0f03122.png)

マスターブランチの中は2ファイルのままですが、新たにsampleブランチができました。

![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247957/48afd8be-a8ef-87d3-dd6e-12c5f9ebcc0c.png)

リモートのsampleブランチを確認すると、ローカルの変更が反映されたことが分かりました。


# 6.開発用ブランチをマスターブランチにマージする

```terminal
$ git checkout master #マージ先のブランチ(今回はマスターブランチ)へ切り替える
$ git merge sample #開発用ブランチ(sample)をマスターブランチへマージする
Updating 3dad44c..2a488ba
Fast-forward
 sample.py  | 0
 sample.txt | 0
 2 files changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 sample.py
 create mode 100644 sample.txt
$ git status
On branch master
Your branch is ahead of 'origin/master' by 1 commit.
  (use "git push" to publish your local commits)

nothing to commit, working tree clean
$ git push
Total 0 (delta 0), reused 0 (delta 0)
To https://github.com/~/HowToUseGit.git
   3dad44c..2a488ba  master -> master
```

GitHubを確認してみましょう。

![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247957/4fffbe13-725e-b4a3-a921-e0a13d2d92c8.png)

ご覧の通り、開発用ブランチの変更がマスターブランチに統合されました。この手順を繰り替えしていくことにより、マスターブランチが常に正常に稼働する状態を保ちます。

#おわりに
まずはGitの基本コマンドを利用するだけでも良いので、しばらくコマンドラインからGitを使ってみてから、SourceTreeやGitKrakenを使ってみて下さい。実はGitについて分かっているようで分かっていなかったエンジニアにとっては、全然違う感覚になると思います。