おれさまラボ

実際に手を動かして理解を深めるブログ。

ドットインストールの git入門 やってきた

はじめに

  • Gitをドットインストールで勉強してきました。
  • エンジニアのはしくれだし、Gitでバージョン管理やってみたい。

目次

#02 バージョン管理の流れを理解しよう

Gitとは

Gitは、バージョン管理のためのツールです。

  • ファイルを作ったり、修正したり
  • ある程度のまとまりになったら
  • 履歴データベースに保存する。

Gitの状態

Gitには、3つの状態が用意されています。

#03 gitの設定をしよう

実習環境

実習環境は、以下の通りで行いました。

$ uname -a
Linux vagrant-ubuntu-trusty-32 3.13.0-101-generic #148-Ubuntu SMP Thu Oct 20 22:09:17 UTC 2016 i686 i686 i686 GNU/Linux
$ git --version
git version 1.9.1

Gitで、必須の設定や、推奨の設定を学んでいきます。

ユーザ名、メールアドレスの設定(必須)

  • Gitでは、ファイルを作成するときに、必ずユーザ名とメールアドレスが必要になります。
  • 以下のコマンドで、グローバル設定を行っておきます。
$ git config --global user.name "Taro Tanaka"
$ git config --global user.email "git-test@example.com"

色つけの設定(推奨)

  • GitのUIをカラー表示に設定することで、見やすくなります。
$ git config --global color.ui true

設定の一覧表示

  • 設定を一覧表示させる方法を学びます。
  • 設定を一覧で表示するには、git configコマンドを「-l」オプション付きで実行します。
$ git config -l
user.name=Taro Tanaka
user.email=git-test@example.com
color.ui=true

ヘルプ表示

  • 困った時のヘルプの表示させ方を学びます。
  • ロングオプションの--helpをつけると、ヘルプを表示することができます。
  • ヘルプから抜けるには、q(quit)を押下します。
$ git config --help
  • もしくは、git helpコマンドでもヘルプを表示可能です。
$ git help config

#04 初めてのコミットをしてみよう

初めてGitを使ってみます。

作業ディレクトリの作成

  • まずは、作業用のディレクトリを作成します。※今回は、mywebとします。
  • 作成した、mywebディレクトリに移動し、git initコマンドを実行します。
  • 問題なければ、Initialized empty Git repositoryと表示され、リポジトリが作成されたことが分かります。
vagrant@vagrant-ubuntu-trusty-32:~$ mkdir myweb
vagrant@vagrant-ubuntu-trusty-32:~$ cd myweb/
vagrant@vagrant-ubuntu-trusty-32:~/myweb$ git init
Initialized empty Git repository in /home/vagrant/myweb/.git/

ファイルの作成

  • ファイルを作成します。
  • 今回は、バージョン履歴がわかりやすいように、line 1とだけ記入します。
$ vi index.html
$ cat index.html
line 1

ステージングエリアへアップする

  • 作成したファイルを、ステージングエリアにアップします。
  • ステージングエリアにアップするためには、git addコマンドを使用します。
  • エラーが発生しなければOKです。
$ git add index.html

リポジトリへコミットする

  • ステージングエリアからリポジトリの状態へ遷移させます。
  • コミットするには、git commitコマンドを利用します。
  • コマンドを実行すると、エディタが起動するので、コメントを記入します。※今回は、initial commitと記入しました。
$ git add index.html
$ git commit
[master (root-commit) 6fbe7ac] initial commit
 1 file changed, 2 insertions(+)
 create mode 100644 index.html

コミットの履歴(ログ)を参照する

  • コミットの履歴は、git logコマンドで確認できます。
  • commit欄にIDが付与され、誰が、いつ、なぜ(コメント)コミットしたのか分かるようになっています。
$ git log
commit 6fbe7acae145d7a6909764d230632068cee5a3ed
Author: Taro Tanaka <git-test@example.com>
Date:   Sun Nov 27 10:17:42 2016 +0000

    initial commit

#05 gitのログを見てみよう

git logの見方を学びます。

commit 行

  • commitには、一意のIDが付与され、commit行に表示されます。
commit 6fbe7acae145d7a6909764d230632068cee5a3ed

Author/Date 行

  • いつ、誰がコミットしたのかが表示されます。
Author: Taro Tanaka <git-test@example.com>
Date:   Sun Nov 27 10:17:42 2016 +0000

コミットメッセージ

  • コミットするときに入力したメッセージが表示されます。
  • メッセージによって、内容が把握できるので、コミットする際には注意して入力しましょう。
    initial commit

