#contents

** git(ギット)とは? [#k7cf0725]

- バージョン管理システム
- 公式サイト: http://git-scm.com/
- 必要となる知識: Linux, vim
- 動作環境: Linuxローカル環境(CentOS 5.11 - 32bit)

** gitインストール [#n54a3bde]

 # yum -y update
 # yum -y install git
 Loaded plugins: fastestmirror
 Loading mirror speeds from cached hostfile
  * base: ftp.iij.ad.jp
  * extras: ftp.iij.ad.jp
  * updates: ftp.iij.ad.jp
 Setting up Install Process
 No package git available.
 Nothing to do

- yum install git失敗のためEPELリポジトリをインストール

 # wget http://ftp-srv2.kddilabs.jp/Linux/distributions/fedora/epel/5/i386/epel-release-5-4.noarch.rpm 
 # rpm -ivh epel-release-5-4.noarch.rpm
 # vi /etc/yum.repos.d/epel.repo
 --------------------
    [epel]
    ...
    enabled=1
    priority=1
    ...
 --------------------

 # yum -y install git
 # git --version
 git version 1.8.2.1

** バージョン管理の流れ [#ofbb42e8]

+ 作業ディレクトリ
+ ステージングエリア(インデックス)
+ リポジトリ(ローカル、リモート)

** gitの設定 [#i8e137e1]

- 必要&便利な設定

 $ git config --global user.name "Yuji Shimojo"
 $ git config --global user.email "yjshimojo@gmail.com"
 $ git config --global color.ui true

- 設定を確認

 $ git config -l
 user.name=Yuji Shimojo
 user.email=yjshimojo@gmail.com
 color.ui=true

- gitコマンドのヘルプ

 $ git config --help
 $ git help config

** リポジトリへのコミット [#hf6393d7]

- 作業用ディレクトリ作成

 $ mkdir myweb
 $ cd myweb/

- mywebディレクトリをgitリポジトリとして作成

 $ git init
 Initialized empty Git repository in /home/yuji/myweb/.git/

- ファイルを追加

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

- 作業ディレクトリ=>ステージングエリアへファイルをアップ

 $ git add index.html

- ステージングエリア=>リポジトリへファイルをアップ

 $ git commit
 --------------------
     initial commit // コミットメッセージ(任意)
 --------------------
 [master (root-commit) 12662e4] initial commit
  1 file changed, 1 insertion(+)
  create mode 100644 index.html

** コミット履歴(ログ)の確認・オプション [#r80d1635]

 $ git log
 commit 12662e4f226f299708ddb5c89274739fd355f9b8 // 一意のコミットID
 Author: Yuji Shimojo <yjshimojo@gmail.com>
 Date:   Sun Sep 20 03:03:31 2015 +0900
     initial commit          // コミットメッセージ

- 1行でログを表示

 $ git log --oneline
 12662e4 initial commit

- 変更された場所を表示

 $ git log -p
 diff --git a/index.html b/index.html
 new file mode 100644
 index 0000000..89b24ec
 --- /dev/null
 +++ b/index.html
 @@ -0,0 +1 @@
 +line 1

- 変更されたファイルを表示

 $ git log --stat
 commit 12662e4f226f299708ddb5c89274739fd355f9b8
 Author: Yuji Shimojo <yjshimojo@gmail.com>
 Date:   Sun Sep 20 03:03:31 2015 +0900
 
     initial commit
 
  index.html | 1 +
  1 file changed, 1 insertion(+)

** 状態確認 [#t762b327]

 $ vi 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)    // git addでステージングに反映可能
 #   (use "git checkout -- <file>..." to discard changes in working directory)    // git checkoutで変更前の状態に戻すことが可能
 #
 #	modified:   index.html
 #
 no changes added to commit (use "git add" and/or "git commit -a")

- 変更前の状態に戻す

 $ git checkout -- index.html
 $ cat index.html
 line 1

** 差分確認 [#oa8047aa]

- 作業ディレクトリ上のファイルの変更差分確認

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

 $ 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
 diff --git a/index.html b/index.html
 index 89b24ec..7bba8c8 100644
 --- a/index.html
 +++ b/index.html
 @@ -1 +1,2 @@
  line 1
 +line 2

** gitでのファイル操作 [#ea512f9e]

- 複数ファイルをステージングエリアへ追加

 $ git add [filename1] [filename2] [filename3] ...

- カレントディレクトリ配下のファイルを全てステージングエリアへ追加

 $ git add .

- ファイルの削除・移動 ※addやcommit済みのファイルはgitコマンドを使用

 $ git rm index.html
 $ git mv file1 file2

** git管理からの除外設定 [#j5d8d38d]

 $ ls
 error.log  index.html

- .gitignoreファイルを作成しgit管理から除外するファイルを指定 ※当該ファイルが配置されたカレントディレクトリ&配下に適用

 $ vi .giignore
 --------------------
   *.log
 --------------------

** 直前のコミットを変更 [#qcd0ad2b]

- 画面遷移させずにコミットメッセージを追加

 $ git commit -m "ライン2を追加"
 [master 51e7ce3] ライン2を追加
  1 file changed, 1 insertion(+)

- addとcommitを同時に実行する場合

 $ git commit -am "ライン2を追加"

- 直前のコミットを変更 ※変更のため新たにコミット履歴(コミットID)が追加されない

 $ git commit --amend

** 過去のバージョンに戻る [#fbe88d2c]

- git add済み後にステージングエリア・作業ディレクトリ共に直前のバージョンに戻す

 $ git reset --hard HEAD

- 2つ前のバージョンに戻す

 $ git reset --hard HEAD^

- コミットIDを指定して過去バージョンに戻す ※IDは完全一致でなくても一意に特定可能な桁数であればOK(最低7桁)

 $ git reset --hard 12662e4f226f

- git resetで過去バージョンに一旦戻したがその操作をやり直したい(リドゥしたい)場合

 $ git reset --hard ORIG_HEAD

- ORIG_HEADには前回取り消されたHEADの情報が1つだけ保存

** ブランチを活用 [#j550fa6a]

- ブランチは分岐の意で別々のバージョンを並行して開発したい場合に利用
- ブランチ一覧表示(*は現在使用中のブランチ)

 $ git branch

- ブランチ作成

 $ git branch hoge

- ブランチを切替え

 $ git checkout hoge
 Switched to branch 'hoge'

** ブランチをマージ [#f5bf2191]

 $ git branch
   hoge
 * master

- masterブランチにhogeブランチの変更内容をマージ

 $ git merge hoge
 Updating 556ff5f..054edfd
 Fast-forward
  myscript.js | 1 +
  1 file changed, 1 insertion(+)
  create mode 100644 myscript.js

- ブランチを削除

 $ git branch -d hoge
 Deleted branch hoge (was 054edfd).

** マージの衝突を解決 [#fc857c1b]

- ブランチ作成後に作成したブランチにチェックアウト

 $ git checkout -b hogehoge
 Switched to a new branch 'hogehoge'

- hogehogeブランチとmasterブランチ間に衝突(conflict)を発生させる

 $ vi index.html 
 --------------------
   line first
 --------------------
 $ git add .
 $ git commit -m "not 1 but first"
 $ checkout master
 $ vi index.html 
 --------------------
   line 1st
 --------------------
 $ git add .
 $ git commit -m "not 1 but 1st"
 $ git merge hogehoge
 Auto-merging index.html
 CONFLICT (content): Merge conflict in index.html
 Automatic merge failed; fix conflicts and then commit the result.
 $ 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")

- 衝突(コンフリクト)を解決

 $ vi index.html
 --------------------
     <<<<<<< HEAD
     line 1st
     =======
     line first
     >>>>>>> hogehoge
 --------------------

- HEADの「line 1st」を採用。上記を下記に変更。

 --------------------
     line 1st
 --------------------
 $ git add .
 $ git commit -m "conflict fixed"

** タグを利用 [#r0f59108]

- タグはコミットIDに分かりやすい名前を付ける機能
- 直近のコミットにタグを追加

 $ git tag v1.0
 $ git tag
 v1.0

- タグの内容を確認

 $ git show v1.0
 commit 1c720200dff693a0f3a867e33e5cbe7df89be7cc
 Merge: 934787b 0a79932
 Author: Yuji Shimojo <yjshimojo@gmail.com>
 Date:   Sun Sep 20 07:21:50 2015 +0900
 
     conflic fixed
 
 diff --cc index.html
 index 4457139,cfbee75..12ead6b
 --- a/index.html
 +++ b/index.html
 @@@ -1,2 -1,2 +1,1 @@@
  -line first
  +line 1st

- コミットIDを指定してタグを追加

 $ git tag v0.9 [commit id]

- タグの削除

 $ git tag -d v0.9

** gitコマンドにエイリアス(短縮名)を付与 [#l9fe8312]

- エイリアス作成
- co=>checkout, st=>status, br=>branch, ci=>commit

 $ 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の設定内容を確認

 $ git config -l
 ...
 alias.co=checkout
 alias.st=status
 alias.br=branch
 alias.ci=commit
 ...

** 共有リポジトリを活用して共同作業 [#b4e62e3a]

- 共有リポジトリ:ourweb.git ※末尾に.gitを付けるのは通例
- Aさん:mywebリポジトリを管理
- Bさん:myweb2リポジトリを管理

 $ mkdir ourweb.git
 $ cd ourweb.git/
 $ git init --bare    // 共有リポジトリ作成の際は「bare」オプションを付ける

- 外部リポジトリ(リモートリポジトリ)の登録 ※登録名はorigin(通例)

 $ git remote add origin ~/ourweb.git
 $ git config -l
 ...
 remote.origin.url=/home/yuji/ourweb.git
 remote.origin.fetch=+refs/heads/*:refs/remotes/origin/*

- 外部リポジトリの登録削除

 $ git remote rm origin

- 共有リポジトリにローカルリポジトリのmasterブランチの内容を反映

 $ git push origin master
 Counting objects: 20, done.
 Compressing objects: 100% (11/11), done.
 Writing objects: 100% (20/20), 1.38 KiB, done.
 Total 20 (delta 5), reused 0 (delta 0)
 To /home/yuji/ourweb.git
  * [new branch]      master -> master

- Bさん側でourweb.gitと同じ中身のmyweb2リポジトリを作成

 $ git clone ~/ourweb.git/ myweb2
 Cloning into 'myweb2'...
 done.

- index.htmlに修正を加えてコミット&共有リポジトリにPUSH

 $ vi index.html
 $ git add .
 $ git commit -m "line 2 added"
 $ git push origin master

- Aさん側で共有リポジトリの変更内容(Bさんの修正内容)をmywebリポジトリに反映

 $ git pull origin master
 remote: Counting objects: 5, done.
 remote: Compressing objects: 100% (2/2), done.
 remote: Total 3 (delta 1), reused 0 (delta 0)
 Unpacking objects: 100% (3/3), done.
 From /home/yuji/ourweb
  * branch            master     -> FETCH_HEAD
 Updating 1c72020..2a78028
 Fast-forward
  index.html | 1 +
  1 file changed, 1 insertion(+)

** 共有時の衝突(コンフリクト)解決 [#v8c32c0a]

- 共有リポジトリPUSH時にコンフリクト発生

 $ git commit -am "line 3 added"
 [master dbc4d95] line 3 added
  1 file changed, 1 insertion(+)
 $ git push origin master
 To /home/yuji/ourweb.git
  ! [rejected]        master -> master (fetch first)
 error: failed to push some refs to '/home/yuji/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 merge the remote changes (e.g.,
 hint: 'git pull') before pushing again.
 hint: See the 'Note about fast-forwards' in 'git push --help' for details.

- 一旦git pull実行しコンフリクトを解決

 $ git pull origin master
 $ vi index.html
 --------------------
     <<<<<<< HEAD
     line 3
     =======
     line third
     >>>>>>> 5229c27320cbb89e55945b7321c731526ef72d93
 --------------------

- 下記に修正。

 --------------------
     line 3
 --------------------

 $ git commit -am "conflic fixed"
 $ git log
 commit c019c365bcb943295f80ff61c1cbe02855b7af44
 Merge: dbc4d95 5229c27
 Author: Yuji Shimojo <yjshimojo@gmail.com>
 Date:   Sun Sep 20 08:17:02 2015 +0900
 
     conflic fixed
 ...



トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS