Gitの基礎練習・その2

前回(id:takahashim:20080521)の続きです。

新しいファイルを追加します

作業コピーの状態を確かめます
$ git status
# On branch master
nothing to commit (working directory clean)

コミットし忘れているファイルはありません。自分が作業コピーに加えた修正は、リポジトリに反映されています。

リポジトリの修正を取り込みます(ここでは何も起きません)

一般に複数人で開発しているときには、リポジトリに対して誰かが修正をコミットしているかもしれません。リポジトリに対して行われた修正を自分の作業コピーに取り込みましょう。

$ git pull
Already up-to-date.

この練習ではリポジトリにコミットしているのは自分だけですから、他の誰かがリポジトリを更新しているはずはありません。ですから、単に現在のリビジョン番号が表示されてgit pullの実行は終わります。

新しいhello.txtファイルを作ります
$ echo "Hello." > hello.txt
$ cat hello.txt
Hello.
新しく作ったファイルはまだSubversionの管理下にありません
$ git status
# On branch master
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#       hello.txt
nothing added to commit but untracked files present (use "git add" to track)

いま作ったファイルhello.txtはまだ追加していませんので、 Gitはhello.txtのことを「知らない」ことになります。 git statusを使うとGitが「知らない」ファイルがわかります。

hello.txtを追加します
$ git add hello.txt
warning: LF will be replaced by CRLF in hello.txt

$ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       new file:   hello.txt
#

ファイルhello.txtを作業レポジトリに追加しました。でも、まだマスタリポジトリには反映していません。 git statusを実行すると、追加したけれどまだコミットしていないファイルがわかります(new file:と書かれます)。

コミットしてリポジトリに反映します
$ git commit -a -m "Add hello.txt."
Created commit b2dbce6: Add hello.txt.
warning: LF will be replaced by CRLF in hello.txt
 1 files changed, 1 insertions(+), 0 deletions(-)
 create mode 100644 hello.txt

$ git status
# On branch master
nothing to commit (working directory clean)

コミットした後、再度git statusしてみると、 hello.txtはもう表示されません。すでにコミットされたからです。

新しいディレクトリを追加します

ディレクトリもファイルと同じように追加します

新しいディレクトリも、ファイルと同じように作成してから追加します。Subversionのように、同時に追加するコマンドはなさそうです。というか、そもそもディレクトリ単位の管理はなさそうで、空のディレクトリを追加することはできないようです。

$ mkdir src
ディレクトリの中にファイルを作って追加します
$ cd src/

※ここで、エディタを使ってGood.javaを作成する

$ cat good.rb
puts "Good"

$ git add good.rb

$ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       new file:   good.rb
#

$ git commit -a -m "Add a Ruby source file."
Created commit 781b99d: Add a Ruby source file.
 1 files changed, 1 insertions(+), 0 deletions(-)
 create mode 100644 src/good.rb

$ cd ..

$ git status
# On branch master
nothing to commit (working directory clean)

           ※コミット忘れがないので、何も表示されませんが、マスタレポジトリには反映されていません。

$ git push
Counting objects: 8, done.
Compressing objects: 100% (4/4), done.
Writing objects: 100% (7/7), 570 bytes, done.
Total 7 (delta 1), reused 0 (delta 0)
Unpacking objects: 100% (7/7), done.
To c:/home/repos/.git
   9aa769c..781b99d  master -> master

$ git status
# On branch master
nothing to commit (working directory clean)

普段の作業はこんな風に進みます

$ git pull
Already up-to-date.

$ cd src/

 ※ここで、エディタを使ってgood.rbを編集する

$ cat good.rb
puts "Good!"

$ git diff                     ※差分を見てみよう
diff --git a/src/good.rb b/src/good.rb
index b641623..c0ab7cd 100644
--- a/src/good.rb
+++ b/src/good.rb
@@ -1 +1 @@
-puts "Good"
+puts "Good!"

$ git commit -a -m "Add an exclamation mark."
Created commit bf793e5: Add an exclamation mark.
 1 files changed, 1 insertions(+), 1 deletions(-)

$ git push
Counting objects: 7, done.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (4/4), 315 bytes, done.
Total 4 (delta 1), reused 0 (delta 0)
Unpacking objects: 100% (4/4), done.
To c:/home/repos/.git
   781b99d..bf793e5  master -> master

ファイル名を変更してみよう

ファイル名をgood.rbからmain.rbに変更するには以下のようにします。変更後はコミットが必要です。

$ git status
# On branch master
nothing to commit (working directory clean)

$ git mv good.rb main.rb

$ ls
main.rb

$ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       renamed:    good.rb -> main.rb
#

$ git commit -m "Rename it."
Created commit 0535394: Rename it.
 1 files changed, 0 insertions(+), 0 deletions(-)
 rename src/{good.rb => main.rb} (100%)

$ git push
Counting objects: 5, done.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 284 bytes, done.
Total 3 (delta 1), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
To c:/home/repos/.git
   bf793e5..0535394  master -> master

$ git status
# On branch master
nothing to commit (working directory clean)

Gitの基礎練習は以上です。お疲れさま。……と言いつつ、これだと分散開発のメリットが見えてこないのが難(<元がSubversion用なので、SubversionでできないけどGitでできるようになったことは出てくるはずがありません)。あとで付け足すかも。