「addする」「コミットする」について

とりあえず

## sampleリポジトリへ移動
$ pwd
/c/repos/sample
## app/sample.txt を編集
## ここではファイル内に「sample」という文字を記載した
## ステータスを見る
$ git status
# On branch master
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git chackout -- <file>..." to discard changes in working directory)
# 
#       modified:   sample.txt
# 
no changes added to commit (use "git add" and/or "git commit -a")
## 差分を見る
$ git diff
diff --git a/app/sample.txt b/app/sample.txt
index e69de29..eed7e79 100644
--- a/app/sample.txt
+++ b/app/sample.txt
@@ -0,0 +1 @@
+sample
\ No newline at end of file

ここで見ている差分は「HEAD」と「実ファイル内」の差分。
確かに更新した箇所が差分として表示された。

## 「addする」
$ git add .
## ステータスを見る
$ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
# 
#       modified:   sample.txt
# 
## ここで、またファイル内容を変更する
## 例として、変更前「sample」→変更後「sample text」
## 差分を見る
$ git diff
diff --git a/app/sample.txt b/app/sample.txt
index eed7e79..679aa53 100644
--- a/app/sample.txt
+++ b/app/sample.txt
@@ -1 +1 @@
-sample
\ No newline at end of file
+sample text
\ No newline at end of file
## 「addする」でaddした時点での差分を見る
$ git diff --cached
diff --git a/app/sample.txt b/app/sample.txt
index e69de29..eed7e79 100644
--- a/app/sample.txt
+++ b/app/sample.txt
@@ -0,0 +1 @@
+sample
\ No newline at end of file

「addする」というのはステージングへファイルの変更内容(コミットする内容)を保存する行為のようなもの、らしい。
「HEADと実ファイルの差分」を見るときは「git diff」コマンドで。
「addした内容(コミット準備された内容)」を見るときは「git diff」コマンドに「--cached」オプションを付けた「git diff --cached」で見れる。

## コミットする
$ git commit -m 'add text'
## 差分を見る
$git diff
diff --git a/app/sample.txt b/app/sample.txt
index eed7e79..679aa53 100644
--- a/app/sample.txt
+++ b/app/sample.txt
@@ -1 +1 @@
-sample
\ No newline at end of file
+sample text
\ No newline at end of file
## 「addする」でaddした時点での差分を見る
$ git diff --cached
## 表示結果なし

コミットすると、コミット準備の内容が消えるので「git diff --cached」で何も表示するものがなくなっている状態となる。

ステータスを見た際にファイルしか表示されない理由

そもそもGitでは空のディレクトリはコミットされない。あくまでファイルを管理するものであり、空のディレクトリなぞコミットしても意味が無いから、らしい。

この辺は「入門git」の45ページにある「空のディレクトリを追跡する」を読めばいいと思った。多分。

コミットログを見る

ログを見るコマンド

$ git log

件数を指定してログを見る(例:1件、3件、10件)

$ git log -1
$ git log -3
$ git log -10

ブランチ作る

「master」から「br01」というブランチを作成

$ git branch br01 master

「master」から作成したブランチ「br01」へ移動

$ git checkout br01
Switched to branch 'br01'
$ git status
# On branch br01

「master」からブランチ「br02」を作成し移動

$ git status
# On branch master
$ git checkout -b br02 master
Switched to a new branch 'br02'
$ git status
# On branch br02

そうだ、ここで気をつけなければいけないのは、ブランチを作成してもそれぞれに該当するディレクトリが作成されるわけではない、という事。

ブランチの確認

$ git branch
  br01
* br02
  master

「*」は自分が「br02」にいることを示す。

マージ

「br02」での更新内容を「master」へ反映させる。

##「br02」でファイルを更新
$ echo 'br02 test' > sample.txt
## 「br02」へコミット
$ git add .
$ git commit -m 'br02 test'
## マージ先へ移動
$ git checkout master
## マージする
$ git merge br02
## マージされたコミットログがあることを確認
$ git log -1
Author: kmizukix <kmizukix@hogehage>
Date:   Thu Dec 31 05:20:29 2009 +0900
 
    br02 test

msysgitの起動

なんで最後になったのか不思議。

git -bash