便利なオプション①: --oneline

  • --onelineオプションをつけることで、git logを、1コミット1行で表示してくれます。
  • ただし、表示される内容は、コミットIDの一部と、コミットメッセージのみとなります。
$ git log --oneline
6fbe7ac initial commit

便利なオプション②: -p

  • -pオプションをつけることで、変更箇所を表示することができます。
$ git log -p
commit 6fbe7acae145d7a6909764d230632068cee5a3ed
Author: Taro Tanaka <git-test@example.com>
Date:   Sun Nov 27 10:17:42 2016 +0000

    initial commit

diff --git a/index.html b/index.html
new file mode 100644
index 0000000..d241ff8
--- /dev/null
+++ b/index.html
@@ -0,0 +1,2 @@
+line 1
+

以下、少し細かく解説します。

diff --git a/index.html b/index.html
  • この行では、どのファイルとどのファイルを比較しているか分かります。
--- /dev/null
+++ b/index.html
  • この行では、/dev/null、つまり、なにもないところから、index.htmlが生成されたことを示します。
@@ -0,0 +1,2 @@
+line 1
+
  • @@ -0,0 +1,2 @@の行では、どの行に新しい情報が追加されたかを表します。
  • +のついた行は、追加された内容をそのまま表示しています。

便利なオプション③: --stat

  • --statをつけることで、「どのファイルが何箇所変わったか」を表示することができます。
$ git log --stat
commit 6fbe7acae145d7a6909764d230632068cee5a3ed
Author: Taro Tanaka <git-test@example.com>
Date:   Sun Nov 27 10:17:42 2016 +0000

    initial commit

 index.html | 2 ++
 1 file changed, 2 insertions(+)

#06 現在の状態を把握しよう

ファイル状態の確認方法を学びます。

ファイルの編集

  • まずは、ファイルを編集します。
  • 今回は、編集箇所がわかりやすいように、line 2を追記しました。
$ vi index.html
$ cat index.html
line 1
line 2

ファイルの状態確認

  • ファイルを編集した後に、ファイルの状態を確認してみます。
  • 確認には、git statusコマンドを使用します。
  • modifiedと表示され、編集された状態であることが分かります。
  • また、Changes not staged for commitと表示されていることから、ステージングエリアにもアップされていないことが分かります。
  • ()内には、ステージングエリアにアップする場合(git add)、編集を破棄する場合(git checkout)のコマンドがそれぞれ記載されています。
$ git status
On branch 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:   index.html

no changes added to commit (use "git add" and/or "git commit -a")
  • ここで、編集した結果を破棄してみます。
  • 編集を破棄するには、git checkoutコマンドを使用します。
  • コマンド実行後のindex.htmlは、編集前の状態に戻っていることが分かります。
$ git checkout -- index.html
$ cat index.html
line 1
  • 編集を破棄した後にstatusコマンドを実行すると、変更点がないということが分かります。
$ git status
On branch master
nothing to commit, working directory clean

#07 差分を確認してみよう

Gitでは、編集前と編集後のファイルの差分確認を行うことができます。

ファイルの編集

  • まずは、ファイルの編集をします。
$ vi index.html
$ cat index.html
line 1
line 2

状態を確認する

  • 現在のファイル状態を確認します。
  • 編集はされているが、ステージングエリアにアップされていない状態であることが分かります。
$ git status
On branch 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:   index.html

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

差分を確認する

  • このまま、ファイルをaddしたり、commitしても良いですが、その前に、現在どこが編集されていて、編集前とどう差があるのかをチェックする事ができます。
  • 差分のチェックは、git diffコマンドを利用します。
  • 差分が表示され、line 2が追加されていることが分かります。
  • git diffコマンドは、ステージングエリアにアップしていないファイルに対してのみ使用可能なので、注意が必要です。
$ git diff
diff --git a/index.html b/index.html
index d241ff8..3dc6087 100644
--- a/index.html
+++ b/index.html
@@ -1,2 +1,3 @@
 line 1
+line 2

ステージングエリアにアップする

  • 編集したファイルを、ステージングエリアにアップします。
  • ステージングエリアへのアップには、git addコマンドを使用します。
  • アップ後、git statusコマンドで確認してみると、Changes to be committed:となっており、コミット待ち状態であることが分かります。
$ git add index.html
$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        modified:   index.html

ステージングエリアにアップされたファイルの差分を確認する

  • ステージングエリアにアップされたファイルの差分は、git diffコマンドでは、確認できません。
  • --cachedオプションをつけることで、コミット前のファイルの差分を表示させることができます。
