今更ながらGitを復習してみた

f:id:HTak:20160123141654p:plain

SIerの頃に勉強したけれど、結局もろもろの事情により実戦投入できず、
それから自分の中でもほったらかしになっていたので、改めて復習する。

やっぱり使ってないと結構忘れていることが多かった。

なお、環境はMacを利用おり、Gitのバージョンは「2.6.4」
Macだと色々便利なクライアントツールがあるのだけど、
今回は勉強も兼ねているので、すべてコマンドで実施した。


基本操作編

git init

リポジトリを新規作成する。 ちなみにリポジトリの実態は「.git」という隠しディレクトリに存在する。

git status

リポジトリの状態を確認。変更やら新規追加が行なわれているかどうかを確認したい場合は、このコマンドを実行する。

git log

ログを出力する。末尾にgraphを付与することにより、コミットの親子関係を視覚化することが可能。

git graph

ブランチの状況を確認する。親子関係なども確認することが可能。

git add <FILENAME>

ファイル名に指定されたファイルをstageする。
なお、ファイル名ではなく「.」ドットを指定することにより、現在いるディレクトリの中のファイル全てをstageすることが可能。

git commit

stageされているファイルをコミットする。

Gitとはあんまり関係ないけどviについて

MacにGitをインストールすると、コミット時にデフォルトでviが起動する。コミットするためにはviでコメントを書いて保存しなければならないのだけど、通常のメモ帳とは勝手がだいぶ違うので、最低限これだけ知っていればコミットメッセージを書ける内容を備忘録的に書いておく。

コマンド  効果
a   INSERTモードへ移行
esc  INSERTモードから抜ける
:wq  保存して終了する

git checkout -- <FILENAME>

ファイル名に指定されたファイルの変更をなかったことにする(変更を元に戻す)。

git rm <FILENAME>

ファイル名に指定されたファイルを削除する。git管理下に置かれているファイルを直接削除(Finderとかから)すると、ちょっとおかしなことになるので、このコマンドを利用して削除する。
このコマンドを実行すると、ファイルの削除と削除操作のstageを一緒にやってくれる。

git mv <OLD-FILENAME> <NEW-FILENAME>

古いファイル名に指定されたファイル名称を、新しいファイル名に変更して、stageする。Finderなどでファイル名を変更した場合は、addrmしてやらないといけないが、このコマンドを利用すると、すべてを一気にやってくれる。
なお、ファイル名称の変更だけではなく、ファイルの移動時にもこのコマンドは同様に利用出来る。


ブランチへの操作編

git branch

現時点で存在するブランチを一覧表示してくれる。

git branch <BRANCH-NAME>

ブランチ名に指定されたブランチを作成する。

git branch -d <BRANCH-NAME>

ブランチ名に指定されたブランチを削除する。

git checkout <BRANCH-NAME>

ブランチ名に指定されたブランチを選択する。 TFSのチェックアウトとは別物。

git checkout -b <BRANCH-NAME>

-bのオプションを付けることにより、ブランチを作成し選択することが可能。(ブランチ切って、選択して、の流れが一発で可能)

git reset --hard <id>

idに指定された位置までロールバックする。

git checkout -b <新規に作成するブランチ名称> <分岐元>

checkoutは「ブランチを切ってチェックアウト」というコマンドだが、 <分岐元>と指定することにより、明示的にどこからブランチを切るか指定することができる。 (指定しなかった場合は選択しているブランチからブランチが切られる。)

HEADについて

選択中のブランチを示す。

*   a9b1735  (HEAD -> master) 2016-01-20 博之  

このように表示される

git merge <BRANCH-NAME>

ブランチ名に指定されたブランチをマージする。 なお、HEADされているブランチに対して、指定されたブランチをマージする。なお、マージのやり方はFastForwardで行われる。 FastForwardでやりたくない場合は…

git merge --no-ff hotfix

--no-ffのオプションを付けることにより、FastForwardを行わずにマージすることが可能。


リモートリポジトリやクローン関連

git clone <複製元> <複製先>

複製元のリポジトリを複製先のパスに複製する。
なお、--bareオプションを付けることにより、作業ディレクトリなしでリポジトリを複製することが可能。ちなみにbareリポジトリの最後には「.git」という文言を付けることが慣習となっている。

git remote

リモートリポジトリとして登録されているリポジトリを表示する。

git branch <手元のブランチの名前> <追跡したいリモートブランチの名前>

手元にリモートブランチを追跡するブランチを作成する。

git remote add <リモートリポジトリの名前> <リモートリポジトリの場所>

リモートリポジトリを設定する。

git fetch <リモートリポジトリの名前>

リモートリポジトリの中身を手元に持ってくる。

git branch --set-upstream-to=<追跡対象のリモートブランチ> <手元のブランチ>

手元のブランチを追跡したいリモートブランチの内容を追跡するようにする。

git push

手元のリポジトリの変更を共有リポジトリに公開する。

git push <リモートリポジトリの名前> <手元のブランチ>:<リモートに作りたいブランチ>

手元のブランチをベースにリモートリポジトリに新しくブランチを作成する。

git pull

fetchしてマージまで一度に行ってくれるコマンド。
一見便利そうだけど、マージも行うのでコンフリクトが起きる可能性があることに注意する。


ダークサイド系

git rebase <BRANCH-NAME>

指定されたブランチの内容で、チェックアウトしているブランチをリベースする。 要するに、チェックアウトしているブランチに対して、指定されたブランチの変更履歴を適用する。これにより、このブランチは履歴のどの時点から分岐したのか?という過去を改変することができる。

git commit --amend

ひとつ前のコミットに対して、上書きの形でコミットする。 これにより、直前のコミットという過去を改変することができる。
やらかしちゃった場合とか、コミットしなきゃいけないファイルが漏れてた時とかに便利そう。


その他

ターミナルからGitを利用する時に便利な設定など。

git config --global alias.graph "log --graph --date-order --all --pretty=format:'%h %Cred%d %Cgreen%ad %Cblue%cn %Creset%s' --date=short"

グラフをキレイ目に表示してくれる。

git config --global color.ui true

ログ出力に色がつく。