Gitはじめました！

#はじめに
今まで業務ではSubversionを使ってきましたが、今後はGitも使うことになると思われるのでとりあえず勉強を始めてみます。

会社のプロジェクトでは未だにSVNを使用しています。
社内ライブラリの一部はGitに移行していますがあまり触れていないのでGitに関しては経験が無い状態です。
SVNも社内ではプロジェクトの規模の拡大（人数やデータサイズの大きい大量のバイナリデータ）やインフラの影響（サーバーが非力）でそろそろ限界が来ているような気がします。
GitはGitでブランチ、マージが強力！、バイナリデータの管理には向かない？といった話も聞きますが、結局のところはケースバイケースということでしょうか。
バージョン管理の比較・選定などはまた別の機会にするとして、とにかくGitを始めてみます。

- とにかくGitを触ってみる
- GUIクライアントのTortoiseGitを触ってみる
- GitHubを触ってみる

を目標に進めていきます。

まだ書き途中ですがGitをはじめる人の助けになればと思います。

以降は個人メモとして書いているので乱筆、乱文で申し訳ありません。
また、不備やご指摘などありましたらよろしくお願いします。


#Git
で、Git。
「分散バージョン管理」というのがいまいちピンと来ていませんでしたが、SVNと大きな違いですかね？
多分こういことだと思われます。

SVNはサーバーのリポジトリに対してしかコミットができない。
というかサーバーのリポジトリをみんなでいじくるという前提。（※「集中型バージョン管理」と呼ばれている）
Gitはサーバーは共有リポジトリ、ローカルが作業リポジトリという概念で、ローカルにクローンを作成してそこに対してコミットやらブランチやら自由に行って作業し、最終的に共有リポジトリにコミットしていくという前提。

というのが「分散バージョン管理」という意味なのでしょうか！？
Gitの用語でちゃんと整理すると...

共有リポジトリ：ファイルサーバーなどに置かれたリポジトリでみんなで参照するリポジトリ。
作業ディレクトリ：ローカルの作業用リポジトリ。
コミット：作業ディレクトリに対してコミットすること。
クローン：ローカルに作業ディレクトを作成。
プッシュ：作業ディレクトリの変更内容を共有リポジトリに反映させる。
プル：共有リポジトリから最新版を取得。
リベース：理解して使わないととんでもないことになる可能性がある！？※注意が必要！

リポジトリの種類
リポジトリは2種類ある。
bareリポジトリ：ワーキングディレクトリを持たない。更新情報だけを持っている。
non-bareリポジトリ：ワーキングディレクトリを持つ。

SVNだと作業途中の状態やちょっとした変更などをコミットしづらかったりしますが、gitであれば作業ディレクトリでガシガシコミットしていって最終的なものだけを共有リポジトリにプッシュすれば良いと言うことになると思われます。
その時って作業ディレクトリの履歴とかも反映されるものなのかな？
作業ディレクトでプッシュしてないものとかって分かるのかな？


###リポジトリの作成

```
git init

or

git init --bare --shared
```

###作業ディレクトリの作成
ローカルの作業用リポジトリを作成する。

```
git clone https://username@????/????/repository
```

###コミット
作業ディレクトリに対して追加・変更をコミットする。
この段階では共有リポジトリには反映されない。
共有リポジトリには影響ないのでガシガシ行ってもよい。

```
// コミット準備
// インデックスへの反映
git add <filename>
  or
git add *

// 実際にコミット
// 作業ディレクトリのみに反映
git commit -m 
```

###プッシュ
作業ディレクトリの更新内容を共有リポジトリに反映させる。

```
// 共有リポジトリに反映
git push origin master
```

###プル
共有リポジトリから最新版を取得。

```
git pull
```

###ブランチ

###マージ
- FastForword
- Non-FastForword

###リベース(rebase)
マージの一種として扱うとよろしくないので別の項目として別の項目として書いておく。


#Gitをはじめてみる
とにかく触ってみる。

まずは慣れるためにコマンドラインから始めてみます。
TortoiseGitはその後に触ります。
TortoiseGitのインストールのページではmsysGitをインストールしてと書いてあるがこれは別物？
→同じものでmsysGitは古い名称で現在はGit for windowsとのことなのでGit for windowsをインストールしておけばよい

##インストール
下記のリンクを参考にインストールしてみます。
ページによって若干違いがありますがとても参考になりますので読んでください。