自分の環境ではこれが認識されなかった。何かミスったくさいが気にしない。

msysgitのインストール先にある「C:\msysgit\msysgit\msys.bat」これを叩けば起動した。


今日はここまで

Windows機にGit入れて使うメモと勉強したことメモ

インストール

まずダウンロード。コマンドライン版を入れる。

  • msysgit - Project Hosting on Google Code
    ここの「Download」から「msysGit-fullinstall-1.6.4-preview20090729.exe」をダウンロード&インストール。
    どうでもいいがインストール中はぼーっとしてた。

インストールが終わったらコマンドを入力してみる。

$ git --version
git version 1.6.4

応答が返ってきたのでインストール成功したとみなす。

リポジトリ作成

次にリポジトリ作成する。

## ディレクトリ作成
$ cd C:\repos
$ mkdir sample
## ディレクトリへ移動
$ cd C:\repos\sample
## リポジトリ作成
$ git init
Initialized empty Git repository in c:/repos/sample/.git/

できた。リポジトリできた。そして「.git」というディレクトリができた。

新規ファイルまたは新規ディレクトリのコミット

新規ファイルを作成してみる

## ディレクトリ作る
$ mkdir app
$ cd app
$ pwd
/c/repos/sample/app
## ファイル作る
$ echo -n > sample.txt
## addする
$ git add .
## ステータス見る
$ git status
# On branch master
# 
# Initial commit
# 
# Changes to be committed:
#   (use "git rm --cached <file>..." to unstage)
# 
#       new file:   sample.txt
# 
## コミットする
$ git commit -m 'test'

オプションの「-m」はメッセージの「m」。
「addする」と「コミットする」については後述。

ステータスを見た際に「sample.txt」しか表示されていない理由も後述。

ユーザー設定する

「誰が」「いつ」「どのような」更新を加えたかを保存するための、「誰が」の部分を設定する。
これを設定しておかないと Author が unknown となってしまう。これは困る。

## ユーザー名を kmizukix に
$ git config --global user.name kmizukix
## メールアドレスを kmizukix@hogehage に
$ git config --global user.email kmizukix@hogehage
## 確認
$ git config -l
## 〜略〜
user.name=kmizukix
user.email=kmizukix@hogehage
## 〜略〜

これで、コミットした場合に「誰が」操作を行ったのかわかるようになった。

ちなみに、オプションに「--global」を付けない場合は、現在のリポジトリ以下にのみ反映される設定ができる。

## 別のリポジトリを作成&そちらへ移動
$ cd ../
$ mkdir sample2
$ git init
## ユーザー名設定
$ git config user.name kmizukix-sample2
## 設定を見る
$ git config -l
## 〜略〜
user.name=kmizukix
user.email=kmizukix@hogehage
## 〜略〜
user.user=kmizukix-sample2
## 〜略〜

名前が増えてる。

## 元のリポジトリへ戻る
$ cd ../sample
## 設定を見る
$ git config -l
## 〜略〜
user.name=kmizukix
user.email=kmizukix@hogehage
## 〜略〜

うん。

int と bool であはん 〜isinstance()の罠〜

これはびっくりした。なのでメモ。

i = 123
isinstance(i, int)
# => True

a = True
isinstance(a, int)
# => True

b = False
isinstance(b, int)
# => True

c = 1
isinstance(c, int)
# => True

d = 0
isinstance(d, int)
# => True

えぇー!

i = 123
isinstance(i, bool)
# => False

a = True
isinstance(a, bool)
# => True

b = False
isinstance(b, bool)
# => True

c = 1
isinstance(c, bool)
# => False

d = 0
isinstance(d, bool)
# => False

ほっ
こっちは大丈夫なのね。

理由は「boolはintのサブクラスだから」だそうです。

参考
bool is instance of int in Python - Peterbe.com (Peter Bengtsson on Python, Zope, Kung Fu, London and photos)
boolはintだった - 路傍のプログラマ

参考先を教えてくれたKuboonに感謝ヽ(・∀・)ノ

久々に携帯web画面作成した

久々にテキスト入力フォームの「初期入力モードをアルファベットで指定する」なんて書いた。
対応したのは Docomo , Ezweb , Softbank(Yahoo? Disney?) の3キャリア向けのXHTML

