プログラミングしたり。

HTML/CSS/JavaScript/PHPを中心にWebサイト作ったり。Webサービス作ったり。

Gitコマンドまとめ

Gitはファイルを作成したり、変更したりしたときの履歴をバージョン管理できます。
以下、3つのエリアを用いて管理していきます。 1.作業ディレクトリ
2.ステージングエリア
3.リポジトリ

インストールする

$ yum install git

使う前の設定

使用始める前に、user名とemailの設定する必要があるので、
下記コマンドから登録します。

git config --global user.name "user名"
git config --global user.email "mail adress"
git config --global color.ui true

上記設定内容は下記のコマンドで確認できます。

git config -l

じゃ、使い始めよう!

gitを使用する作業ディレクトリを決める。

この作業ディレクトリ内に作ったディレクトリやファイルが管理対象となります。

//作業ディレクトリdirに移動
$ cd dir/
//一応、移動がちゃんとできているか現在のディレクトリ位置を確認
$ pwd
/home/vagrant/dir
//gitを使用する
git init

ステージングエリアにアップする(git add)

作業ディレクトリにindex.htmlを作成したとします。 これをステージングエリアにアップしてみます。

//index.htmlをアップする
$ git add index.html

//今のディレクトリとその配下にあるファイルを全部アップする
$ git add . 

リポジトリにアップする(git commit)

次に、リポジトリにアップしてみよう

//実行後にメッセージを入力することになるので、変更点等を簡潔に入力します。
$ git commit

//メッセージが簡単に書いてcommitする
$ git commit -m "index.html modified"

アップした履歴を見る(git log)

今、ステージングエリアとリポジトリにファイルをアップしました。
その履歴を見てみます。

$ git log

//さらにコンパクトにlogを見る
$ git log --oneline

//どの場所が変更されたのか見る
$ git log -p

//どのファイルが何カ所変更されたか見る
$ git log -stat

現在の状態を確認する(git status)

ファイルを作成したり、修正したりして、
今、index.htmlはステージングエリアにアップしてたっけ?
リポジトリにアップしたっけ?とわからなくなることがあります。
そんなときは、現在の状態を確認するコマンドを入力します。

$ git status

# On branch master
# Changed but not updated: //まだステージングにもリポジトリにもアップされてない。
#   (use "git add <file>..." to update what will be committed) 
#   (use "git checkout -- <file>..." to discard changes in working directory) 
#
#  modified:   index.html //index.htmlが変更されていることがわかる
#

差分を確認する(git diff)

ファイルの差分を確認します。

//ステージに上がっていないファイルの変更点を確認
$ git diff

//ステージに上がっているファイルが次のcommitでどこが変更されるか確認
$ git diff --cached

ファイルを操作します(削除や移動など)

//移動
$ git mv index.html
//削除
$ git rm index.html

管理下に含めたくないファイル

git管理下となった作業ディレクトリでも管理したくないファイルがあると言ったときは「.gitignore」を使用します。

.gitignoreを置いたディレクトリ及び配下のディレクトリが適用対象になります。

$ vi .gitignore


//ログファイルは管理しない記述。管理したくないものを記述する
*.log

直前のコミットを微修正する

commitしたあとに、微々たる修正をしたい。つまり、git logで履歴を載せて管理するほどの修正ではない…というときに使うコマンド。

//直前のコミットを変更(commitログには表示しない。ちょっとした変更)
$ git commit --amend

過去のバージョンから戻る

resetとrevertがあります。
resetはなかったことにする。revertは巻き戻すというイメージ。
resetは履歴に残らないが、revertは履歴に残ります。

// git addしたあとに一つ前の状態に戻る
$ git reset --hard HEAD

// git addしたあとに2つ前の状態に戻る
$ git reset --hard HEAD^
$ git reset --hard [commitの番号指定でも良い]

//戻ったのを取り消す(ORIG_HEADに1つ前の状態が保存される)
$ git reset --hard ORIG_HEAD

git reset ブランチのポインタを後方へ移動。履歴の上書き

git revert HEAD

ブランチ(分岐)を使う

初めはmasterしかない。
ちょっとコードを変えて試してみたいときに、大元のmasterブランチで作業するのではなく、もう一つブランチを作成して、そちらでコードを修正する。良い感じのコードが書ければ、あとからmasterブランチに統合するといった使い方をします。