$ git diff
$ git diff --cached
diff --git a/index.html b/index.html
index d241ff8..3dc6087 100644
--- a/index.html
+++ b/index.html
@@ -1,2 +1,3 @@
 line 1
+line 2

#08 gitでのファイル操作について

Gitでのファイル操作について学びます。

カレントディレクトリ配下のファイルをすべてステージングエリアにアップする

  • git addコマンドの後にファイル名を指定することで、そのファイルをステージングエリアにアップすることが可能ですが、幾つものファイルをコマンドの後に列挙するのは面倒です。
  • git add .コマンドを使えば、カレントディレクトリ配下のファイルをすべてステージングエリアにアップする事ができます。

Gitの管理下にあるファイルの移動/削除

  • Gitの管理下にあるファイルを移動したり、削除したりしたい場合は、必ずgit mvコマンドや、git rmコマンドを用いて、Gitとして操作するようにしましょう。Linuxコマンドのmvや、rmでファイル操作を行ってはいけません。

#09 git管理に含めない設定について

git管理したくないファイルの扱い方を学びます。

.gitignore

  • ログファイルなど、それ自体をバージョン管理する意義があまりないものをgitの管理下から外す事ができます。
  • .gitignoreというファイルをディレクトリ内に作成し、その中に、管理したくないファイルを指定することができます。
  • ファイル指定は、*など、正規表現が利用可能です。
$ ls
error.log  index.html
$ vi .gitignore
$ cat .gitignore
*.log

$ ls -a
.  ..  error.log  .git  .gitignore  index.html
  • この状態でgit statusコマンドを実行すると、error.logファイルは、Gitの管理対象から外れていることが分かります。
  • なお、.gitignoreの影響範囲は、.gitignoreの置かれたディレクトリ以下全てとなります。
  • そのため、サブディレクトリ内のファイルにのみ.gitignoreを適用させたければ、サブディレクトリの中に.gitignoreを作成する必要があります。
$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        modified:   index.html

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

        .gitignore

$ git add .
$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        new file:   .gitignore
        modified:   index.html

#10 直前のコミットを変更する

ちょっとした間違いを見つけたとき、コミットログを増やさず、直前のコミットを変更することができます。

  • コミットメッセージが1行しかない場合は、-mオプションを付けることで、エディタの起動を省略することができます。
$ git commit -m "add line 2"
[master 3f293f4] add line 2
 2 files changed, 3 insertions(+)
 create mode 100644 .gitignore
$ git status
On branch master
nothing to commit, working directory clean
$ git log
commit 3f293f439a0c50567f1c2a098e41ca7dd3ebacfc
Author: Taro Tanaka <git-test@example.com>
Date:   Sun Nov 27 11:34:26 2016 +0000

    add line 2

commit 6fbe7acae145d7a6909764d230632068cee5a3ed
Author: Taro Tanaka <git-test@example.com>
Date:   Sun Nov 27 10:17:42 2016 +0000

    initial commit
  • コミットした後に、ちょっとしたミスに気がついてしまった場合、再コミットしても良いですが、直前のコミットを編集することができます。
  • コミットが増えると、git logで表示される内容も多くなるので、ちょっとしたミスであれば、直前のコミットを編集することがおすすめされます。
  • 今回の例では、line 2にインデントを付け忘れたとして、直前のコミットを変更しています。
  • この時、コミットメッセージも変更することが可能です。もちろん、変更しないことも可能です。
$ vi index.html
$ cat index.html
line 1
   line 2

$ git status
On branch 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:   index.html

no changes added to commit (use "git add" and/or "git commit -a")
$ git add .
$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        modified:   index.html

$ git commit --amend
[master baba25e] add line 2
 2 files changed, 3 insertions(+)
 create mode 100644 .gitignore
$ git log
commit baba25ef2515d6f177eb64489ef46388d6e14c95
Author: Taro Tanaka <git-test@example.com>
Date:   Sun Nov 27 11:34:26 2016 +0000

    add line 2

commit 6fbe7acae145d7a6909764d230632068cee5a3ed
Author: Taro Tanaka <git-test@example.com>
Date:   Sun Nov 27 10:17:42 2016 +0000

    initial commit

#11 過去のバージョンに戻ってみよう (1)

Gitはバージョン管理ツールなので、簡単に過去のバージョンに遡ることができます。

