git(ギット)はソフトウェアなどのバージョン管理をするツールである。 バイナリファイル以外は、ソフトウェアに限らず有効(差分とか見れる)に使える。
開発中のソースコードの版(バージョン)を蓄えているものをリポジトリという。コミット(保存する操作)された版が全て記録されている。 gitでは、版管理の対象はプログラムソースコードに限らず、ファイルであれば何でも良いが、 ファイルサイズが大きいものは動作が重くなるためやめたほうがよい。
通常のディレクトリのように、開発中のソースコードを置いてあるディレクトリのことを作業ディレクトリという。 これをgitで版管理している場合、この作業ディレクトリには ".git"というディレクトリがあり(リポジトリの本体)、 版管理に関する情報や全ての版が保存されている。
作業ディレクトリ内のファイルは、gitの版管理を意識せずに普通に修正等して構わない。
ログインしてシェルのプロンプトが出ており、カレントディレクトリが、版管理されている作業ディレクトリであるとする。 ここにあるリポジトリのことをローカルリポジトリと呼ぶ(単にリポジトリとも呼ばれる)。
開発作業はすべてローカルリポジトリがある作業ディレクトリで行います。
ローカルリポジトリは、他の"上流"にあるリポジトリと結びついている場合がある(その場合が大多数)。 この上流のリポジトリのことを、リモートリポジトリと呼ぶ(これも単にリポジトリとも呼ばれたりする)。 上流のリポジトリは、版のデータを受け渡しすることに使われる。
作業ディレクトリを持たないリポジトリ(".git"ディレクトリのみから成るようなもの)。
リモートリポジトリはふつうはベアリポジトリである。
上流のリポジトリのポンチ絵
作業ディレクトリ上で、 (1) ファイルを新規作成したり、修正する。 (2) そのファイルをステージに載せる(ステージに登録、ステージングなどとも言われる。ステージのことを インデックスやキャッシュとも言われる)。 (3) コミット(commit)する。これでステージングされたファイルがリポジトリに記録され、半永久的に保存される。
ローカルリポジトリの内容をリモートリポジトリに送る(pushと呼ぶ)ことで、自分の作業内容を他の人が利用できるようになる。 逆に他の人の作業内容をリモートリポジトリから取り込むこともできる(pullと呼ぶ)。 自分ひとりだけでリモートリポジトリと複数のローカルリポジトリを開発に利用することもできる。
作業ディレクトリにあるファイルの状態のポンチ絵
以下では、ファイル名、ディレクトリ名、注釈などはすべて英語とする(トラブル回避のため日本語の使用を避ける)。
$ git config --global user.name "名前" $ git config --global user.email "メールアドレス" $ git config --global core.editor emacs $ git config --global push.default simple
版管理したい作業ディレクトリに移動して、初期化する(.gitディレクトリを作る)。作業ディレクトリは空でも、ファイルがあっても構わない。
$ cd 作業ディレクトリ $ git init
マシン Aにベアリポジトリを作って、マシン Bにローカルリポジトリを作って利用する場合
マシン Aで
$ mkdir ベアリポジトリのディレクトリ名.git
$ cd ベアリポジトリのディレクトリ名.git #(*)
$ git init --bare
マシン Bで
$ cd 作業ディレクトリ
$ git init
$ git remote add origin ベアリポジトリのURL
#URLは上の(*)を示す「ssh://xxx@yyy:/~/ベアリポジトリのディレクトリ名.git」などを指定
$ git push --set-upstream origin master
なお、ディレクトリが異なれば、マシン A, Bは同じPCであっても構わない。
$ git clone ベアリポジトリのURL 作業ディレクトリ名
$ git add ファイル #ファイル(ディレクトリも指定が可能)をステージングする。
#初めてaddされたファイルであれば、自動的にgitで版管理する追跡対象になる。
$ git commit -m "注釈" #ステージングされたファイルをローカルリポジトリにコミットする。
#注釈は英語で!
$ git push
$ git fetch #取り込むだけ $ git pull #取り込んで、作業ディレクトリのファイルにマージ(更新をファイルに適用)する
$ git checkout -b ブランチ名 #ブランチを作成し、作成したブランチに切り替える
$ git checkout ブランチ名 #既存のブランチに切り替える(未コミットなどがあればできない)
$ git checkout -b ブランチ名 #ブランチを作成し、作成したブランチに切り替える
$ git push --set-upstream origin ブランチ名
#リモートリポジトリoriginにブランチをpushする(ブランチが作成される)とともに、ローカルリポジトリのブランチが
#originに作成されたブランチを追跡するように設定する(--set-upstream)。
$ git checkout --track origin/ブランチ名
$ git fetch #リモートリポジトリの更新内容を読み込む $ git remote -v ; git branch -vv #リモートリポジトリを表示;ブランチを表示 $ git status #作業ディレクトリの状態を表示 $ git log -15 --oneline --decorate --graph --all #コミットログを表示, スクロールなどの操作はviとほぼ同じ $ gitk --all #コミットログを表示(GUIによる) $ git branch -a #すべてのブランチを表示 $ git tag #すべてのタグを表示
git tag tmp_hoge a5f38c9 #ローカルリポジトリでタグを付ける
git branch -d hogehoge #ローカルリポジトリにあるブランチhogehogeを削除 git branch -d -r origin/hogehoge #ローカルリポジトリにあるブランチorigin/hogehogeを削除 git push origin --delete hogehoge #リモートリポジトリのブランチhogehogeを削除
git fetch --prune #リモートで削除済みの、ローカルの追跡ブランチを消す(未確認)
git diff --cached #親コミットとステージの差分 git diff master_20190603 HEAD nameless_pot.c #master_20190603タグと親コミットとの差分をnameless_pot.cについて表示
git help rev-parse
git merge --no-commit --no-ff master #dry-run的なことがされるので確認後、マージをアボートか、コミットする #git merge --abort #git commit -m "merge branch master into hogehoge"
git ls-files -o --exclude-standard gitlsfiles.py #python3環境のみ(~okazaki/util/com内)
マシンkalmiaに作成中のプログラムがあるディレクトリ ~/pracがあるとする。
git config --global user.name 'john smith' #SPCが含まれるのでクォートした git config --global user.email smith@kalmia #適当でよい git config --global core.editor emacs git config --global push.default simple git config -l #設定内容の確認
cd ~/prac
git init
gitk --all & #以下のコマンド実行前後で、gitkのメニューからupdateして表示内容がどう変わるかを確認する(X11環境が必要)。
#また git status も実行し、表示内容がどう変わるかも確認する。
git add *.c #メタキャラが使える。各自、自分の状況に合わせてファイルをaddする
git add *.h
git add makefile
git add 他にもあれば追加 #大きなファイルは追加しない #コンパイルで生成されるものは追加しません
git commit -m "the first commit" #SPCが含まれるのでクォートした
gcc -o main.x main.c
./main.x
(注1)コンパイル・リンクでできた実行ファイルは、ふつうリポジトリには入れません。
(注2)gitkコマンドはXウィンドウシステムを介してGUIウィンドウを表示する。sshログインしたマシンで実行したプログラムの
GUIウィンドウを表示するには、sshコマンドに -Y オプションを与えておく必要がある(ssh yourname@hostname -Y)。
もしくは DISPLAY環境変数を設定する必要がある。
emacs main.c #コメントを入れるとか、空行を追加するとかでよい gcc -o main.x main.c ./main.x git add main.c git commit -m "modify main.c"
作業ディレクトリの状態を確認するときによく使うコマンド、適当なタイミングで、必要に応じて試せ。 git remote -v ; git branch -vv #ブランチを表示 git status #作業ディレクトリの状態を表示 git log -15 --oneline --decorate --graph --all #コミット履歴を表示 gitk --all git diff #作業ディレクトリと親コミットとの差分表示 git diff --cached #ステージと親コミットとの差分表示
作業ディレクトリに追跡対象ではないファイルがあると git statusで出力される。 出力させたくない場合、.gitignoreファイルにファイル名を記載する。
emacs .gitignore *~ #例えば、この2行を *.x #.gitignoreに記載する。 git add .gitignore git commit -m "add .gitignore"
cd ~ mkdir repgit; cd repgit mkdir prac.git; cd prac.git git init --bare #~/repgitディレクトリの中に prac.gitというベアリポジトリを作った。
cd ~/prac
git remote add origin ssh://yourname@hostname:/home/yourname/repgit/prac.git
#originに URLを登録
git push --set-upstream origin master
#originのmasterブランチにpushするとともに、
#ローカルリポジトリのカレントブランチ(masterブランチ)が originのmasterを追跡するように設定
#yournameはログインID
#hostnameはkalmia.eit.hirosaki-u.ac.jpなど
cd ~ #kalmiaでなくて、VirtualBoxのubuntuで実行してもよい mkdir tmp; cd tmp git clone ssh://yourname@hostname:/home/yourname/repgit/prac.git prac2
cd ~/tmp/prac2 emacs main.c git add main.c git commit -m "modify main.c in prac2" git push
cd ~/prac git fetch git pull
prac2とpracで更新内容などを見てみよ git remote -v ; git branch -vv git log -15 --oneline --decorate --graph --all
~/tmp/prac2はこのあと使わないので削除して構わない。