$ git branch
* master

// hogeブランチを作成する
git branch hoge
  hoge
* master

//今いるブランチは*が付いている方
//ブランチを移動する
$ git checkout hoge
$ git branch
* hoge
master

//ブランチの作成と作成したブランチに移動を一気にやる
$ git checkout -b hoge

ブランチをマージする

先に記述したように、分岐したブランチで良い感じのコードが書けたので、masterに統合するコマンド。

$ git merge hoge

//mergeしたあとに、作成したブランチいらないから削除する
$ git branch -d hoge

マージの衝突を解決する

衝突とは、ブランチ1でindex.htmlを編集し、commitしたあと、
masterブランチでもindex.htmlを編集し、commit。
そのあと、ブランチ1をマージしようとした。というケースです。 異なるブランチで同じファイルが修正されているため、どちらのコードを正とするのか決める必要があります。

//衝突が起きたファイルをviコマンドで開き、必要なコードだけを残し、保存する
$ vi index.html

タグを使う

タグと言うものをつけて、履歴を管理することもできます。
git logで見たときにcommit d96bc437694….というidでも色々操作できるがわかりにくいですよね。

commit d96bc43769409df0aa9b46614fe2a0a23b9ca5dc //これわかりにくい
Author: user名 <mail address>
Date:   Sat Feb 28 12:20:13 2015 +0000

    test commit


//commitしたあとに、v1.0というtagをつける
$ git tag v1.0

//tagの一覧を見る
$ git tag
v1.0

//tagで変更履歴を見ることができる
$ git show v1.0

//直近のcommitじゃないものにタグをつける
$ git tag v0.9 [commit id]

//tagを削除
$ git tag -d v0.9

エイリアスを使う(gitコマンドを短縮して使う)

git checkoutと入力するのは長いので、git coとする、みたいなことができます。

$ git config --global alias.[短縮名] [コマンド]
$ git config --global alias.co checkout

//作ったエイリアス一覧を見るには
$ git config -l

共有リポジトリを使って作業する

共有リポジトリsharedrepo.gitというものがあり、そこに複数人の作業者がファイルをアップしていきます。 AさんはAdirディレクトリを使用
BさんはBdirディレクトリを使用しているものとします。

//共有リポジトリを作成
mkdir sharedrepo.git
cd sharedrepo.git/
git init --bare  //ファイルのコミットはしない


//Aさんの作業はまずは別(共有)のリポジトリを登録すること
$ git remote add origin ~/sharedrepo.git

//何がリモートで接続されているかは下記コマンドで確認
$ git config -l

共有リポジトリにpush

//originにmasterの内容をpushする
$ git push origin master

Bさんが共有リポジトリの中身をBdirディレクトリに持っていきます。

$ git clone ~/sharedrepo.git/ Bdir

Bさんがファイルを変更して共有リポジトリにアップしたあとに、
Aさんが変更されたファイルを自分の作業エリアに引っ張ってくる。

$ git pull origin master

その他便利なコマンド

便利なマージ方法(git rebase)

ブランチを使用して修正をしていった際、最終的にマージして統合することになるかと思いますが、rebaseを使用すると履歴を一本化できる。
ブランチで分岐させて開発したのではなく、最初からmasterでだけ開発していたかのような履歴の残り方になるイメージ。

mergeの場合はあくまで分岐して統合された状態。

//hogeの内容をmasterに移動させるため、まずはhogeにチェックアウト
$ git checkout hoge
*hoge
 master

//masterにrebaseする
$git rebase master

相対リファレンス

ブランチを使用して作業をしていると、前のコミットに戻りたいという場合、あるコミットからの相対位置で指定することができます。

・一つずつ上に移動するカレット
・複数回上に移動する~num
HEADは現在使用しているブランチの先頭。このHEADを移動することで使用するブランチを変更します。

masterブランチをHEADより親3世代前へ移動します

git branch -f master HEAD~3

参考になる学習サイト

まだまだたくさんコマンドがあるので、参考になるサイトを下記に列挙します!

git入門
LearnGitBranching
サルでもわかるGit入門

git, tool

« Php Security octopressを使う »