git reset コマンド

  • 過去のバージョンに遡るには、git resetコマンドを使います。
  • オプションには、--hardをとります。
  • 直前のバージョンの指定には、HEADを使います。
  • さらにもう一つ前のバージョンの指定には、HEAD^を使います。
  • コミットIDを直接しているすることも可能です。この場合、頭から最低7桁分のIDを指定すれば問題ありません。
$ cat index.html
line 1
   line 2

$ git reset --hard HEAD^
HEAD is now at 6fbe7ac initial commit
$ cat index.html
line 1

$ git log
commit 6fbe7acae145d7a6909764d230632068cee5a3ed
Author: Taro Tanaka <git-test@example.com>
Date:   Sun Nov 27 10:17:42 2016 +0000

    initial commit

#12 過去のバージョンに戻ってみよう (2)

コミットした情報は、何かしらの形で残っているので、過去に遡ってから元の最新コミットに戻したいということも可能です。

最新コミットに戻す

  • 前回、initial commitまでファイルを戻してしまいましたが、これをline 2が含まれていた最新バージョンに戻してみます。
  • オプションには、--hardをとります。
  • 最新のバージョンの指定には、ORIG_HEADを使います。
$ git log
commit 6fbe7acae145d7a6909764d230632068cee5a3ed
Author: Taro Tanaka <git-test@example.com>
Date:   Sun Nov 27 10:17:42 2016 +0000

    initial commit
$ cat index.html
line 1

$ git reset --hard ORIG_HEAD
HEAD is now at baba25e add line 2
$ cat index.html
line 1
   line 2

$ git log
commit baba25ef2515d6f177eb64489ef46388d6e14c95
Author: Taro Tanaka <git-test@example.com>
Date:   Sun Nov 27 11:34:26 2016 +0000

    add line 2

commit 6fbe7acae145d7a6909764d230632068cee5a3ed
Author: Taro Tanaka <git-test@example.com>
Date:   Sun Nov 27 10:17:42 2016 +0000

    initial commit

#13 ブランチを使ってみよう

gitでは、ブランチを使って、ファイルバージョンを分岐して管理することができます。

ブランチの切り替え

  • git branchコマンドで、ブランチを切り替える事ができます。
  • デフォルトのブランチはmasterです。
  • 例では、hogeというブランチを新しく作っています。
  • ブランチを切り替えるには、git checkoutコマンドを使用します。
  • *がついているブランチが、現在利用しているブランチとなります。
$ git branch
* master
$ git branch hoge
$ git branch
  hoge
* master
$ git checkout hoge
Switched to branch 'hoge'
$ git branch
* hoge
  master

ブランチでファイル編集

  • 新しく作ったブランチhogeでファイル編集を行ってみます。
  • 例では、script.jsという新しいファイルを作成してみます。
  • ファイル作成後、git addgit commitをそれぞれ実行し、リポジトリに反映させます。
$ ls
error.log  index.html
$ vi script.js
$ cat script.js
aleart();

$ ls
error.log  index.html  script.js
$ git add .
$ git commit -m"script added"
[hoge 9099719] script added
 1 file changed, 2 insertions(+)
 create mode 100644 script.js
 ```

## hogeブランチのlogを確認

* `git log`を確認すると、`master`のブランチで作成されていたバージョンの上に、今回作ったバージョンが載っていることが分かります。

 ```
$ git log
commit 90997199a20969b367e353ba364d169900cd7471
Author: Taro Tanaka <git-test@example.com>
Date:   Sun Nov 27 12:07:35 2016 +0000

    script added

commit baba25ef2515d6f177eb64489ef46388d6e14c95
Author: Taro Tanaka <git-test@example.com>
Date:   Sun Nov 27 11:34:26 2016 +0000

    add line 2

commit 6fbe7acae145d7a6909764d230632068cee5a3ed
Author: Taro Tanaka <git-test@example.com>
Date:   Sun Nov 27 10:17:42 2016 +0000

    initial commit

masterブランチのlogを確認

  • masterのブランチに切り替え、同様にgit logを確認してみます。
  • add line 2のコメントのついたバージョンまでしか存在しないことが分かります。
$ git checkout master
Switched to branch 'master'
$ git log
commit baba25ef2515d6f177eb64489ef46388d6e14c95
Author: Taro Tanaka <git-test@example.com>
Date:   Sun Nov 27 11:34:26 2016 +0000

    add line 2

commit 6fbe7acae145d7a6909764d230632068cee5a3ed
Author: Taro Tanaka <git-test@example.com>
Date:   Sun Nov 27 10:17:42 2016 +0000

    initial commit
$ ls
error.log  index.html

#14 ブランチをマージしてみよう

