【Git】Gitの使い方

# はじめに
この記事はgitを初めて触る人、複数人でgitを使ってプロジェクトを進めていく人の為に
参考にしてもらうことを目的として書きました。
間違っている箇所があればコメント欄へよろしくお願いします。

# Gitで使うサービスとツール
サービスやツールは有料・無料色々あります。
ツールにおいてはCLIでgitを操作する場合は不要です。
今回は以下の2つを使うことを前提として説明していきます。

**Git（バージョン管理システム）のサービス**　→GitLab
(その他のサービス 参考記事：[無料で使える! Gitのホスティングサービス5つ](https://tracpath.com/works/development/git-hosting-service/))

**Git（バージョン管理システム）のツール**　→Sourcetree
(その他のツール 参考記事：[Git GUIクライアント比較5選](https://hajipro.com/git/mac-git-client))

#リモートリポジトリとローカルリポジトリ

リポジトリ：保管場所のようなもの

リモートリポジトリとローカルリポジトリとはそれぞれ以下のような感じ

<img width="600" alt="スクリーンショット 2019-03-10 1.08.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/320026/edd400f2-2b9f-1614-5a76-0e9f9516b871.png">

#共同開発の流れ
##クローン

すでにプロジェクト用のソースがリモートリポジトリ存在し、それを
ローカルに持ってくる(複製する)ことをクローンと言います。

まずはGitLabからSourcetreeを使ってクローンしてみましょう。
まずはGitLabからクローンをするプロジェクトのページを開きます。
<img width="577" alt="スクリーンショット 2019-03-10 13.25.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/320026/79dc4c61-2149-9b4a-3def-8f8185e0657e.png">

開くとSSHかHTTPSのURLが選択できますが、HTTPSのURLでクローンすると
リモートリポジトリの認証のためにクローンや
これから説明するプルやプッシュといったことをする度に
ユーザ名とパスワードが毎回求められてしまって
何かと面倒なのでそれを回避したい場合はSSHのURLを使う方がいいと思います。
（SSHの場合は鍵を使って認証を行っているため、一度作ってしまえば毎回認証する必要は無くなります。Windows、Macそれぞれの
設定方法は[こちら](https://confluence.atlassian.com/bitbucket/set-up-an-ssh-key-728138079.html#SetupanSSHkey-ssh2)のサイトを参考にしてみてください）

<img width="856" alt="スクリーンショット 2019-03-10 13.18.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/320026/d7ca150d-b470-7e3f-b7a9-959e52f56bd1.png">

SSHのURLをコピーしてSourcetreeを開き、新規でリポジトリをクローンする画面で先ほど
コピーしたURLを貼り付けて任意のパスを指定してクローンします。
<img width="618" alt="スクリーンショット 2019-03-10 14.37.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/320026/f39aa92e-50a0-1333-12da-e9b31414d7d2.png">

これでクローン完了です！

##ブランチの作成

Sourcetreeを開くと先ほどクローンしたプロジェクトが追加されています。
リモートにあるフォルダと同じ環境をローカルに作ります。
そのことを**ブランチを作成する**と言います。

作成したいリモートのブランチをクリックして
ブランチマークを押し、新規ブランチ名をつけて「ブランチを作成」ボタンを押します。
<img width="147" alt="スクリーンショット 2019-03-10 15.05.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/320026/4cb0e065-ce7b-84d0-6303-9cb46838ae06.png">


<img width="849" alt="スクリーンショット 2019-03-10 15.00.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/320026/d13beda7-aecd-c399-a3d7-6cd20b950974.png">

これでローカルに同じプロジェクトが作成されました！
これを自分のブランチとしてリモートにアップロードしてあげなければいけません。
なのでブランチが作成できたらコミットボタンを押してプッシュしてください。

##Gitのフロー
作業をしていく準備はできましたが、プロジェクトメンバー間で
gitをうまく活用していく為にはブランチ管理方法を考える必要があります。
そこで最初に提案されたフローの1つ「git-flow」があります。
参考資料：[Git-flowって何？](https://qiita.com/KosukeSone/items/514dd24828b485c69a05)

決められた役割にそってブランチを分けて作業しましょうということですが、
最近はGit-flowの考えを元にプロジェクトに合ったブランチの分け方が考えられているので
今回はシンプルなフローで説明します。

(※以下説明に出てくるマージとは「統合」という意味です。)
###masterブランチ
Gitでリポジトリを新規作成するとデフォルトで作成されるブランチ
本番環境用として用意されることがほとんどだと思います。
ここで直接ソースは構わず、マージをするだけの場所とします。

###developブランチ
開発環境用として用意します。
開発中は develop ブランチからブランチを切ってfeatureブランチを作成し、
作業完了後にfeatureブランチをdevelopブランチにマージしたものを
masterブランチにマージするという作業を繰り返します。

###featureブランチ
個人が担当する機能や変更、修正ごとに作成するために用意します。
以下のように何のブランチなのか分かるよう名前をつけておきます。
feature-login
feature-login-bugfix
develop ブランチから派生させ、作業完了後に再び develop ブランチにマージします。
マージ完了後は削除しておきましょう。

##コミット・プル・プッシュ・フェッチ

gitのフローが決まればあとは見出しのコミット・プル・プッシュ・フェッチ
の方法を覚えれば一通り作業を進めていけます。

まずはローカルで作業し終わるとSourcetreeのワークスペースに
作業したファイル名が表示されます。それをインデックスに追加します。
<img width="302" alt="スクリーンショット 2019-03-10 15.50.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/320026/71188a19-c900-e3a2-52bf-be82bebe9bd8.png">

###コミット
インデックスに追加できたら今度はコミットコメントを書いてコミットします。
コミットコメントはそのファイルに関して
自分が何をしたかを書いておくとメンバーに優しいです。

コメントを書いたらコミットボタンを押して変更分のファイルを保存します。
<img width="317" alt="スクリーンショット 2019-03-10 15.56.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/320026/93f615d9-1fc3-94e9-f030-bf18e142b346.png">

###プル・プッシュ
プルとプッシュのやり取りは以下のようなイメージです。

<img width="600" alt="スクリーンショット 2019-03-10 16.08.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/320026/89cb5a6b-6b59-d72b-0c16-15c1c7a9be1b.png">


リモートで変更されたもの、誰かが更新したものがあればプルのところに
数字が表示されるのでプルボタンを押してダウンロードします。

<img width="317" alt="スクリーンショット 2019-03-10 16.06.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/320026/e67e0426-0111-237a-3295-d3681439ba34.png">

自分の変更したものをリモートにアップロードするときに、コミットボタンを押すと
プッシュのところに数字が表示されるのでプッシュを押してアップロードします。
<img width="317" alt="スクリーンショット 2019-03-10 16.06.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/320026/f592ff1b-f78f-e215-110a-fbb6417e825b.png">

###フェッチ
リモートリポジトリの最新の履歴を取得し、確認する場合にフェッチボタンを押します。
プルは内部でフェッチしてローカルにマージすることをしていますが
まだマージせずに確認だけしたい場合にフェッチを押します。もしくは最新の状態にきちんと
しておく時にフェッチを押して、プルするものがないかの確認もすることができます。
<img width="317" alt="スクリーンショット 2019-03-10 16.06.58.png" src="https://qiita-image-store.s3.amazonaws.com/0/320026/8d900954-10e7-5ae1-c451-04eb09f6803d.png">

#知っておくといいこと

### .gitignoreファイル
プッシュ対象にしたくないフォルダやファイルがある時に使えます。
書き方は参考サイトを参考にしてみてください。
[[Git] .gitignoreの仕様詳解](https://qiita.com/anqooqie/items/110957797b3d5280c44f)

###直前の git commit 実行を取り消す
現在のブランチの先頭（HEAD）を、指定のコミットに強制的にリセットするためのコマンドです。「--soft」オプションを付けると、作業ツリーとインデックスをそのままにして、ブランチの先頭のみを変更します。
修正を追加してコミットをやり直すことが可能です。

<img width="500" alt="スクリーンショット 2019-03-10 17.18.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/320026/255c4062-2bd4-29fe-30d8-7280c2b69bc4.png">

### gitLabではMR(マージリクエスト)gitHubではPR（プルリクエスト）という
マージする依頼を出す点は同じだそうですが、
GitHub と GitLab では使い方の違い上、使われる言葉が違うそうです。
参考サイト：[Pull Request / Merge Request の違い](https://qiita.com/pink/items/8ab3ecc270a9a7db46b4)

#最後に注意すべきこと
gitを触っているとよく起こりがちなエラーを紹介します。
参考サイトも載せましたので、参照して解決してください。

###空ディレクトリはgitに追加できない
 一時(tmp)ファイル や ログ(log) ファイル用のディレクトリを追加しようとする場合は
 ".gitkeep" という空ファイルを配置すれば解決できます。
.gitkeep という名前は何でも良いです。
何かしらのファイルを入れておく必要があるということになります。

###コンフリクト(競合)
メンバー間で同じファイルを修正し、pushしてしまった場合に起こります。
焦らず競合解決しちゃいましょう。
参考サイト：[コンフリクトって！？Gitバージョン管理でマージしたときに発生した衝突を解決する](https://tonari-it.com/git-sourcetree-conflict/)

###ブランチ切り替えようとするとPlease commit your changes or stash them before you switch branches.が表示される。

エラーメッセージの通り、スタッシュを使って変更ファイルを
一時的に退避させてあげましょう。
スタッシュは退避したまま残しておくといつどんな変更の時のものか
分からなくなってしまうので早めに解決して取り込み直し、
こまめに削除することをお勧めします。

参考サイト：[SourceTreeで作業を一時退避させる](http://cly7796.net/wp/other/try-the-stash-in-sourcetree/)

他にも色々ありますが、その都度エラーメッセージをよく読むことが大切です。

以上Gitでプロジェクトの進め方でした！