- 3段構成(repo - index - working_tree)
- index に git add で登録することを staging すると呼び
- working_tree の親になっている commit を HEAD と呼ぶ

- git diff は通常は working_tree と index の差分

- シングルユーザー、 マルチユース
- ssh により多拠点リモートユース
- 複数のマシンで、別々の場所からから接続する
- gitweb を利用する
- 文書ファイル (tex など) の来歴管理を行なう
- サーバー設定情報の管理も行なう
- 基本的に ubuntu の標準に従う (ファイルの置き場所など)
- server account
- user = git
- pass = gituser
- home = /raid_vol/home/git
- shell = /usr/bin/git-shell (git 操作専用、通常ログインはできない)
- リモートリポジトリ = ssh://git@mythen.hmuna.com:8822/raid_vol/home/git/repos 下
- 公開鍵がサーバーに登録されている場合 = git clone ssh://MYTHEN/raid_vol/home/git/repos/(repo_name)
ローカルリポジトリの作成†
- git init
- git add
- git commit -am "comments"
リモートリポジトリの作成†
ローカルの内容をリモートに反映†
- git remote add [local_repo 名] ssh://git@mythen.hmuna.com:8822/raid_vol/home/git/repos/REPO_NAME
- git push [local_repo 名] master
ローカルに git を導入†
- 共通環境の設定
munakata@muna-E420:~/beamer/keio2012$ git config --global user.email public_mail@hmuna.com
munakata@muna-E420:~/beamer/keio2012$ git config --global user.name "hisao munakata"
- git local repo の設定と、変更のローカルコミット
munakata@muna-E420:~/beamer/keio2012$ git init
Reinitialized existing Git repository in /home/munakata/beamer/keio2012/.git/
munakata@muna-E420:~/beamer/keio2012$ git add *
ローカルとリモートの repo の関係付け (一回だけ)†
munakata@muna-E420:~/beamer/keio2012$ git remote add e420 ssh://git@mythen.hmuna.com:8822/raid_vol/home/git/repos/XXX.git
- 上記で e420 はローカル repo を区別するための名前付け、git push で利用する
- 下記の例では repo 自体は master → master の対応である
git add -p†
- -p を付けると変更箇所ごとに commit の対象にするか確認してくれる。
- 沢山の変更をした時に、論理的に関連のないものを別の commit にする(← 非常に重要)のを助ける
git commit†
- 一行目に変更の概略 → パッチを送る時のメールタイトルになる。
- 二行目は空行
- 三行目以降に詳細な説明を書く
git commit <path>†
- git commit に引数でファイル名を渡すと、明示的に指定されたファイルだけがcommit 対象になる
git diff と git diff HEAD と git diff --cached の違い†
- git diff は working_tree と index の差 (git add 後に加えた差分が表示される)
- git diff HEAD は working_tree と 最新の commit との差 (git add したが commit していないものが含まれる)
- git diff --cached は index と 最新の commit の差
git reset と git reset --hard と git reset HEAD^ と ・・・†
- git reset は index に staging された commit 候補を取り消す(working_tree は変わらない)
- git reset --hard は index の staging を取り消した上で、working_tree の変更も取り消す
- git reset HARD^ は直前の commit(=HEAD) を取り消して、一つ前の commit に戻す。 但し working_tree は上書きされない。
- git reset --hard HEAD^ は HEAD^ の状態から working_tree に行われたすべての変更を取り消す
- git reset --hard HEAD(HEAD^ ではなく) は 最新の commit(=HEAD)以降のすべての working_tree の変更を取り消す
git commit --amend : 直前のコミットのやり直し†
- 以下の操作と等価 (一行で完結する)
- git reset HEAD^
- ファイルの再編集
- git add (file)
- git commit -a -m "新しいコミットメッセージ"
- コミットメッセージの書き換えだけにも利用できる
git reset <path>†
- git reset にファイル名を指定すると、明示的に指定されたファイルだけが
git revert†
- git revert は 過去のコミットを取り消す
git log†
- git log --pretty=oneline : 一行で表示オプション 出力される内容
- git log --pretty=format: (option) で色々な表示にできる
git log --pretty=format:"%h - %an, %ar : %s"
ca82a6d - Scott Chacon, 11 months ago : changed the version number
085bb3b - Scott Chacon, 11 months ago : removed unnecessary test code
a11bef0 - Scott Chacon, 11 months ago : first commit
- format の書き方
| %H | コミットのハッシュ |
| %h | コミットのハッシュ (短縮版) |
| %T | ツリーのハッシュ |
| %t | ツリーのハッシュ (短縮版) |
| %P | 親のハッシュ |
| %p | 親のハッシュ (短縮版) |
| %an | Author の名前 |
| %ae | Author のメールアドレス |
| %ad | Author の日付 (--date= オプションに従った形式) |
| %ar | Author の相対日付 |
| %cn | Committer の名前 |
| %ce | Committer のメールアドレス |
| %cd | Committer の日付 |
| %cr | Committer の相対日付 |
| %s | 件名 |
git push ローカル上の変更をリモートに反映†
munakata@muna-E420:~/beamer/keio2012$ git push e420 master
munakata@mythen.hmuna.com's password:
Counting objects: 5, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 337 bytes, done.
Total 3 (delta 2), reused 0 (delta 0)
To ssh://munakata@mythen.hmuna.com:8822/raid_vol/home/munakata/repos/keio2012.git
462fe87..7a936a0 master -> master
git ブランチを作成して、そのブランチに移動†
git ブランチの削除†
これは以下の2つをまとめて実行したことになる
- git branch ブランチ名
- git checkout ブランチ名
git の管理対象から外す†
git rm --cached [ファイル名]
git gc†
- レポジトリの最適化(未使用オブジェクトの削除、圧縮)
過去のリビジョンからファイルを復元 (abc123リビジョンにあるhoge.txtを持ってきたいとする)†
git checkout -f abc123 hoge.txt
- git tag -a <タグ名> -m "メッセージ"
- git push --tags
- git checkout -b 1.6 refs/tags/v1.6 (tag を指定してブランチにチェックアウト)
git diff†
- git diff --word-diff=color
- 単語ベースのdiff
- 行の中の一部だけが変更されてるのをみたりするのに便利
- color を指定すると色の変化でdiffがわかって良い
- git diff --ignore-space-at-eol
- 末尾空白の変更を無視する
- なんかのついでに末尾スペース削りまくってるみたいな変更に対して便利
- git diff -b
- 空白の変更を無視する
- このへん多分インデントかわっただけだよね.. て心配なときに確認するのに便利
git send-email†
- apt-get install git-email
- git format-patch HEAD^ (file_name)
- git send-email (file_name)
- HTTP は基本的に読み込み専用のリポジトリーに使う。 以下の方法は ssh 接続では使えない
- git config --global credential.helper store
- cloneが終わると、$HOME/.git-credentialsというファイルが生成される。
- 中身はリポジトリホスト名とユーザ名・パスワードが平文で保存されている。
- git config --global credential.helper cache
- クライントで ssh-keygen を実行、パスフレーズは無しで生成する。
− サーバーの ~/.ssh に
cat (クライアントの公開鍵)>> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
- クライアントの ~/.ssh/config に
munakata@muna-E420:~/latex$ cat ~/.ssh/config
Host MYTHEN
HostName mythen.hmuna.com
Port 8822
IdentityFile ~/.ssh/muna_E420
User munakata
munakata@mythen:~/My_presentations/als2013JP$ git config -l
color.ui=auto
user.name=hisao munakata
user.email=public_mail@hmuna.com
core.quotepath=false
core.repositoryformatversion=0
core.filemode=true
core.bare=false
core.logallrefupdates=true
remote.origin.fetch=+refs/heads/*:refs/remotes/origin/*
remote.origin.url=ssh://munakata@mythen.hmuna.com:8822/raid_vol/home/munakata/repos/als2013JP
branch.master.remote=origin
branch.master.merge=refs/heads/master
remote.mythen.url=ssh://munakata@mythen.hmuna.com:8822/raid_vol/home/munakata/repos/als2013JP
remote.mythen.fetch=+refs/heads/*:refs/remotes/mythen/*