Githubに登録してみたので最初に使うgitコマンドを整理してみた。

kanonji · GitHub

Githubに登録してみました。
eclipse用のプラグインはまだ微妙という噂なので、コマンドラインのgitを入れて練習中です。


ssh公開鍵暗号を作って登録したり、Githubリポジトリを作成するまでは、下記を参考にしました。
英語なんてわかんねーよ!!ってな人へ贈るGithub入門 for MacOS - Seasons.NET
その後、自分のPCで色々と使うgitコマンドの使い方で、ちょっと迷ったので整理してみます。

Githubリポジトリを作成した時に表示されるイントロダクション

Global setup:
  Download and install Git
  git config --global user.name "Your Name"
  git config --global user.email foo@example.com
        
Next steps:
  mkdir trial-repos
  cd trial-repos
  git init
  touch README
  git add README
  git commit -m 'first commit'
  git remote add origin git@github.com:kanonji/trial-repos.git
  git push origin master
      
Existing Git Repo?
  cd existing_git_repo
  git remote add origin git@github.com:kanonji/trial-repos.git
  git push origin master
      
Importing a Subversion Repo?
  Click here
      
When you're done:
  Continue
git config --global user.name "Your Name"

ユーザー名を設定します。
Macの場合、何も設定してない状態だと、Macのユーザー名が使用されるようです。
グローバルな設定と、リポジトリ単位の設定とがあります。


グローバルとリポジトリ単位の設定を付け替えて動きを見てみました。

$ git config --global user.name          #未設定なので何もなし
$ git config user.name                   #未設定なので何もなし
$ git config user.name kanonji           #リポジトリにユーザー名を設定
$ git config --global user.name          #グローバルは未設定のまま
$ git config user.name                   #リポジトリには設定済み
kanonji
$ git config --unset user.name           #リポジトリから削除
$ git config user.name                   #削除したので未設定
$ git config --global user.name kanonji  #グローバルにユーザー名を設定
$ git config --global user.name          #グローバルには設定済み
kanonji
$ git config user.name                   #グローバルの設定が引き継がれている
kanonji
$ git config --unset user.name           #リポジトリから削除をしても・・・
$ git config --global user.name          #グローバルの設定は消えない
kanonji
$ git config user.name                   #グローバルの設定は引き継がれたまま
kanonji
$ git config user.name foo               #リポジトリに別名を設定
$ git config --global user.name          #グローバルはkanonjiだけど・・・
kanonji
$ git config user.name                   #リポジトリはfooになっている
foo
$ git config --global --unset user.name  #グローバルから削除
$ git config --global user.name          #削除したので未設定
$ git config user.name                   #リポジトリの設定は消えてない
foo
git config --global user.email foo@example.com

メールアドレスを設定します。
Github上では見当たりませんでしたが、git lotで表示されるコミットログに記載されるらしいです。
同じくグローバルとリポジトリ単位で設定が可能で、多分細かい動きはuser.nameと同じだと思います。

git init

カレントディレクトリにgitリポジトリを作成します。

$ cd default/
$ git init
Initialized empty Git repository in /Users/kanonji/Dev/git/default/.git/
$ ls -al
total 0
drwxr-xr-x   3 kanonji  staff  102 12  3 03:52 .
drwxr-xr-x   5 kanonji  staff  170 12  3 03:52 ..
drwxr-xr-x  10 kanonji  staff  340 12  3 03:52 .git

最初、勘違いしてしまいましたが .git ディレクトリは .svn のようなものではなく、これがリポジトリです。
.git があるdefaultがワーキングコピーになるので、ここにファイルを作成したりしていきます。

