はじめに
- 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
まとめ
内容盛りだくさんだった。。。
とにかく使って覚えるしかなさそうだ。