gitでは、分岐することができるだけでなく、分岐したものをマージすることも可能です。

マージする

  • masterブランチに、hogeブランチの編集内容をマージしてみます。
  • マージされる側のブランチ(master)にいることを確認します。この状態では、hogeブランチで作成したscript.jsファイルは存在しません。
  • git margeコマンドで、hogeブランチをmasterブランチにマージします。
  • マージされた結果、masterブランチ内にscript.jsができていることが分かります。
$ git branch
  hoge
* master
$ ls
error.log  index.html
$ git merge hoge
Updating baba25e..9099719
Fast-forward
 script.js | 2 ++
 1 file changed, 2 insertions(+)
 create mode 100644 script.js
$ ls
error.log  index.html  script.js
  • git logで確認すると、script addedというhogeブランチでコミットした内容が記載されていることがわかります。※コミットIDも同じ。
$ git log
commit 90997199a20969b367e353ba364d169900cd7471
Author: Taro Tanaka <git-test@example.com>
Date:   Sun Nov 27 12:07:35 2016 +0000

    script added

commit baba25ef2515d6f177eb64489ef46388d6e14c95
Author: Taro Tanaka <git-test@example.com>
Date:   Sun Nov 27 11:34:26 2016 +0000

    add line 2

commit 6fbe7acae145d7a6909764d230632068cee5a3ed
Author: Taro Tanaka <git-test@example.com>
Date:   Sun Nov 27 10:17:42 2016 +0000

    initial commit

不要なブランチを削除する

  • git branchコマンドは、-dオプションをとることで、不要となったブランチを削除する事ができます。
  • 次の例では、hogeブランチの内容は、masterブランチにすべてマージされたので、hogeブランチを削除しています。
$ git branch
  hoge
* master
$ git branch -d hoge
Deleted branch hoge (was 9099719).
$ git branch
* master

マージ済みのブランチ一覧を確認する

  • masterにマージ済みのbranchの一覧を見るには、masterに切り替えた状態で「git branch --merged」というコマンドを実行します。※削除されたブランチは表示されないようです。
  • 逆に、まだmasterにマージしていないbranchの一覧を見るには「git branch --no-merged」を使います。
$ git branch --merged
  hoge
* master
$ git branch --no-merged

#15 マージの衝突を解決してみよう (1)

マージが衝突する(コンフリクト)とは、どういうことかを学びます。

バージョンの初期化

  • 講義内容に合わせるため、initial commitまで情報を戻します。
$ git reset --hard 6fbe7acae145d7a6909764d230632068cee5a3ed
HEAD is now at 6fbe7ac initial commit
$ git log
commit 6fbe7acae145d7a6909764d230632068cee5a3ed
Author: Taro Tanaka <git-test@example.com>
Date:   Sun Nov 27 10:17:42 2016 +0000

    initial commit
$ ls
error.log  index.html
$ rm error.log
$ ls
index.html

ブランチを作成する(checkoutコマンドを利用)

  • 新しくブランチを作成します。
  • git checkoutコマンドで、-bオプションを付けると、ブランチを作成した上で、ブランチの切り替え(checkout)まで一気に行ってくれます。
$ git checkout -b hogehoge
Switched to a new branch 'hogehoge'
$ git branch
* hogehoge
  master

hogehogeブランチでファイルを編集する

  • 新しく作ったhogehogeブランチで、ファイルを編集します。
$ vi index.html
$ cat index.html
line first

$ git add .
$ git commit -m "not 1 but first"
[hogehoge a0af9a2] not 1 but first
 1 file changed, 1 insertion(+), 1 deletion(-)

masterブランチでファイルを編集する

  • masterブランチへ移動して、hogehogeブランチと同じ箇所を編集してみます。
$ git checkout master
Switched to branch 'master'
$ git branch
  hogehoge
* master
$ cat index.html
line 1

$ vi index.html
$ cat index.html
line 1st

$ git add .
$ git commit -m "not 1 but 1st"
[master d443698] not 1 but 1st
 1 file changed, 1 insertion(+), 1 deletion(-)

マージする

  • 修正後の内容は、hogehogeブランチとmasterブランチで異なります。
  • そのため、この後マージしようとすると編集内容の衝突(コンフリクト)が発生することになります。
$ git branch
  hogehoge
* master
$ git merge hogehoge
Auto-merging index.html
CONFLICT (content): Merge conflict in index.html
Automatic merge failed; fix conflicts and then commit the result.

#16 マージの衝突を解決してみよう (2)

