はじめに
- Gitをドットインストールで勉強してきました。
- エンジニアのはしくれだし、Gitでバージョン管理やってみたい。
目次
- はじめに
- 目次
- #02 バージョン管理の流れを理解しよう
- #03 gitの設定をしよう
- #04 初めてのコミットをしてみよう
- #05 gitのログを見てみよう
- #06 現在の状態を把握しよう
- #07 差分を確認してみよう
- #08 gitでのファイル操作について
- #09 git管理に含めない設定について
- #10 直前のコミットを変更する
- #11 過去のバージョンに戻ってみよう (1)
- #12 過去のバージョンに戻ってみよう (2)
- #13 ブランチを使ってみよう
- #14 ブランチをマージしてみよう
- #15 マージの衝突を解決してみよう (1)
- #16 マージの衝突を解決してみよう (2)
- #17 タグを使ってみよう
- #18 エイリアスを使ってみよう
- #19 はじめての共同作業
- #20 共有リポジトリにpushしてみよう
- #21 リポジトリの内容を共有してみよう
- #22 共有時のトラブルを解決する
- まとめ
#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 add、git 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 add、git 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では、共有リポジトリを使って、複数名でファイルを管理することができます。
共有リポジトリの作成
- 通常は、インターネット上の共有リポジトリか、オンプレのサーバを共有リポジトリとして使いますが、今回はローカルに共有リポジトリを構築して見ます。
- 共有リポジトリは、通例
.gitをつけることになっているため、ourweb.gitというディレクトリを作成します。 - そのディレクトリを、共有リポジトリにするために、
--bareオプションをつけて、git initコマンドを実行します。
~$ 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する
$ 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
~$ 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 -> 共有リポジトリ
$ 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
$ 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
まとめ
内容盛りだくさんだった。。。
とにかく使って覚えるしかなさそうだ。