howto/git

一行メモ


マニュアル・リンクなど

はじめてのGit

git(ギット)はソフトウェアなどのバージョン管理をするツールである。 バイナリファイル以外は、ソフトウェアに限らず有効(差分とか見れる)に使える。

予備知識

リポジトリ

開発中のソースコードの版(バージョン)を蓄えているものをリポジトリという。コミット(保存する操作)された版が全て記録されている。 gitでは、版管理の対象はプログラムソースコードに限らず、ファイルであれば何でも良いが、 ファイルサイズが大きいものは動作が重くなるためやめたほうがよい。

作業ディレクトリ

通常のディレクトリのように、開発中のソースコードを置いてあるディレクトリのことを作業ディレクトリという。 これをgitで版管理している場合、この作業ディレクトリには ".git"というディレクトリがあり(リポジトリの本体)、 版管理に関する情報や全ての版が保存されている。

作業ディレクトリ内のファイルは、gitの版管理を意識せずに普通に修正等して構わない。

ローカルリポジトリ

ログインしてシェルのプロンプトが出ており、カレントディレクトリが、版管理されている作業ディレクトリであるとする。 ここにあるリポジトリのことをローカルリポジトリと呼ぶ(単にリポジトリとも呼ばれる)。

開発作業はすべてローカルリポジトリがある作業ディレクトリで行います。

リモートリポジトリ

ローカルリポジトリは、他の"上流"にあるリポジトリと結びついている場合がある(その場合が大多数)。 この上流のリポジトリのことを、リモートリポジトリと呼ぶ(これも単にリポジトリとも呼ばれたりする)。 上流のリポジトリは、版のデータを受け渡しすることに使われる。

ベアリポジトリ

作業ディレクトリを持たないリポジトリ(".git"ディレクトリのみから成るようなもの)。 リモートリポジトリはふつうはベアリポジトリである。

上流のリポジトリのポンチ絵

nowrap

新しい版のコミットまでの流れ

作業ディレクトリ上で、 (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

新規に、リモートリポジトリ(ベアリポジトリ)を作って、利用する(スキップ*1

マシン 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 ブランチ名     #既存のブランチに切り替える(未コミットなどがあればできない)

新しくローカルリポジトリにブランチを作り、リモートリポジトリにpushする(スキップ)

  $ 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          #すべてのタグを表示

基本的な操作(複数のブランチ利用)

あるSHA1のコミットにタグを付ける

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について表示

helpコマンド

git help rev-parse

masterをマージする

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  #設定内容の確認

pracディレクトリを版管理するために、ローカルリポジトリを作成し、必要なファイルをステージングし、コミットせよ

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環境変数を設定する必要がある。

修正してコミットせよ(1回以上)。以下のよく使うコマンドも試せ

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   #ステージと親コミットとの差分表示

.gitignoreファイルを作り、不要な出力を抑止する

作業ディレクトリに追跡対象ではないファイルがあると git statusで出力される。 出力させたくない場合、.gitignoreファイルにファイル名を記載する。

emacs .gitignore
*~   #例えば、この2行を
*.x  #.gitignoreに記載する。
git add .gitignore
git commit -m "add .gitignore"

ベアリポジトリを作り、pushしてみよ(スキップ)

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

クローンしたリポジトリの作業ディレクトリで、ファイルを修正してcommit, pushし、もともとの作業ディレクトリでpullしてみよ(スキップ)

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はこのあと使わないので削除して構わない。

*1 リモートリポジトリに関することはスキップして下さい。gitの扱いに慣れたら、この資料をみて自分で試してよい。

トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS