main() blog

プログラムやゲーム、旅、愛する家族について綴っていきます。

【Git】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をインストールしておけばよい

インストー

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

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

Git for windows

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

2.インストーラを起動する

git_000.png

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

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

git_001.png

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

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

git_002.png

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

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

git_003.png

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

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

git_004.png

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

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

git_005.png

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

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

そのまま進めます。

git_006.png

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

そのまま進めます。

git_007.png

10.インストール中…

git_008.png

11.インストール完了

git_009.png

12.Git Bash起動

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

ローカルPCのみで触ってみる

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

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

.gitが作成されました。

2.addしてみる
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コマンドについては以下のページを参考にしてみてください。

[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!!
テスト //←追加
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.Bさん(別の作業ディレクトリ)がクローンしてみる

Bさんを想定して別のフォルダで作業用にクローンしてみます。

$ git clone /c/product/git/git_test.git/ ./
Cloning into '.'...
done.
.git/
test.txt
テスト.txt
21.Bさんがファイルを変更してみる
TEST!!
テスト!!
hogehoge!!  // ←追加

変更後にBさんの状態を確認する。
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")

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

$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working tree clean
22.Bさんが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

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

Bさんの作業リポジトリに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します。

一方、Aさんは…

$ 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.Aさん(元の作業リポジトリ)で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

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

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

24.コンフリクトを起こしてみる

Aさん、Bさんのそれぞれのtest.txtを以下の様に変更してみます。

TEST!!
テスト!!
hogehoge!!
Aさんの追加。
コンフリクト起きるかな?
TEST!!
テスト!!
hogehoge!!
Bさんの追加。
コンフリクトが起きたらどうしよう...

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

$ git commit -m 'Aさんの変更をコミット'
[master 1726af7] Aさんの変更をコミット
 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

    Aさんの変更をコミット

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

    Bさんの変更をコミット hogehoge追加しました
$ git commit test.txt -m 'Bさんの変更をコミット'
[master 42e9c92] Bさんの変更をコミット
 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

    Bさんの変更をコミット

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

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

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

$ 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できました。

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

$ 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!!
テスト!!
hogehoge!!
<<<<<<< HEAD
Aさんの追加。
コンフリクト起きるかな?
=======
Bさんの追加。
コンフリクトが起きたらどうしよう...
>>>>>>> 42e9c926f974ce74268c96c9b74a185a7199a2f2

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

25.コンフリクトを解消する

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

TEST!!
テスト!!
hogehoge!!
Aさんの追加。
コンフリクト起きるかな?
Bさんの追加。
コンフリクトが起きたらどうしよう...

コンフリクトが解消されたので再度作業リポジトリに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

    Bさんの変更をコミット

Aさんの変更もあわせて共有リポジトリに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

    Bさんの変更をコミット

Bさんが再度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!!
テスト!!
hogehoge!!
Aさんの追加。
コンフリクト起きるかな?
Bさんの追加。
コンフリクトが起きたらどうしよう...
ブランチ側で変更。  // ←追加

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

    Bさんの変更をコミット

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

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

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

TEST!!
テスト!!
hogehoge!!
Aさんの追加。
コンフリクト起きるかな?
Bさんの追加。
コンフリクトが起きたらどうしよう...

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

    Bさんの変更をコミット
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

インストー

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

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

TortoiseGit

現状の最新版は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

tortoisegit_001.png

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

tortoisegit_002.png

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

tortoisegit_003.png

tortoisegit_004.png

tortoisegit_005.png

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

tortoisegit_006.png

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

tortoisegit_007.png

tortoisegit_008.png

tortoisegit_009.png

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

tortoisegit_010.png

tortoisegit_011.png

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

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

langpack_000.png

langpack_001.png

langpack_002.png

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

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

langpack_003.png

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

langpack_004.png

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

TortoiseGitを触ってみる

1.Git Bashで作業していた環境を確認

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

tortoisegit_012.png

2.pullしてみる

pullしてみます。
フォルダを右クリックしてTortoiseGitからプルを選択します。
tortoisegit_013.png

そのまま進めます。
tortoisegit_014.png

特に変更などがないので問題なく更新されました。
tortoisegit_015.png

3.logを確認する

logを確認してみます。
tortoisegit_016.png

Git Bashで作業した内容がそのまま表示されています。
tortoisegit_017.png

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

test.txtを変更してみます。

!マークの赤いアイコンが表示されました。
これはファイルに変更があることを表しています。
tortoisegit_018.png

5.差分を確認する

tortoisegit_019.png

TortoiseGitのマージツールが起動して差分を確認できました。
tortoisegit_020.png

6.コミットしてみる

右クリックからGitコミットを選択します。
tortoisegit_021.png

コミットするファイルの確認とコメントを入力します。
tortoisegit_022.png

コミットが無事に完了しました。
tortoisegit_023.png

7.pushしてみる

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

tortoisegit_024.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

tortoisegit_026.png

pushが完了しました。

tortoisegit_027.png

GitHub

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

GitHubのアカウント登録

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

GitHub

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

github_000.png

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

github_001.png

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

github_002.png

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

github_003.png

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

github_004.png

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

github_005.png

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

GitHubに作成した共有リポジトリで作業

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

github_006.png

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

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

GitHub Desktop

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

GitHub Desktopをインストー

githubdesktop_000.png

インストール中…

githubdesktop_001.png

GitHubのアカウントでログイン

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

githubdesktop_002.png

コンフィグを設定

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

githubdesktop_003.png

インストール完了

githubdesktop_004.png

リポジトリの追加

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

githubdesktop_005.png


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

参考