$ ls -al .git/
total 24
drwxr-xr-x  10 kanonji  staff  340 12  3 03:52 .
drwxr-xr-x   3 kanonji  staff  102 12  3 03:52 ..
-rw-r--r--   1 kanonji  staff   23 12  3 03:52 HEAD
drwxr-xr-x   2 kanonji  staff   68 12  3 03:52 branches
-rw-r--r--   1 kanonji  staff  111 12  3 03:52 config
-rw-r--r--   1 kanonji  staff   73 12  3 03:52 description
drwxr-xr-x  12 kanonji  staff  408 12  3 03:52 hooks
drwxr-xr-x   3 kanonji  staff  102 12  3 03:52 info
drwxr-xr-x   4 kanonji  staff  136 12  3 03:52 objects
drwxr-xr-x   4 kanonji  staff  136 12  3 03:52 refs
$ cd ../with-bare/
$ git --bare init
Initialized empty Git repository in /Users/kanonji/Dev/git/with-bare/
$ ls -al
total 24
drwxr-xr-x  10 kanonji  staff  340 12  3 03:52 .
drwxr-xr-x   5 kanonji  staff  170 12  3 03:52 ..
-rw-r--r--   1 kanonji  staff   23 12  3 03:52 HEAD
drwxr-xr-x   2 kanonji  staff   68 12  3 03:52 branches
-rw-r--r--   1 kanonji  staff   85 12  3 03:52 config
-rw-r--r--   1 kanonji  staff   73 12  3 03:52 description
drwxr-xr-x  12 kanonji  staff  408 12  3 03:52 hooks
drwxr-xr-x   3 kanonji  staff  102 12  3 03:52 info
drwxr-xr-x   4 kanonji  staff  136 12  3 03:52 objects
drwxr-xr-x   4 kanonji  staff  136 12  3 03:52 refs

--bareオプションを使うと、ワーキングコピーのないリポジトリを作る事も出来ます。
ちょうど .git の中身をそのまま置いたような構成で、SVNリポジトリとよく似ています。
でも多分ですが、これはGithubのような所で使うオプションで、ユーザーが操作するところは.gitリポジトリのある所だと思います。
分散バージョン管理なので --bareなリポジトリを使う時は、それをcloneして手元にもリポジトリを作るでしょうし。
--bareなリポジトリは .git という拡張子を付けるのが慣例となっているようです。
上記で言えば with-bare.git のようにすべきだったという事ですね。

git@github.com:kanonji/trial-repos.git

Githubリポジトリを作ると用意されるClone URLですが、末尾に .git が付いているので --bare なリポジトリという事になりそう。

git add README

コミットするファイルを指定します。
Subversionと違って、git add したファイルしかコミットされません。
このイントロダクションではREADMEファイルは新規に作ったファイルですが、
今後READMEファイルの内容を編集してコミットする場合も、まずは git add README をします。
つまり git commit をする前に、どれをコミットするかを選ぶ段階です。
HEADとワーキングコピーの間に索引(index)エリアがあり、文字通りコミットすべきファイルをindexに登録する作業。

git commit -m 'first commit'

コミットします。
-m はコミットのメッセージを付けるオプションで、省略してもエディタが起動して入力は求められます。
前述の通り git add をしてindexエリアに追加したものがコミットされます。

git commit -a

いちいち git add するのが面倒な場合は -a オプションを付けると git add をしなくてもコミットできます。
Subversionのコミットと同じような動きをし、変更されたファイルを自動検出して全てコミットします。
svn commit と同様に、バージョン管理されていない新規ファイルに関しては git add が必要です。

git remote add origin git@github.com:kanonji/trial-repos.git

リモートブランチに追加します。
実はリモートブランチという名前でいいのかちょっと確信持てないんですが、そう説明している所があったのでとりあえず。
これで origin という名前で git@github.com:kanonji/trial-repos.git リポジトリが追加されます。

git push origin master

origin にローカルのコミットなどの変更点を反映します。
origin とは上記で追加したリモートブランチの事なので git remote add foo などとしていれば git push foo master となります。
リモートブランチと書きましたが、この文脈では公開リポジトリと説明している所もありました。
Githubを使う場合は、ローカルにある自分のリポジトリと、Github上にある公開リポジトリという関係にもなり、originという命名が慣例のようです。
master は最初からあるブランチ名で、特にブランチを作っていなければ、常に master で作業します。