というわけでフォーム部分の記録を残す。

# For Docomo
<form method="post" action="/login/" guid=ON>
アカウント<br />
<input type="text" name="account" value="" style="-wap-input-format:&quot;*&lt;ja:en&gt;&quot;" /><br />
<br />
パスワード<br />
<input type="password" name="passwd" style="-wap-input-format:&quot;*&lt;ja:en&gt;&quot;" /><br />
<br />
<input type="submit" value="ログイン" />
</form>

# For Ezweb
<form method="post" action="/login/">
アカウント<br />
<input type="text" name="account" value="" style="-wap-input-format:*m;" /><br />
<br />
パスワード<br />
<input type="password" name="passwd" style="-wap-input-format:*m;" /><br />
<br />
<input type="submit" value="ログイン" />
</form>

# For Softbank
<form method="post" action="/login/">
アカウント<br />
<input type="text" name="account" value="" mode="alphabet" /><br />
<br />
パスワード<br />
<input type="password" name="passwd" mode="alphabet" /><br />
<br />
<input type="submit" value="ログイン" />
</form>

入力モード(入力フォーマット)について詳細が知りたい場合は「携帯 xhtml 初期 入力」でググると情報がたくさん出てきます。

Docomoの仕様を詳しく知りたい場合はここを。ちなみに分かりやすい一覧はPDFになっています。
作ろうiモード:iモードブラウザ2.0対応i-CSS2について | サービス・機能 | NTTドコモ

Ezwebの仕様を詳しく知りたい場合はここを。
KDDI au: 独自拡張タグ・特徴のあるタグ > format属性

Softbankの仕様を詳しく知りたい場合はここを。
XHTMLとCSSによる携帯サイト制作

Mercurialもろもろインストール(1)

入れる環境は WindowsVista。
参考にしたのはここ
Mercurialでバージョン管理

Mercurial本体を取得

Download - Mercurial
「Binary packages」→「Windows版」→「Mercurial-1.4.1 installer」をダウンロード。

インストール先は「C」直下にした。

つづく

文字列の比較で疑問(4)

西尾さんに質問したら丁寧に解説してくれた。
Pythonで2つの文字列がa == bだけどもnot(a is b)であるようなケース

質問するに当たって確認された事は、対話的環境を使用したかどうか。答えはyes。というわけで試してみた。

d1 = 'a a'    # => ここでコンパイル
d2 = 'a a'    # => ここでコンパイル

id(d1)
# => 28265248
id(d2)
# => 28265440

'yes' if d1 == d2 else 'no'    # => ここでコンパイル
# => 'yes'

'yes' if d1 is d2 else 'no'    # => ここでコンパイル
# => 'no'

d3 = 'abc'    # => ここでコンパイル
d4 = 'abc'    # => ここでコンパイル

id(d3)
# => 28462080
id(d4)
# => 28462080

'yes' if d3 == d4 else 'no'    # => ここでコンパイル
# => 'yes'

'yes' if d3 is d4 else 'no'    # => ここでコンパイル
# => 'yes'
  • ファイル text.py を作って実行
# -*- encode: utf-8 -*-

d1 = 'a a'
d2 = 'a a'

print id(d1)
print id(d2)

print 'yes1' if d1 == d2 else 'no1'
print 'yes2' if d1 is d2 else 'no2'

d3 = 'abc'
d4 = 'abc'

print id(d3)
print id(d4)

print 'yes3' if d3 == d4 else 'no3'
print 'yes4' if d3 is d4 else 'no4'

# => ここでコンパイル
# => 26753760
# => 26753760
# => 'yes1'
# => 'yes2'
# => 26754016
# => 26754016
# => 'yes3'
# => 'yes4'

また一つ理解が深まった気がするよ!

文字列の比較で疑問(3)

疑問点が変わったけどこのタイトルのままで。

d1 = 'aaa'
d2 = 'aaa'

id(d1)
# => 27605792
id(d2)
# => 27605792

ふむ。で、ここから疑問。

d1 = 'a a'
d2 = 'a a'

id(d1)
# => 27605856
id(d2)
# => 27606080

えっなんで?