#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 ...