Gitによるバージョン管理
Linus Benedict Torvaldsの開発した分散型バージョン管理システムGitについて,基礎的な使用方法を記したページです.
目次
設定
Gitをインストールしたら,サブコマンドconfig
によりユーザー名と連絡先を登録します.
ここではglobal
オプションにより,デフォルト値を設定しています.
git config --global user.name "<name>" |
config
サブコマンドで登録した各種設定はlist
オプションで確認できます.
git config --list |
リポジトリの作成
ディレクトリを新規にリポジトリ化するには,
git init <dir> |
とします.
対象となるディレクトリ名を省略した場合,カレントディレクトリがリポジトリ化されます.
既存のレポジトリを複製して利用するには,
git clone <repo> |
とします.
変更履歴の作成
変更履歴をリポジトリに登録するには,「ステージング」と「コミット」という2つの段階を踏みます.
「ステージング」はコミットするものを整理・確認する段階です.
「コミット」は変更履歴を記録に残す段階です.
ステージング
ファイルをステージングするには,
git add <file> |
とします.
引数をディレクトリにすれば,再帰的にディレクトリをステージングします.
カレントディレクトリのファイル全てをステージングするなら,git add .
です.
パスワードや機密情報などステージングしたくないファイルがある場合は,予めレポジトリに.gitignore
ファイルを設置して列挙しておきます.
.gitignore
は設置した以下の階層で有効になります.
.gitignore
ではワイルドカードも使えます.
誤ってステージングしたファイルがある場合は,
git reset <file> |
とすることで,ファイルをそのままにステージングを取り消すことができます.
ファイルを指定しなければステージング自体を取り消します.
ファイルの削除や移動・リネームをステージングするためにgit rm <file>
やgit mv <from> <to>
が用意されています.
コミット
ステージングされたファイル一式は,
git commit -m "<message>" |
によりコミットします.
ここではm
オプションを付けて修正に関するメッセージを文章で残すようにしています.(このオプションを付けない場合,テキストエディタが立ち上がり,メッセージの登録を促されます.)
万一コミットし忘れたファイルがあったり,微修正が発生したときには,git commit --amend
とすれば,バージョンを増加させることなく直近のコミットを修正できます.
特に,うっかり誤ったファイルを含めてしまった場合は,不要なファイルを取り除いたり差し替えた状態を新たにステージングした上で,git commit --amend --no-edit
して直前のコミットを取り消します.
ファイルを以前の状態に戻す
変更履歴の表示
ファイルを以前コミットしたときの状態に戻すために,まず,git log
により変更履歴からコミットのIDを調べます.
このコマンドには便利なオプションが用意されています.
直近n件のコミット履歴を簡潔に1行ずつで表示するには,
git log --oneline -n <int> |
とします.
期間を制限する場合は,
git log --since="2016/1/1" --until="2016/12/31" |
のようにします.
コミット時のメッセージは
git log --grep="<message>" |
で検索できます.
なお,ファイルの編集者やコミットした者はauthor
オプションやcommitter
オプションで指定できます.
コミットの履歴はgit log
で追いますが,git reflog
でHEAD
の履歴,git show
でファイルの内容,git blame
でファイルの修正者と修正日時を追跡できます.
リセット
Gitでは,過去にコミットした地点からいつでもやり直せます.
指定したコミットのバージョンへ戻すには,
git reset --hard <id> |
とします.
特に,--hard HEAD
と書いた場合,直前のコミットへ戻します.
--hard
オプションではHEAD
で現在いる最終コミット,HEAD^
で1世代前の(,第1の)親(なお,HEAD^2
で1世代前の第2の親),HEAD^^
で2世代前のコミットに戻します.(キャレット^
でなくティルダ~
だと1番目の親を遡っていきます.)
なお,reset
の効果は取り消しです.
新たに戻った状態と同じものへ歴史を進めるrevert
もあります.
すなわち,reset --hard <id>
に代えてrevert <id>
とすると,戻った地点以降のコミットを残して戻ります.
特定のファイルを指定したコミットのバージョンへ戻すには,
git restore <id> <file> |
とします.
履歴を確認する
前回コミットから現在までに編集されたファイルの名前
最後のコミットから現在までに編集されたファイルの名前を調べるには
git status |
とします.(s
オプションを付けると,簡潔に表示します.)
前回コミットからステージングまでの差分
差分のある箇所は,ステージング前なら
git diff <事前> <事後> |
で調べることができます.
ステージングからコミットまでの差分
ステージング後でコミット前のものについては
git diff --cached <事前> <事後> |
で調べることができます.
コミットの履歴
HEAD
の歴史は
git reflog |
で確認できます.
開発を枝分かれさせる
ブランチ
開発を枝分かれさせることで容易に新しいアイデアを試すことができます.
開発の枝分かれを「ブランチ」と言います.
ブランチを作るには
git branch <branch> |
とします.
引数なしなら,存在するブランチを一覧します.
ブランチ間の移動は
git switch <branch> |
です.
git swich -c <branch>
すると,ブランチを新規に作成して,そのブランチへ移動できます.
マージ
あるブランチで開発が進んだら,開発したものを別のブランチへ併合することができます.
これを「マージ」といい,現在のブランチへマージするには,
git merge <branch> |
と書きます.
マージによってファイルの「コンフリクト」(競合)が起こるようであれば,ファイルを開いて解決し,その後ステージング→コミットという通常の手続きを踏みます.
コンフリクト多数などの理由によりマージを中断したい場合は,
git merge --abort |
としてください.
マージ後,不要になったブランチは
git branch -d <branch> |
で切り落とすことができます.
merge
で反映しきっていないブランチを切り落とすには,-d
を-D
にします.
別のブランチから特定のコミットだけ採り入れることも
git cherry-pick <id> |
によって可能です.
コンフリクトの対処はmerge
同様です.
リモートで使う
リモートの登録・解除
リモートのリポジトリをまだ登録していないなら,
git remote add <abbr> <url> |
によって登録します.
GitHubを利用するのであれば,URLはgit@github.com:<name>/<repo>.git
のような形です.
省略名をリネームするには
git remote rename <old_abbr> <new_abbr> |
とします.
登録をローカルにて解除するには
git remote rm <abbr> |
とします.
アップロード・ダウンロード
リモートのリポジトリにアップロードすることを「プッシュ」といいます.
git push <remote> <branch> |
git clone
してきた場合にはリモートにorigin
が自動設定されるので,master
ブランチをアップロードする場合は
git push origin master |
のようになります.
main
ブランチならgit push origin main
です.
プッシュに競合が生じる場合は対応が必要です.
作業ディレクトリに最新のコミットを複製するには,
git fetch <remote> |
とします.
複製からマージまですることを「プル」といい,
git pull <remote> |
とします.
タグを付ける
例えば「v2.0.3」のようなタグを付けるには,
git tag <tag> <id> |
とします.
コミットIDを省略したら,最後のコミットに対するタグとなります.
反対に,タグを消去するには
git tag -d <tag> |
とします.
タグの一覧は,
git tag |
で確認できます.
エイリアスを作る
エイリアスは次のように作成します.
git config --global alias.<alias> '<subcmd>' |
サブコマンドに対して特にオプションを付けない場合はシングルクオーテーションを省略して構いません.
作成したエイリアスは
git <alias> |
の形で使用できます.
参考文献
Gitの解説書です.
Gitのサイトは各国語版でこの書籍の電子版を無償提供しており,日本語版もあります.
- Scott Chacon and Ben Straub (2014) “Pro Git” 2nd ed. Apress.