マージでコンフリクトが発生した場合、どのように修正すればよいかを学びます。

状態確認

  • git statusでファイルの状態を確認してみます。
  • both modified:となり、修正が必要である旨が記載されています。
$ git status
On branch master
You have unmerged paths.
  (fix conflicts and run "git commit")

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

        both modified:      index.html

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

ファイルを修正する

  • エディタで、ファイルを開いてみます。
  • コンフリクトが発生している箇所が明示されています。
<<<<<<< HEAD
line 1st

=======
line first
>>>>>>> hogehoge
  • 採用したい更新箇所だけ残して、他は削除し、保存します。
$ cat index.html
line 1st

ファイルをコミットする

  • git addgit commitを実行し、リポジトリへ反映させます。
$ git add .
$ git commit -m "conflict fixed"
[master cc0d70c] conflict fixed

logを確認する

  • logを確認すると、conflict fixedとコメントしたバージョンが反映されていることが分かります。
  • 過去のバージョンをみると、コンフリクトが発生していた両方のファイルが、それぞれバージョンとして管理されていることがわかります。
commit cc0d70c93dd2a8714d64d4732265c4100703cb96
Merge: d443698 a0af9a2
Author: Taro Tanaka <git-test@example.com>
Date:   Sun Nov 27 13:03:06 2016 +0000

    conflict fixed

commit d4436988a81980087b8acfceac8310ba94c8abe2
Author: Taro Tanaka <git-test@example.com>
Date:   Sun Nov 27 12:51:12 2016 +0000

    not 1 but 1st

commit a0af9a294415fcec98717921f517c2b64796a07d
Author: Taro Tanaka <git-test@example.com>
Date:   Sun Nov 27 12:46:29 2016 +0000

    not 1 but first

commit 6fbe7acae145d7a6909764d230632068cee5a3ed
Author: Taro Tanaka <git-test@example.com>
Date:   Sun Nov 27 10:17:42 2016 +0000

    initial commit

statusを確認する

  • git statusコマンドで確認しても、きちんとコミットされていることがわかります。
$ git status
On branch master
nothing to commit, working directory clean

#17 タグを使ってみよう

コミットに対して別名をつけてみます。

バージョンの初期化

  • 例によって、initial commitまでファイルを戻します。
$ git reset --hard 6fbe7acae145d7a6909764d230632068cee5a3ed
HEAD is now at 6fbe7ac initial commit
$ git log
commit 6fbe7acae145d7a6909764d230632068cee5a3ed
Author: Taro Tanaka <git-test@example.com>
Date:   Sun Nov 27 10:17:42 2016 +0000

    initial commit

ファイルの編集 -> コミット

  • いつもの流れでファイルを編集、ステージングエリアへアップ、コミットまでします。
$ vi index.html
$ cat index.html
line 1
line 2
$ git add .
$ git commit -m "line 2 added"
[master 82a0c1c] line 2 added
 1 file changed, 1 insertion(+), 1 deletion(-)
$ git log
commit 82a0c1cb10575f13b779f50bfc63138cb22d2679
Author: Taro Tanaka <git-test@example.com>
Date:   Sun Nov 27 13:12:33 2016 +0000

    line 2 added

commit 6fbe7acae145d7a6909764d230632068cee5a3ed
Author: Taro Tanaka <git-test@example.com>
Date:   Sun Nov 27 10:17:42 2016 +0000

    initial commit

直近のコミットにタグをつける

  • git tagコマンドを使って、コミットにタグ(別名)をつけることができます。
  • git showコマンドの引数にタグ名を指定することで、変更内容を表示することができます。
$ git tag v1.0
$ git tag
v1.0
$ git show v1.0
commit 82a0c1cb10575f13b779f50bfc63138cb22d2679
Author: Taro Tanaka <git-test@example.com>
Date:   Sun Nov 27 13:12:33 2016 +0000

    line 2 added

diff --git a/index.html b/index.html
index d241ff8..7bba8c8 100644
--- a/index.html
+++ b/index.html
@@ -1,2 +1,2 @@
 line 1
-
+line 2

コミットを指定してタグをつける

  • git tagコマンドを使って、過去のコミットどれにでもタグ(別名)をつけることができます。
  • 過去のコミットを指定するには、タグ名のあとにコミットIDを指定します。
$ git tag v0.9 6fbe7acae145d7a6909764d230632068cee5a3ed
$ git tag
v0.9
v1.0
$ git show v0.9
commit 6fbe7acae145d7a6909764d230632068cee5a3ed
Author: Taro Tanaka <git-test@example.com>
Date:   Sun Nov 27 10:17:42 2016 +0000

    initial commit