- [私家版 Git For Windowsのインストール手順](https://opcdiary.net/?page_id=27065)
- [[Sy] 「Git for Windows」でWindowsにGitをインストールする手順](https://utano.jp/entry/2016/07/git-for-windows-install/)
- [WindowsにGitをインストールする](http://www.granfairs.com/blog/cto/install-git-for-windows)


###1.ダウンロードしてくる
[Git for windows](https://git-for-windows.github.io/)

現状の最新版は2.12.0。(2017/3/17)
Git-2.12.0-64-bit.exeをダウンロード。

###2.インストーラを起動する
![git_000.png](https://qiita-image-store.s3.amazonaws.com/0/114164/4c21c142-1b8f-4494-0a27-8d8f53c8e751.png)


###3.インストール先のフォルダを選択する

特に変更がなければそのまま進みます。

![git_001.png](https://qiita-image-store.s3.amazonaws.com/0/114164/a99ea8d6-8ede-33b9-cf39-b21dfe3b8202.png)


###4.インストールするコンポーネントを選択する

ここもとりあえず変更なしで進めます。

![git_002.png](https://qiita-image-store.s3.amazonaws.com/0/114164/8d736d9f-4da8-03ee-96c8-f1e2dc4354d9.png)


###5.スタートメニューへ追加するかどうか選択する

スタートメニューに追加したくない場合は下の Don't create a Start Menu folder にチェックを入れます。

![git_003.png](https://qiita-image-store.s3.amazonaws.com/0/114164/b99e58c3-7c0a-5fea-682b-e6d2627c464a.png)


###6.Gitをコマンドプロンプトから使うかどうか選択する

今回は一番上の Git Bash only を選択しました。
TortoiseGitを使用する場合も考慮する必要があればその時に再度見直します。

![git_004.png](https://qiita-image-store.s3.amazonaws.com/0/114164/d7d2ce3f-1682-2c17-a99e-22ffa2fb9071.png)



###7.改行の扱いをどうするか選択する

参考ページでも意見が分かれているところです。
今回は一番下の Checkout as-is,commin as-is で進めます。

![git_005.png](https://qiita-image-store.s3.amazonaws.com/0/114164/3f3ef00c-33ed-c0b3-3115-aa7fe094055a.png)

これは開発環境やプロジェクトによって都度検討してくことになると思われます。
インストール後に変更できるのか？
プロジェクトによってポリシーが異なった場合はどうやって運用していくのか？

###8.ターミナルに何を使うか選択する

そのまま進めます。

![git_006.png](https://qiita-image-store.s3.amazonaws.com/0/114164/63df5f3f-9e45-7c72-9b42-75f26d6ffbf5.png)


###9.キャッシュと2段階認証の設定有効／無効を選択する

そのまま進めます。

![git_007.png](https://qiita-image-store.s3.amazonaws.com/0/114164/0012fb54-3dac-2a5f-498e-f1fb9d75bde7.png)


###10.インストール中...
![git_008.png](https://qiita-image-store.s3.amazonaws.com/0/114164/84bdaa09-c9ea-c2eb-25a0-cffadd966bd8.png)


###11.インストール完了
![git_009.png](https://qiita-image-store.s3.amazonaws.com/0/114164/5582b01f-2100-adb2-7763-03c4c47635fe.png)


###12.Git Bash起動

スタートメニューからGitBashを実行して起動を確認します。


##ローカルPCのみで触ってみる
bashのコマンドでC:\直下でrm -rf *みたいなことをしない限りはPCがぶっ壊れたりはしないと思われるのでガシガシ触ってみたいと思います。

###1.リポジトリを作成してみる
```
$ git init
```

.gitが作成されました。

###2.addしてみる

```test.txt
TEST!!
```

```
$ git add test.txt
```
これはまだインデックスに登録しただけの状態です。
実際にはまだコミットはされていません。

###3.コミット前の状態を確認してみる
```
$ git status
```

```
On branch master

Initial commit

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)

        new file:   test.txt
```

###4.addを取り消してみる
```
$ git rm --cached test.txt
On branch master

Initial commit

Untracked files:
  (use "git add <file>..." to include in what will be committed)

        test.txt

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

これで先ほどインデックスへの登録が取り消されました。

###5.コミットしてみる

先ほどのaddを再度行ってからコミットを行います。

```
$ git commit -m 'コミットのテスト ファイルの追加'
```

```
[master (root-commit) bba183d] コミットテスト ファイルの追加
 Committer: xxx xxx <xxx@xxx.co.jp>
Your name and email address were configured automatically based
on your username and hostname. Please check that they are accurate.
You can suppress this message by setting them explicitly. Run the
following command and follow the instructions in your editor to edit
your configuration file:

    git config --global --edit

After doing this, you may fix the identity used for this commit with:

    git commit --amend --reset-author

 1 file changed, 1 insertion(+)
 create mode 100644 test.txt
```

なんか、「名前とe-mailアドレスを自動で取ってきたよ」といったようなメッセージが出ているようです。
このあたりもちゃんと設定してあげないとダメみたいです...

###6.logを確認してみる
```
$ git log
commit bba183d1ea41789b5737085e2e8c5b7f2fc54859
Author: xxx xxx <xxx@xxx.co.jp>
Date:   Tue Mar 28 14:53:49 2017 +0900

    コミットテスト ファイルの追加
```

先ほどのコミットが確認できます。

###7.user,e-mail addressを変更してみる
先ほどのコミットでメッセージが出ていたので、とりあえず仮のuser,addressを設定してみます。

```
$ git config --global user.name "takezoh"
$ git config --global user.email "takezoh@hogehoge.co.jp"
```

内容を確認してみます。

```
$ git config --global --list
user.name=takezoh
user.email=takezoh@hogehoge.co.jp
```

###8.変更を反映してみる
さっきのメッセージにあったコマンドを入れてみます。

```
$ git commit --amend --reset-author
```

なんかviエディタが起動しました。
懐かしいですが何もしないでとりえずZZ(Shift+zz)でエディタ終了します。
viコマンドについては以下のページを参考にしてみてください。

- [viコマンド（vimコマンド）一覧（検索・置換）](http://uguisu.skr.jp/Windows/vi.html)

```
[master 840b9bd] コミットテスト ファイルの追加
 1 file changed, 1 insertion(+)
 create mode 100644 test.txt
```

もう一度logを見るとAuthorの変更が反映されています。

```
$ git log
commit 840b9bd0b5857262d28a07cc4add0056888b9ff1
Author: takezoh <takezoh@hogehoge.co.jp>
Date:   Tue Mar 28 15:56:59 2017 +0900

    コミットテスト ファイルの追加
```

###10.ファイルを変更してみる
test.txtを変更してテキストを追加します。

```test.txt
TEST!!
テスト //←追加
```

###11.コミットされているファイルとの差分を確認してみる

```
$ git diff
diff --git a/test.txt b/test.txt
index 3a3b7cb..4317b96 100644
--- a/test.txt
+++ b/test.txt
@@ -1 +1,2 @@
 TEST!!
+<83>e<83>X<83>g<81>I<81>I^M
```

日本語が正しく表示されない模様です...
bashの日本語対応が必要？
SJISはダメみたい...
というか別の対応が必要になりそう...

UTF-8であればとりえず表示はされました。

```
$ git diff
diff --git a/test.txt b/test.txt
index 3a3b7cb..f60fb19 100644
--- a/test.txt
+++ b/test.txt
@@ -1 +1,2 @@
 TEST!!
+テスト！！^M
```

###12.変更をコミットしてみる

```
$ git add test.txt

$ git status
On branch master
Your branch is based on 'origin/master', but the upstream is gone.
  (use "git branch --unset-upstream" to fixup)
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        modified:   test.txt

$ git commit -m 'テキストを変更'
[master 225112b] テキストを変更
 1 file changed, 1 insertion(+)

$ git log
commit 225112be3ab8a1dda4d9e2cf567ebfc5dbcc2d3e
Author: takezoh <takezoh@hogehoge.co.jp>
Date:   Wed Mar 29 12:59:42 2017 +0900

    テキストを変更

commit 840b9bd0b5857262d28a07cc4add0056888b9ff1
Author: takezoh <takezoh@hogehoge.co.jp>
Date:   Tue Mar 28 15:56:59 2017 +0900

    コミットテスト ファイルの追加
```

###13.日本語のファイルをaddしてみる

```
$ git add テスト.txt
```

```
$ git status
On branch master
Your branch is based on 'origin/master', but the upstream is gone.
  (use "git branch --unset-upstream" to fixup)
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        new file:   "\343\203\206\343\202\271\343\203\210.txt"
```

```
$ git diff --cached
diff --git "a/\343\203\206\343\202\271\343\203\210.txt" "b/\343\203\206\343\202\271\343\203\210.txt"
new file mode 100644
index 0000000..95eace3
--- /dev/null
+++ "b/\343\203\206\343\202\271\343\203\210.txt"
@@ -0,0 +1 @@
+<83>e<83>X<83>g<81>I<81>I^M

```

文字化けしているみたいです...
このあたりの設定などはまた後で調べたいと思います。

###14.日本語のファイルをコミットしてみる

```
$ git commit -m '日本語ファイル名のファイルをコミット'
[master 2090d55] 日本語ファイル名のファイルをコミット
 1 file changed, 1 insertion(+)
 create mode 100644 "\343\203\206\343\202\271\343\203\210.txt"
```

```
$ git show
commit 2090d55fb9c14fa3bbeef779fcc24c366955b5f6
Author: takezoh <takezoh@hogehoge.co.jp>
Date:   Wed Mar 29 20:05:31 2017 +0900

    日本語ファイル名のファイルをコミット

diff --git "a/\343\203\206\343\202\271\343\203\210.txt" "b/\343\203\206\343\202\271\343\203\210.txt"
new file mode 100644
index 0000000..95eace3
--- /dev/null
+++ "b/\343\203\206\343\202\271\343\203\210.txt"
@@ -0,0 +1 @@
+<83>e<83>X<83>g<81>I<81>I^M
```

###15.pushしてみる？どこに？
最初に作成した作業リポジトリに対してaddやcommitを行ってきました。
これはあくまでも作業用のリポジトリにコミットしただけになります。

ん？でもこれだとpushしたり、pullしたりできないですよね？

```
$ git push
fatal: No configured push destination.
Either specify the URL from the command-line or configure a remote repository using

    git remote add <name> <url>

and then push using the remote name

    git push <name>
```

push？どこに対して？

```
$ git remote
```

もちろんなにも表示されません。

そもそもプロジェクトで運用したり、GitHub等ではサーバーとかに共有リポジトリがあり、そこに対してpushしたり、pullしたりすることになります。
ですのでローカルPCで同様の環境を用意して操作を試してみたいと思います。

###16.共有リポジトリを作成してみる
ローカルPCのみの環境で共有リポジトリを作成して、そのリポジトリに対していろいろやってみたいと思います。

とりあえずgit_test.git/というフォルダを作成します。（共有リポジトリは慣例的にフォルダ名に.gitを付けるみたい？）
そのフォルダ以下で共有リポジトリを作成します。

```
$ git init --bare --shared
```

bashの画面のフォルダ名の横に(BARE:master)というのが表示されるようになって以下のファイルが生成されました。
先ほどは.gitのみでしたが、今回はSVNのリポジトリ作成と同じようなファイルが作成されているようです。

```
config
description
HEAD
hooks/
info/
objects/
refs/
```

###17.クローンしてみる
workというフォルダを作成し、そのフォルダに共有リポジトリをクローンしてみます。
そのフォルダで以下のコマンドを実行します。

```
$ git clone /c/test/git_test.git
```

work以下にgit_test/というフォルダが作成され、その下に.git/が作成されました。
どうやらパスを指定しないとリポジトリ名から.gitが除かれたパスが作業ディレクトリとして割り当てられるらしいです...

クローンするパスを指定する場合はリポジトリの後にパスを指定します。

```
$ git clone /c/test/git_test.git ./git_test2
```

work以下にgit_test2/というフォルダが作成されました。

因みにwork以下を作業リポジトリにしたい場合は以下の通りです。

```
$ git clone /c/test/git_test.git ./
```

.gitが作成されました。
それ以外はもちろん空っぽの状態です。

###18.クローンした作業リポジトリにadd,commitしてみる
いままでと同じ手順でファイルを追加、コミットします。

###19.共有リポジトリにpushしてみる

```
$ git remote
origin
```

クローンするとoriginという宛先が作られるようです...

```
$ git push origin
Counting objects: 9, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (4/4), done.
Writing objects: 100% (9/9), 819 bytes | 0 bytes/s, done.
Total 9 (delta 0), reused 0 (delta 0)
To C:/product/git/git_test.git/
 * [new branch]      master -> master
```

無事にpushされたようです。

```
$ git pull origin
Already up-to-date.
```

pullしてもupdate済となっているようです。

```
$ git log origin/master
```

共有リポジトリ側のログも確認してみます。
他の人のコミットがないので内容は同じとなっています。


###20.Ｂさん（別の作業ディレクトリ）がクローンしてみる
Ｂさんを想定して別のフォルダで作業用にクローンしてみます。

```
$ git clone /c/product/git/git_test.git/ ./
Cloning into '.'...
done.
```

```
.git/
test.txt
テスト.txt
```

###21.Ｂさんがファイルを変更してみる

```test.txt
TEST!!
テスト！！
hogehoge!!  // ←追加
```

変更後にＢさんの状態を確認する。
test.txtが変更されていることを確認します。

```
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   test.txt

no changes added to commit (use "git add" and/or "git commit -a")
```

一方、Ａさんの方は変更がないので何も出ません。

```
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working tree clean
```

###22.Ｂさんがadd,commit,pushしてみる

```
$ git add test.txt

$ git commit -m 'Bさんの変更をコミット hogehoge追加しました'
[master 4806924] Bさんの変更をコミット hogehoge追加しました
 1 file changed, 1 insertion(+)

$ git log -2
commit 4806924508c44f967053b3378aff3f930ca16ee8
Author: hogehoge <takezoh@hogehoge.co.jp>
Date:   Thu Mar 30 12:16:19 2017 +0900

    Bさんの変更をコミット hogehoge追加しました

commit 2090d55fb9c14fa3bbeef779fcc24c366955b5f6
Author: takezoh <takezoh@hogehoge.co.jp>
Date:   Wed Mar 29 20:05:31 2017 +0900

    日本語ファイル名のファイルをコミット
```

Ｂさんの作業リポジトリにcommitします。

```
$ git push origin
Counting objects: 3, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 367 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To C:/product/git/git_test.git/
   2090d55..4806924  master -> master
```

共有リポジトリにもpushします。

一方、Ａさんは...

```
$ git log -2
commit 2090d55fb9c14fa3bbeef779fcc24c366955b5f6
Author: takezoh <takezoh@hogehoge.co.jp>
Date:   Wed Mar 29 20:05:31 2017 +0900

    日本語ファイル名のファイルをコミット

commit 225112be3ab8a1dda4d9e2cf567ebfc5dbcc2d3e
Author: takezoh <takezoh@hogehoge.co.jp>
Date:   Wed Mar 29 12:59:42 2017 +0900

    テキストを変更
```

もちろんまだ前のままです。

```
$ git log origin/master -2
commit 2090d55fb9c14fa3bbeef779fcc24c366955b5f6
Author: takezoh <takezoh@hogehoge.co.jp>
Date:   Wed Mar 29 20:05:31 2017 +0900

    日本語ファイル名のファイルをコミット

commit 225112be3ab8a1dda4d9e2cf567ebfc5dbcc2d3e
Author: takezoh <takezoh@hogehoge.co.jp>
Date:   Wed Mar 29 12:59:42 2017 +0900

    テキストを変更
```

この状態で共有リポジトリのlogをみても同じ状態なのはそういうもの？

###23.Ａさん（元の作業リポジトリ）でpullしてみる

```
$ git pull
remote: Counting objects: 3, done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
From C:/product/git/git_test
   2090d55..4806924  master     -> origin/master
Updating 2090d55..4806924
Fast-forward
 test.txt | 1 +
 1 file changed, 1 insertion(+)
```

無事に更新されました。

```
$ git log -2
commit 4806924508c44f967053b3378aff3f930ca16ee8
Author: hogehoge <takezoh@hogehoge.co.jp>
Date:   Thu Mar 30 12:16:19 2017 +0900

    Bさんの変更をコミット hogehoge追加しました

commit 2090d55fb9c14fa3bbeef779fcc24c366955b5f6
Author: takezoh <takezoh@hogehoge.co.jp>
Date:   Wed Mar 29 20:05:31 2017 +0900

    日本語ファイル名のファイルをコミット
```

この辺でもう一度以下の参考ページを見直してみてください。
一度操作して体験してから再度見直すと理解が深まると思います。

- [Git の基礎勉強 〜Git によるバージョン管理を使う〜](http://tracpath.com/bootcamp/learning_git_firststep.html)

- [こわくない Git](http://www.slideshare.net/kotas/git-15276118)


###24.コンフリクトを起こしてみる
Ａさん、Ｂさんのそれぞれのtest.txtを以下の様に変更してみます。

```test.txt(Aさん)
TEST!!
テスト！！
hogehoge!!
Ａさんの追加。
コンフリクト起きるかな？
```

```test.txt(Bさん）
TEST!!
テスト！！
hogehoge!!
Ｂさんの追加。
コンフリクトが起きたらどうしよう...
```

それぞれの変更をまずは作業リポジトリにコミットします。

```Aさん
$ git commit -m 'Ａさんの変更をコミット'
[master 1726af7] Ａさんの変更をコミット
 1 file changed, 2 insertions(+)

$ git log -2
commit 1726af73ee128a949e76c27a38bfdb05396ff04e
Author: takezoh <takezoh@hogehoge.co.jp>
Date:   Tue Apr 4 12:22:55 2017 +0900

    Ａさんの変更をコミット

commit 4806924508c44f967053b3378aff3f930ca16ee8
Author: hogehoge <takezoh@hogehoge.co.jp>
Date:   Thu Mar 30 12:16:19 2017 +0900

    Bさんの変更をコミット hogehoge追加しました
```

```Bさん
$ git commit test.txt -m 'Ｂさんの変更をコミット'
[master 42e9c92] Ｂさんの変更をコミット
 1 file changed, 2 insertions(+)

$ git log -2
commit 42e9c926f974ce74268c96c9b74a185a7199a2f2
Author: hogehoge <takezoh@hogehoge.co.jp>
Date:   Tue Apr 4 12:26:00 2017 +0900

    Ｂさんの変更をコミット

commit 4806924508c44f967053b3378aff3f930ca16ee8
Author: hogehoge <takezoh@hogehoge.co.jp>
Date:   Thu Mar 30 12:16:19 2017 +0900

    Bさんの変更をコミット hogehoge追加しました
```

Ｂさんが先に共有リポジトリにpushします。

```Bさん
$ git push origin
Counting objects: 3, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 426 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To C:/product/git/git_test.git/
   4806924..42e9c92  master -> master
```

無事にpushできました。

Ａさんの作業リポジトリでpullします。

```Aさん
$ git pull
remote: Counting objects: 3, done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
From C:/product/git/git_test
   4806924..42e9c92  master     -> origin/master
Auto-merging test.txt
CONFLICT (content): Merge conflict in test.txt
Automatic merge failed; fix conflicts and then commit the result.
```

コンフリクトが起きたみたいです...
マージされたtest.txtを見てみると...

```test.txt(Aさん)
TEST!!
テスト！！
hogehoge!!
<<<<<<< HEAD
Ａさんの追加。
コンフリクト起きるかな？
=======
Ｂさんの追加。
コンフリクトが起きたらどうしよう...
>>>>>>> 42e9c926f974ce74268c96c9b74a185a7199a2f2
```

同じ個所の変更でコンフリクトが起きていることが分かります。

###25.コンフリクトを解消する
コンフリクトしたファイルを適切に修正します。
今回はＡさん、Ｂさん両方の修正を反映させます。
プログラムなどのコンフリクトはきちんと修正、変更箇所を確認してから適宜マージしましょう。

```test.txt(マージ後)
TEST!!
テスト！！
hogehoge!!
Ａさんの追加。
コンフリクト起きるかな？
Ｂさんの追加。
コンフリクトが起きたらどうしよう...
```

コンフリクトが解消されたので再度作業リポジトリにcommitします。

```
$ git status
On branch master
Your branch and 'origin/master' have diverged,
and have 1 and 1 different commits each, respectively.
  (use "git pull" to merge the remote branch into yours)
You have unmerged paths.
  (fix conflicts and run "git commit")
  (use "git merge --abort" to abort the merge)

Unmerged paths:
  (use "git add <file>..." to mark resolution)

        both modified:   test.txt

Untracked files:
  (use "git add <file>..." to include in what will be committed)

        test.txt.orig

no changes added to commit (use "git add" and/or "git commit -a")
```

```
$ git add test.txt

$ git status
On branch master
Your branch and 'origin/master' have diverged,
and have 1 and 1 different commits each, respectively.
  (use "git pull" to merge the remote branch into yours)
All conflicts fixed but you are still merging.
  (use "git commit" to conclude merge)

Changes to be committed:

        modified:   test.txt

Untracked files:
  (use "git add <file>..." to include in what will be committed)

        test.txt.orig

```

```
$ git commit -m 'コンフリクトを解消'
[master c588972] コンフリクトを解消

$ git log -2
commit c5889725472ceba93e7ec3cffdd66e608b014fac
Merge: 1726af7 42e9c92
Author: takezoh <takezoh@hogehoge.co.jp>
Date:   Tue Apr 4 12:55:34 2017 +0900

    コンフリクトを解消

commit 42e9c926f974ce74268c96c9b74a185a7199a2f2
Author: hogehoge <takezoh@hogehoge.co.jp>
Date:   Tue Apr 4 12:26:00 2017 +0900

    Ｂさんの変更をコミット
```

Ａさんの変更もあわせて共有リポジトリにpushします。

```
$ git push
Counting objects: 6, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (6/6), done.
Writing objects: 100% (6/6), 679 bytes | 0 bytes/s, done.
Total 6 (delta 2), reused 0 (delta 0)
To C:/product/git/git_test.git/
   42e9c92..c588972  master -> master
```

```
$ git log origin/master -2
commit c5889725472ceba93e7ec3cffdd66e608b014fac
Merge: 1726af7 42e9c92
Author: takezoh <takezoh@hogehoge.co.jp>
Date:   Tue Apr 4 12:55:34 2017 +0900

    コンフリクトを解消

commit 42e9c926f974ce74268c96c9b74a185a7199a2f2
Author: hogehoge <takezoh@hogehoge.co.jp>
Date:   Tue Apr 4 12:26:00 2017 +0900

    Ｂさんの変更をコミット
```

Ｂさんが再度pullしてみます。

```
$ git pull
remote: Counting objects: 6, done.
remote: Compressing objects: 100% (6/6), done.
remote: Total 6 (delta 2), reused 0 (delta 0)
Unpacking objects: 100% (6/6), done.
From C:/product/git/git_test
   42e9c92..c588972  master     -> origin/master
Updating 42e9c92..c588972
Fast-forward
 test.txt | 2 ++
 1 file changed, 2 insertions(+)
```

マージされたファイルで更新されました。

###26.作業リポジトリでブランチしてみる
ブランチを試してみます。
「分散バージョン管理」ということなので作業リポジトリ（ローカル環境）にブランチを作成してみます。

まずは現状のブランチの状態の確認をします。

```
$ git branch
* master
```

*がついているmasterが現在のブランチを表しています。

ブランチを作成してみます。
local_branch_1というブランチを作成してみます。

```
$ git branch local_branch_1

$ git branch
  local_branch_1
* master
```

作成したブランチで作業を行うためにブランチを切り替えてみます。

```
$ git checkout local_branch_1
Switched to branch 'local_branch_1'

$ git branch
* local_branch_1
  master
```

コンソールのフォルダ名の横の表示も(local_branch_1)に切り替わりました。

test.txtを変更してブランチ側にコミットしてみます。

```test.txt
TEST!!
テスト！！
hogehoge!!
Ａさんの追加。
コンフリクト起きるかな？
Ｂさんの追加。
コンフリクトが起きたらどうしよう...
ブランチ側で変更。  // ←追加
```

addしてcommitします。

```
$ git add test.txt

$ git commit -m 'ブランチ側にコミット'
[local_branch_1 beb3317] ブランチ側にコミット
 1 file changed, 1 insertion(+)
```

無事にコミットできました。

logを確認してみます。

```
$ git log -3
commit beb3317e6ac54d1c80bdec218055cd5460e2dc96
Author: takezoh <takezoh@hogehoge.co.jp>
Date:   Thu Apr 6 12:37:33 2017 +0900

    ブランチ側にコミット

commit c5889725472ceba93e7ec3cffdd66e608b014fac
Merge: 1726af7 42e9c92
Author: takezoh <takezoh@hogehoge.co.jp>
Date:   Tue Apr 4 12:55:34 2017 +0900

    コンフリクトを解消

commit 42e9c926f974ce74268c96c9b74a185a7199a2f2
Author: hogehoge <takezoh@hogehoge.co.jp>
Date:   Tue Apr 4 12:26:00 2017 +0900

    Ｂさんの変更をコミット
```

masterブランチに戻ってみます。

```
$ git checkout master
Switched to branch 'master'
Your branch is up-to-date with 'origin/master'.
```

この時点で先ほど変更したtest.txtがmasterのコミットのファイルに置き換えられます。

```test.txt
TEST!!
テスト！！
hogehoge!!
Ａさんの追加。
コンフリクト起きるかな？
Ｂさんの追加。
コンフリクトが起きたらどうしよう...
```

logをみるとブランチ側のコミットのログがありません。

```
$ git log -2
commit c5889725472ceba93e7ec3cffdd66e608b014fac
Merge: 1726af7 42e9c92
Author: takezoh <takezoh@hogehoge.co.jp>
Date:   Tue Apr 4 12:55:34 2017 +0900

    コンフリクトを解消

commit 42e9c926f974ce74268c96c9b74a185a7199a2f2
Author: hogehoge <takezoh@hogehoge.co.jp>
Date:   Tue Apr 4 12:26:00 2017 +0900

    Ｂさんの変更をコミット
```

###27.master側にマージしてみる
ブランチ側でのコミットが完了したのでその変更をmaster側にマージしてみます。

```
$ git merge local_branch_1
Updating c588972..beb3317
Fast-forward
 test.txt | 1 +
 1 file changed, 1 insertion(+)
```

test.txtを確認して変更が反映されていることを確認します。
これでmaster側へのマージが完了しました。

logも確認してみます。

```
$ git log -2
commit beb3317e6ac54d1c80bdec218055cd5460e2dc96
Author: takezoh <takezoh@hogehoge.co.jp>
Date:   Thu Apr 6 12:37:33 2017 +0900

    ブランチ側にコミット

commit c5889725472ceba93e7ec3cffdd66e608b014fac
Merge: 1726af7 42e9c92
Author: takezoh <takezoh@hogehoge.co.jp>
Date:   Tue Apr 4 12:55:34 2017 +0900

    コンフリクトを解消
```

###28.ブランチを削除してみる
不要になったブランチを削除してみます。

```
$ git branch -d local_branch_1
Deleted branch local_branch_1 (was beb3317).

$ git branch
* master
```

#TortoiseGit

##インストール
下記のページを参考にインストールしてみます。
こちらもとても参考になりますので是非読んでください。

- [TortoiseGit の基礎勉強 〜TortoiseGit によるバージョン管理を使う〜](http://tracpath.com/bootcamp/learning_tortoisegit.html)

###1.ダウンロードしてくる

[TortoiseGit](https://tortoisegit.org/)

現状の最新版は2.4.0.2です。(2017/4/7)

TortoiseGit-2.4.0.2-64bit.msiをダウンロードします。
日本語化パック(TortoiseGit-LanguagePack-2.4.0.0-64bit-ja.msi)もあわせてダウンロードします。

Git for Windowsはインストール済なのでTortoiseGitのインストールを開始します。

###2.TortoiseGitのインストール

インストーラを実行します。
基本的には[Next>]で進めていけば問題ありません。

![tortoisegit_000.png](https://qiita-image-store.s3.amazonaws.com/0/114164/7b8ce0f8-95e9-d678-808a-a53bbf2a41e2.png)

![tortoisegit_001.png](https://qiita-image-store.s3.amazonaws.com/0/114164/25db75d8-8fc3-d45b-c578-202183468d7e.png)

SSHクライアントの選択は一番上を選択しておきます。

![tortoisegit_002.png](https://qiita-image-store.s3.amazonaws.com/0/114164/e1c77d75-2f01-1348-4cf8-47bb95b0eadb.png)

カスタムセットアップも変更がなければそのまま進めます。

![tortoisegit_003.png](https://qiita-image-store.s3.amazonaws.com/0/114164/7e11f0ac-262a-44da-742d-33d0107e620e.png)

![tortoisegit_004.png](https://qiita-image-store.s3.amazonaws.com/0/114164/05de14ee-7e1f-964c-b345-c7e576fc6545.png)

![tortoisegit_005.png](https://qiita-image-store.s3.amazonaws.com/0/114164/97a9a5a0-1bee-81b5-6aee-98d89acb33e5.png)

インストールが完了しました。

![tortoisegit_006.png](https://qiita-image-store.s3.amazonaws.com/0/114164/6fbed7e1-fcc2-08fb-a934-e5e92bc446b8.png)

起動してみます。
日本語化パックをインストールしていないのでここはEnglishのまま進めます。

![tortoisegit_007.png](https://qiita-image-store.s3.amazonaws.com/0/114164/af3fc156-8347-2539-042c-b15b2566ddd0.png)

![tortoisegit_008.png](https://qiita-image-store.s3.amazonaws.com/0/114164/3e2ca755-0819-3701-6f99-4107627187cf.png)

![tortoisegit_009.png](https://qiita-image-store.s3.amazonaws.com/0/114164/b9e0bff1-de83-5de6-e55f-4f22ec8964cc.png)

ユーザー情報もGit Bashで設定した情報が表示されているのでこのまま進めます。

![tortoisegit_010.png](https://qiita-image-store.s3.amazonaws.com/0/114164/767df981-6b0c-9387-5298-10286cd7dad6.png)

![tortoisegit_011.png](https://qiita-image-store.s3.amazonaws.com/0/114164/131a0eb1-ef4e-176a-1499-12f82a2307e6.png)

これで初期スタートの設定も完了です。

###3.日本語化パックのインストール

![langpack_000.png](https://qiita-image-store.s3.amazonaws.com/0/114164/f9064dba-ea2d-29bb-60f1-69d9218e65cd.png)

![langpack_001.png](https://qiita-image-store.s3.amazonaws.com/0/114164/b3e7504f-008c-2e57-7b1b-785380da2c10.png)

![langpack_002.png](https://qiita-image-store.s3.amazonaws.com/0/114164/410598e8-cb72-cb63-5980-a42cf302a49b.png)

インストールが完了しました。

日本語に切り替えます。
右クリックのTortoiseGitのsettingを選択してください。

![langpack_003.png](https://qiita-image-store.s3.amazonaws.com/0/114164/3a499dce-44ce-b384-f097-6cbf2afbc76c.png)

GeneralのLanguageを日本語に切り替えてください。

![langpack_004.png](https://qiita-image-store.s3.amazonaws.com/0/114164/a0dd4baf-dab5-db27-31a7-3e66b13986d1.png)

これで日本語への切り替えが完了しました。

##TortoiseGitを触ってみる

###1.Git Bashで作業していた環境を確認
緑色のチェックマークのアイコンが表示されていることを確認します。
※アイコン表示には時間がかかる場合があります。
※アイコンが表示されない場合はオーバーレイアイコンの最大数を超えている可能性があります。

![tortoisegit_012.png](https://qiita-image-store.s3.amazonaws.com/0/114164/d7e213c1-aafc-916f-0a37-57a22b50787c.png)

###2.pullしてみる
pullしてみます。
フォルダを右クリックしてTortoiseGitからプルを選択します。
![tortoisegit_013.png](https://qiita-image-store.s3.amazonaws.com/0/114164/1ef3df72-8d2c-8012-1a32-363cb5569329.png)

そのまま進めます。
![tortoisegit_014.png](https://qiita-image-store.s3.amazonaws.com/0/114164/5f4717ab-5e9d-d6f1-b1ed-bfbf19b95fe8.png)

特に変更などがないので問題なく更新されました。
![tortoisegit_015.png](https://qiita-image-store.s3.amazonaws.com/0/114164/50eb288d-3800-100f-ee28-e074eb66045e.png)

###3.logを確認する
logを確認してみます。
![tortoisegit_016.png](https://qiita-image-store.s3.amazonaws.com/0/114164/1ad25577-659c-388a-d27f-d417d3e1f04f.png)

Git Bashで作業した内容がそのまま表示されています。
![tortoisegit_017.png](https://qiita-image-store.s3.amazonaws.com/0/114164/c4437b03-243c-a0c8-c38b-32bf2a6baa6e.png)

###4.変更をコミットしてみる
test.txtを変更してみます。

！マークの赤いアイコンが表示されました。
これはファイルに変更があることを表しています。
![tortoisegit_018.png](https://qiita-image-store.s3.amazonaws.com/0/114164/a2264aa5-a615-6e5f-1dcf-8125dc6c6511.png)

###5.差分を確認する
![tortoisegit_019.png](https://qiita-image-store.s3.amazonaws.com/0/114164/96c45dcd-f847-fa9d-5a5d-d10388f07ffc.png)

TortoiseGitのマージツールが起動して差分を確認できました。
![tortoisegit_020.png](https://qiita-image-store.s3.amazonaws.com/0/114164/9ec73def-dab3-8763-ac9d-6fb89c0f87db.png)

###6.コミットしてみる

右クリックからGitコミットを選択します。
![tortoisegit_021.png](https://qiita-image-store.s3.amazonaws.com/0/114164/6affdd94-c146-073d-3daa-8be2a8835f59.png)

コミットするファイルの確認とコメントを入力します。
![tortoisegit_022.png](https://qiita-image-store.s3.amazonaws.com/0/114164/c694c28f-c8d8-9b7c-5883-44fcd03cbe3e.png)

コミットが無事に完了しました。
![tortoisegit_023.png](https://qiita-image-store.s3.amazonaws.com/0/114164/540c335a-cc77-b2e3-7cf5-8665d6d9268d.png)

###7.pushしてみる
先ほどのコミットは作業リポジトリに対してのコミットです。
まだ共有リポジトリには反映されていません。
Ｂさんの環境でpullしてlogを確認しても先ほどの変更は反映されていません。

![tortoisegit_024.png](https://qiita-image-store.s3.amazonaws.com/0/114164/27e33a80-22a7-2413-655e-7e34408529f5.png)

ですので先ほどのコミットを共有リポジトリにpushします。
※この時作業リポジトリは変更がないので全部緑マークになっています
※共有リポジトリとの差分はどうやって確認するだろう...
※共有リポジトリにpushしたかどうかを忘れてしまいそう...
※push忘れについてはいろいろな人が'工夫'で対処する方法が書かれている...

bashでの確認方法は以下の様です。
pushされていないコミットがあればlogに表示されます。

```
$ git log origin/master..master
commit 317239762c05044fa189cde1548374b10459e9bd
Author: takezoh <takezoh@hogehoge.co.jp>
Date:   Wed Apr 12 12:42:07 2017 +0900

    TortoiseGitでコミット

commit beb3317e6ac54d1c80bdec218055cd5460e2dc96
Author: takezoh <takezoh@hogehoge.co.jp>
Date:   Thu Apr 6 12:37:33 2017 +0900

    ブランチ側にコミット
```

※TortoiseGitでpush忘れを確認する方法は？
※TortoiseGitでリモートのログを確認する方法は？

とりあえずpushしてみます。

![tortoisegit_025.png](https://qiita-image-store.s3.amazonaws.com/0/114164/eac84454-fef4-0675-6ca9-758c39eb5b3b.png)

![tortoisegit_026.png](https://qiita-image-store.s3.amazonaws.com/0/114164/e54299cd-eba4-ca5e-a695-d789fa59d4ca.png)

pushが完了しました。

![tortoisegit_027.png](https://qiita-image-store.s3.amazonaws.com/0/114164/bb1c04d3-f16e-5e2a-3623-77555ffde228.png)


#GitHub

いよいよGitHubを触ってみます。

##GitHubのアカウント登録
まずはGitHubのアカウントの登録を行います。

[GitHub](https://github.com/)

ユーザー名とメールアドレス、パスワードを入力します。

![github_000.png](https://qiita-image-store.s3.amazonaws.com/0/114164/edb7cee6-9413-e946-03fc-f53a76b1577a.png)

プランを選択します。
Freeで進めます。

![github_001.png](https://qiita-image-store.s3.amazonaws.com/0/114164/972c5bcd-368b-8f62-07e8-89c2fdefe059.png)

自分の経験にあった内容を選択してsubmitします。

![github_002.png](https://qiita-image-store.s3.amazonaws.com/0/114164/10840d81-d2b1-2b35-f863-bdcb60794c5a.png)

登録が完了しました。
メールでメールアドレスの確認を求められるので確認しておきます。

![github_003.png](https://qiita-image-store.s3.amazonaws.com/0/114164/3c4240cc-ab96-4911-6871-5c5eeadb51fe.png)

早速、リポジトリを作成してみます。

![github_004.png](https://qiita-image-store.s3.amazonaws.com/0/114164/b5066d56-03e0-0a73-ca6b-5e9fa56b553e.png)

無事にリポジトリが作成されました。

![github_005.png](https://qiita-image-store.s3.amazonaws.com/0/114164/ba18b190-b4c9-f71b-78fe-654c005978dc.png)


後は今まで通りの手順でGitHubの共有リポジトリで作業できるようになります。

##GitHubに作成した共有リポジトリで作業
まずは先ほど作成した共有リポジトリをクローンします。
TortoiseGitで作業してみます。

![github_006.png](https://qiita-image-store.s3.amazonaws.com/0/114164/35289f3c-147d-8c27-1c68-6bb82bb79a13.png)

URLに先ほど作成した共有リポジトリのURLを入力します。
ディレクトリはローカルのパスを指定してください。

これ以降はGitHubの共有リポジトリにpushできるようになります。

#GitHub Desktop

GitHub Desktopもインストールしてみます。

##GitHub Desktopをインストール

![githubdesktop_000.png](https://qiita-image-store.s3.amazonaws.com/0/114164/4a291285-8aef-7780-a575-1b94e341eb61.png)

##インストール中...

![githubdesktop_001.png](https://qiita-image-store.s3.amazonaws.com/0/114164/694c089a-5988-ad48-7f57-9a5de36a8b8c.png)

##GitHubのアカウントでログイン
GitHubのアカウントを入力してログインします。

![githubdesktop_002.png](https://qiita-image-store.s3.amazonaws.com/0/114164/25cd1a22-5600-d364-2e0e-27e90ff2c370.png)

##コンフィグを設定
今までに設定したユーザー名とメールアドレスを入力します。

![githubdesktop_003.png](https://qiita-image-store.s3.amazonaws.com/0/114164/8c43a8e2-fe06-93c7-c53e-6a452bd1d077.png)

##インストール完了

![githubdesktop_004.png](https://qiita-image-store.s3.amazonaws.com/0/114164/68b814de-b6f4-a530-aeee-6581410a39a3.png)

##リポジトリの追加
ここで今までに作成したリポジトリを追加してみましょう。
Desktopで表示されるようになりました。

![githubdesktop_005.png](https://qiita-image-store.s3.amazonaws.com/0/114164/e3649692-fd3e-f9b9-b0e3-02b7ab6d0bd1.png)


---

とりあえずGitを触ってみて、TortoiseGitも触ってみて、GitHubまでたどり着くことができました。
もう少し色々と触ってみて随時更新していきたいと思います。


#参考
- [Git の基礎勉強 〜Git によるバージョン管理を使う〜](http://tracpath.com/bootcamp/learning_git_firststep.html)

- [こわくない Git](http://www.slideshare.net/kotas/git-15276118)

- [GitHub 入門](http://qiita.com/ay3/items/8d758ebde41d256a32dc)

- [Gitコマンド一覧](http://qiita.com/deepcom/items/6a4f6aaa279131a7d73d)

- [TortoiseGit の基礎勉強 〜TortoiseGit によるバージョン管理を使う〜](http://tracpath.com/bootcamp/learning_tortoisegit.html)
TortoiseGitの使い方だがローカルPCで共有リポジトリ、作業リポジトリでの使い方が書かれている。

- [ガチで5分で分かる分散型バージョン管理システムGit](http://www.atmarkit.co.jp/ait/articles/1307/05/news028.html)

- [分散バージョン管理Git/Mercurial/Bazaar徹底比較](http://www.atmarkit.co.jp/ait/articles/0901/14/news133.html)