git(ギット)とは?

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

gitインストール

# 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

バージョン管理の流れ

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

gitの設定

  • 初期設定(global)
$ git config --global user.name "Yuji Shimojo"
$ git config --global user.email "yjshimojo@gmail.com"
$ git config --global color.ui true
  • 初期設定(local)
$ git config --local user.name "Yuji Shimojo"
$ git config --local user.email "yjshimojo@gmail.com"
$ git config --local 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

リポジトリへのコミット

  • 作業用ディレクトリ作成
$ 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

コミット履歴(ログ)の確認・オプション

$ 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(+)

状態確認

$ 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

差分確認

  • 作業ディレクトリ上のファイルの変更差分確認
$ 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でのファイル操作

  • 複数ファイルをステージングエリアへ追加
$ git add [filename1] [filename2] [filename3] ...
  • カレントディレクトリ配下のファイルを全てステージングエリアへ追加
$ git add .
  • ファイルの削除・移動 ※addやcommit済みのファイルはgitコマンドを使用
$ git rm index.html
$ git mv file1 file2

git管理からの除外設定

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

直前のコミットを変更

  • 画面遷移させずにコミットメッセージを追加
$ git commit -m "ライン2を追加"
[master 51e7ce3] ライン2を追加
 1 file changed, 1 insertion(+)
  • addとcommitを同時に実行する場合
$ git commit -am "ライン2を追加"
  • 直前のコミットを変更 ※変更のため新たにコミット履歴(コミットID)が追加されない
$ git commit --amend

過去のバージョンに戻る

  • 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つだけ保存

ブランチを活用

  • ブランチは分岐の意で別々のバージョンを並行して開発したい場合に利用
  • ブランチ一覧表示(*は現在使用中のブランチ)
$ git branch
  • ブランチ作成
$ git branch hoge
  • ブランチを切替え
$ git checkout hoge
Switched to branch 'hoge'

ブランチをマージ

$ 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).

マージの衝突を解決

  • ブランチ作成後に作成したブランチにチェックアウト
$ 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"

タグを利用

  • タグはコミット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コマンドにエイリアス(短縮名)を付与

  • エイリアス作成
  • 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
...

共有リポジトリを活用して共同作業

  • 共有リポジトリ: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(+)

共有時の衝突(コンフリクト)解決

  • 共有リポジトリ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
Last-modified: 2017-03-28 (火) 09:57:10 (2587d)