diff --git a/index.html b/index.html
new file mode 100644
index 0000000..d241ff8
--- /dev/null
+++ b/index.html
@@ -0,0 +1,2 @@
+line 1
+

タグを削除する

  • git tagコマンドの-dオプションを使って、タグを削除することができます。
$ git tag
v0.9
v1.0
$ git tag -d v0.9
Deleted tag 'v0.9' (was 6fbe7ac)
$ git tag
v1.0

#18 エイリアスを使ってみよう

gitのコマンドにエイリアス(短縮名)を設定する方法を学びます。

aliasの設定

  • aliasはgit configコマンドを使って設定します。
$ git config --global alias.co checkout
$ git config --global alias.st status
$ git config --global alias.br branch
$ git config --global alias.ci commit

設定の確認

  • git configコマンドで設定した内容は、-lオプションを使って確認できます。
$ git config -l
user.name=Taro Tanaka
user.email=git-test@example.com
color.ui=true
alias.co=checkout
alias.st=status
alias.br=branch
alias.ci=commit
core.repositoryformatversion=0
core.filemode=true
core.bare=false
core.logallrefupdates=true

aliasを使ってみる

  • 設定したaliasを使って、実際のコマンドと同じことが実行可能です。
$ git st
On branch master
nothing to commit, working directory clean

#19 はじめての共同作業

gitでは、共有リポジトリを使って、複数名でファイルを管理することができます。

共有リポジトリの作成

~$ pwd
/home/vagrant
~$ ls
myweb
~$ mkdir ourweb.git
~$ cd ourweb.git/
~/ourweb.git$ git init --bare
Initialized empty Git repository in /home/vagrant/ourweb.git/

作業者Aのファイルを初期化

  • mywebディレクトリへ移動し、例によってinitial commitの状態へ戻します。
$ cd ../myweb/
$ ls
index.html
$
$
$ git log
commit 82a0c1cb10575f13b779f50bfc63138cb22d2679
Author: Taro Tanaka <git-test@example.com>
Date:   Sun Nov 27 13:12:33 2016 +0000

    line 2 added

commit 6fbe7acae145d7a6909764d230632068cee5a3ed
Author: Taro Tanaka <git-test@example.com>
Date:   Sun Nov 27 10:17:42 2016 +0000

    initial commit
$ git status
On branch master
nothing to commit, working directory clean
$ git reset --hard 6fbe7acae145d7a6909764d230632068cee5a3ed
HEAD is now at 6fbe7ac initial commit
$ git log
commit 6fbe7acae145d7a6909764d230632068cee5a3ed
Author: Taro Tanaka <git-test@example.com>
Date:   Sun Nov 27 10:17:42 2016 +0000

    initial commit
$ git status
On branch master
nothing to commit, working directory clean

#20 共有リポジトリにpushしてみよう

作業者Aとして、共有リポジトリにファイルをpushしてみます。

共有リポジトリ情報を設定する

  • git remote addコマンドを使って、共有リポジトリ情報を設定します。
  • 引数の名前originは何でも良いです。慣例的にoriginがよく使われます。
  • git remoteコマンド実行後は、設定として書き込まれます。
$ git config -l
user.name=Taro Tanaka
user.email=git-test@example.com
color.ui=true
alias.co=checkout
alias.st=status
alias.br=branch
alias.ci=commit
core.repositoryformatversion=0
core.filemode=true
core.bare=false
core.logallrefupdates=true
$ git remote add origin ~/ourweb.git
$ git config -l
user.name=Taro Tanaka
user.email=git-test@example.com
color.ui=true
alias.co=checkout
alias.st=status
alias.br=branch
alias.ci=commit
core.repositoryformatversion=0
core.filemode=true
core.bare=false
core.logallrefupdates=true
remote.origin.url=/home/vagrant/ourweb.git
remote.origin.fetch=+refs/heads/*:refs/remotes/origin/*

共有リポジトリ情報を削除する

  • git remote rmコマンドを使って、共有リポジトリ設定を削除することができます。
$ git remote rm origin

共有リポジトリにpushする

  • 共有リポジトリに作業者Aのローカルリポジトリの内容をpushしてみます。
  • git pushコマンドを利用します。
  • 特にエラーが出なければOKです。
$ git push origin master
Counting objects: 3, done.
Writing objects: 100% (3/3), 226 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To /home/vagrant/ourweb.git
 * [new branch]      master -> master

#21 リポジトリの内容を共有してみよう

作業者Bになったつもりで、作業者Aが共有リポジトリにアップした内容を共有してみます。

clone

  • git cloneコマンドを使うことで、共有リポジトリの内容を作業者Bの作業ディレクトmyweb2まで簡単に複製することができます。
~$ ls
myweb  ourweb.git
~$ git clone ~/ourweb.git/ myweb2
Cloning into 'myweb2'...
done.
~$ ls
myweb  myweb2  ourweb.git
~$ cd myweb2
myweb2$ ls
index.html
myweb2$ git log
commit 6fbe7acae145d7a6909764d230632068cee5a3ed
Author: Taro Tanaka <git-test@example.com>
Date:   Sun Nov 27 10:17:42 2016 +0000

    initial commit

作業者B -> 共有リポジトリ

  • 作業者Bがファイルを編集し、その内容を共有リポジトリにpushします。
  • なお、cloneする際に、共有リポジトリ情報含め、設定情報が全て引き継がれます。
$ cat index.html
line 1

$ vi index.html
$ cat index.html
line 1
line 2
$ git add .
$ git commit -m "line 2 added"
[master fb79863] line 2 added
 1 file changed, 1 insertion(+), 1 deletion(-)
$ git push origin master
Counting objects: 5, done.
Writing objects: 100% (3/3), 257 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To /home/vagrant/ourweb.git/
   6fbe7ac..fb79863  master -> master

共有リポジトリ -> 作業者A

  • 共有リポジトリには、作業者Bの変更が反映されているので、その内容を作業者Aのローカルリポジトリに反映させます。
  • 共有リポジトリから情報を持ってくるには、git pullコマンドを利用します。
$ git pull origin master
remote: Counting objects: 5, done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
From /home/vagrant/ourweb
 * branch            master     -> FETCH_HEAD
   6fbe7ac..fb79863  master     -> origin/master
Updating 6fbe7ac..fb79863
Fast-forward
 index.html | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
$ git log
commit fb7986360c1397a032d5907ca3abff1d4da9c724
Author: Taro Tanaka <git-test@example.com>
Date:   Sun Nov 27 14:02:48 2016 +0000

    line 2 added

commit 6fbe7acae145d7a6909764d230632068cee5a3ed
Author: Taro Tanaka <git-test@example.com>
Date:   Sun Nov 27 10:17:42 2016 +0000

    initial commit

#22 共有時のトラブルを解決する

作業者B -> 共有リポジトリ

  • 作業者Bがファイルを編集し、共有リポジトリにアップしたとします。
$ vi index.html
$ git add .
$ git commit -m "line 3 added"
[master fb574fb] line 3 added
 1 file changed, 1 insertion(+)
$ git push origin master
Counting objects: 5, done.
Writing objects: 100% (3/3), 260 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To /home/vagrant/ourweb.git/
   fb79863..fb574fb  master -> master

作業者A -> 共有リポジトリ

  • 時同じくして、作業者Aがファイルを編集し、共有リポジトリにアップしたとします。
  • git pushすると、エラーが発生してしまいました。
$ vi index.html
$ cat index.html
line 1
line 2
line third
$ git add .
$ git commit -m "line third added"
[master 81f3344] line third added
 1 file changed, 1 insertion(+)
$ git push origin master
To /home/vagrant/ourweb.git
 ! [rejected]        master -> master (fetch first)
error: failed to push some refs to '/home/vagrant/ourweb.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
  • こういう場合は、一度git pullして、Bさんの内容をAさんのリポジトリに反映してあげます。
$ git pull origin master
remote: Counting objects: 5, done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
From /home/vagrant/ourweb
 * branch            master     -> FETCH_HEAD
   fb79863..fb574fb  master     -> origin/master
Auto-merging index.html
CONFLICT (content): Merge conflict in index.html
Automatic merge failed; fix conflicts and then commit the result.
  • そうすると、衝突(コンフリクト)が発生するので、解消してあげます。
  • ちなみに、git commit-aオプションをつけることで、git addコマンドを省略することができます。
$ vi index.html
$ cat index.html
line 1
line 2
line third
$ git commit -am "conflict fixed"
[master b35cdb9] conflict fixed
$ git push origin master
Counting objects: 8, done.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (4/4), 392 bytes | 0 bytes/s, done.
Total 4 (delta 1), reused 0 (delta 0)
To /home/vagrant/ourweb.git
   fb574fb..b35cdb9  master -> master

まとめ

内容盛りだくさんだった。。。
とにかく使って覚えるしかなさそうだ。