github使い方まとめ

ブランチを切ってみたところ,
リモートレポジトリへのコミットのやり方が分からなかったので,
概略的なgitの構造を書き留めつつまとめつつ.


この記事を書くにあたって試したgitのバージョンは1.6.0.2

まずは:こんな感じ?

用語確認

master: ローカルレポジトリのmasterブランチ(ローカルのメインのブランチ?)
origin: リモートレポジトリのoriginブランチ(リモートのメインのブランチ?)
(つまり,git@github.com:pneu/***.gitのことかな?)
この2つはよく使うから,それぞれ最初からエイリアスになっているってことかな?


cloneして,レポジトリ名が確定した後は上の2つのエイリアスが使える.
それ以前に使った場合は分からない.やってない.


chatレポジトリをcloneした後は,その作業領域では
origin = git@github.com:pneu/chat.git


testレポジトリをcloneした後は,その作業領域では
origin = git@github.com:pneu/test.git

になるみたい.

gitの仕組みっていうかコマンドの意味(概略図)
                  <local repository>               <remote repository>
+----+          +-------------------+ pull,clone +---------------------+
| wd |<=========| *master           |<===========| *origin             |
|    |=========>|  client-fork      |===========>|  origin/client-fork |
+----+  commit  +-------------------+    push    +---------------------+

(`*'のついたブランチはデフォルトのブランチ)

【追記】こちらにある図の方がわかりやすいです。Git - openSUSE Wiki


この記事では,

  1. 通常使う場合
  2. ブランチを切ってみる場合
  3. 切ってあるブランチを使う場合

この3つをまとめる.


長いので大まかに,手順で小節を付けると

  1. これだけ知ってれば一応使える
    1. ローカルレポジトリをリモートレポジトリと同期
    2. 作業領域で編集
    3. 編集点をローカルレポジトリにコミット
    4. リモートレポジトリにコミット
  2. ブランチを切って開発
    1. ブランチを切ったり,切ったブランチ名を確認したり,それに切り替えたり
    2. ブランチを編集
    3. 編集点をローカルレポジトリへコミット
    4. リモートレポジトリにコミット
  3. 切ってあるブランチから開発を始めたい(以前コミットしたブランチの続きから始めたい)
    1. ローカルレポジトリをリモートレポジトリと同期
    2. ブランチのフェッチ(ここで以前ブランチをコミットした時点に到着)
    3. 編集,コミット
  4. (補足)ブランチをメインにマージ
    1. いらなくなったブランチを削除
    2. リモートのブランチも削除(これでメインのみ)
  5. (補足)他の操作
    1. コミットやり直し(間違いに気づいてコミットしなおしたい)
    2. ....

通常使う場合

さあ,リモートからローカルにデータを同期させて,
編集したデータをリモートにコミットするところまではどうやるのかな.


git上で新しいレポジトリを作って(名前はchatとする),
ローカルレポジトリに同期させると,こんな状態になっているんだと思う.
ちなみに下の図のwdは作業領域.

         (1)      <local repository>     (1)       <remote repository>
+----+          +-------------------+ pull,clone +---------------------+
| wd |<=========| *master           |<===========| *origin             |
|    |=========>|                   |===========>|                     |
+----+  commit  +-------------------+    push    +---------------------+
 (2)     (3)                             (4)

(今のところ,chatレポジトリでは特にブランチを切らずに開発してきたとする.)


データは

  • リモートレポジトリ
  • ローカルレポジトリ
  • 作業領域
  • ローカルレポジトリ
  • リモートレポジトリ

のループで更新していく.

まずローカルレポジトリをリモートレポジトリに同期させる

図の(1)の手順.


リモートレポジトリにデータがあって,
それをローカルレポジトリに同期させる時には次のコマンド.

$ git clone git@github.com:pneu/chat.git

この時,同時に作業領域が確保される.
つまりは,chatという名前でディレクトリが作られて,
originと同じ内容がその中にコピーされている.
# pullとの違いはよく分からない


中に入って

$ cd chat
編集する

図の(2)の手順.
...


この時点で作業領域のデータが最新.

作業領域の変更をローカルレポジトリに反映する

この変更を最終的にはリモートレポジトリへと伝えたい.
そうすれば別の新しい環境で,続きを行う場合にもcloneから始められるから.
まずは,ローカルレポジトリに反映させる.
図の(3)の手順.


場合によって,いくつか方法がある.

  1. 変更したのは既に存在するファイルのみ出会った場合
  2. 変更に当たって,新しいファイルを作った場合(それもコミットしたいとき)
  3. ファイルを削除した場合(削除したことをレポジトリ側で反映したいとき)
  • 変更したのは既に存在するファイルのみ出会った場合
$ git commit -a
  • 変更に当たって,新しいファイルを作った場合(それもコミットしたいとき)
$ git add (そのファイル)
$ git commit -a

もしくはカレントディレクトリから再帰的に自動で追加することもできる

$ git add .
  • ファイルを削除した場合(削除したことをレポジトリ側で反映したいとき)
$ git rm (そのファイル)
$ git commit -a
このとき変更に関するメモを残せる

(メモ入力)


ちなみに前小節ではcommit -aを使ってけれど,vオプションも付けると
前のバージョンからの変更箇所
# つまり,最近のcommitからの変更点; ここではcloneしてからの変更点
が,変更されたファイルと共に,diff -u形式で表示される.

ローカルレポジトリの変更をリモートレポジトリに反映

図の(4)の手順.

$ git push origin master

後ろの2つはデフォルトであるので(?),省略できて

$ git push

とすることができる.


ここまで分かっていれば,
バージョンアップさせていくやり方に限れば普通に使うことができる.


ブランチを切って開発

ここからは,できるかどうか確かめてからコミットしようなんて場合.


試作版としてちょっとやりたいけど,
メインのバージョンアップとして使うには怖いなー,という時は
ブランチを切ればいいのだと思う.

切ったブランチは同じようにコミットしていけるので,
別の環境でも続きを編集していくこともできるよね.


ブランチを切った後は,それぞれのレポジトリがこんな感じに更新される.

                  <local repository>               <remote repository>
+----+          +-------------------+ pull,clone +---------------------+
| wd |<=========|  master           |<===========|  origin             |
|    |=========>|  client-fork      |===========>|  origin/client-fork |
+----+  commit  +-------------------+    push    +---------------------+
ブランチの切り方

次のコマンドで,新しいブランチを切ることができる.
(今回作るブランチの名前はclient-fork)

$ git branch client-fork
切ったブランチの確認
$ git branch
* master
  client-fork

clietn-forkブランチが追加されている.

切ったブランチへのスイッチ
$ git checkout client-fork
切ったブランチへスイッチしたことの確認
$ git branch
  master
* client-fork

clietn-forkブランチに`*'がついているのを確認


切り替えた後は,そのブランチへの操作に使うコマンドは,
masterの時と同じように考えればいい.

作業する

...

切ったブランチの変更点をローカルレポジトリへ反映
$ git commit -a

ファイルを追加したり,削除した場合はmasterへの操作と同じように
add,rmを使えばいい.

リモートレポジトリにローカルレポジトリの変更点を反映
$ git push origin [new-remote]

例) $ git push git@github.com:pneu/chat.git client-fork
例) $ git push origin client-fork でもいいと思う.
$ git pushじゃダメかな?試してない


リモートレポジトリにそのブランチが無い場合は作られる.


別の環境でもさっき切ったブランチを使って開発したい場合

ここからは,切られているブランチを使って,続きを編集していきたい場合.

やることはclone->編集->commit->pushなのだけれど,追加でやることが少しある.

リモートレポジトリから作業ディレクトリへコピー

(ローカルレポジトリに,リモートレポジトリからダウンロード)

$ git clone git@github.com:pneu/chat.git

通常通り,カレントディレクトリにchatディレクトリが作成される.

$ cd chat


ここで,ローカルレポジトリとリモートレポジトリのすべてのブランチを表示してみる.

$ git branch -a

masterブランチしか無いと思う.
ファイルの変更もブランチを切る前の状態のはず.
つまりorigin(リモートのデフォルト(?)ブランチ)の最新の状態になっているはず


client-forkブランチはどこへいった?

リモートのブランチをローカルレポジトリにコピー

client-forkブランチを引っ張ってくるにはfetchコマンドを使う.

$ git fetch origin [remote-branch]:[new-local-branch]

例) $ git fetch origin client-fork:client-fork
リモートブランチからpullして,新しいローカルブランチを作る.

ブランチを切り替えて,続きから開発できるようにする

新しいローカルブランチが作成されたことを確認.

$ git branch
$ git checkout client-fork

そのブランチにスイッチすると,パッチがすべて当てられた状態になっている!

編集したらローカルレポジトリにコミット
$ git commit -a
リモートレポジトリの同じブランチ(client-fork)へ反映
$ git push origin [さっきのリモートブランチ名]

例) $ git push origin client-fork
今度は新しく作られるのでなく,更新されるようになる.

ブランチするとどういうツリーになるのかを確認してみる

ちょっと脱線します.

gitkというGUIのレポジトリブラウザを使って,
ツリーの状態を確認してみました.



この図はさっきまでのレポジトリではなく,testというレポジトリでの例です.
client-forkがtest-forkに対応していて,それぞれ開発がさっきより進んだとします.

(1)ローカルレポジトリのtest-forkブランチの最新
(2)リモートレポジトリのtest-forkブランチの最新
(3)リモートレポジトリのmasterブランチの最新
(4)ローカルレポジトリのmasterブランチの最新

masterは(3)(4)で開発が止まっていて,ローカル/リモートと双方同じバージョンです.
test-forkは作業の変更点をローカルには伝えていますが(1),
リモート(2)にはまだ反映していません.


ちなみにgit push origin test-forkすると,

となります.
ローカルとリモートのバージョンが同じになりました.


また,masterの先端(3)(4)でtest-forkにブランチしたので,
このブランチは上の方へ伸びていっています.


ここまでで,ブランチを更新していくことはできるようになりました.
最後にブランチをメインのブランチにマージして,
本流をアップデートしてみます.


ブランチをmasterにマージしよう

ブランチして,試験的に開発を進めていたバージョンが,
masterへマージすることになりました.


ブランチの変更がすべてcommit,pushされていて,
ローカルとリモートのレポジトリのバージョンは同じ.
さあマージしよう,という状態から始めます.

まず,ブランチをマージ元にスイッチ

今まで開発していたtest-forkブランチにスイッチされたままでしょうから,
まずmasterにスイッチします.

$ git checkout master
スイッチを確認
$ git branch
2つのブランチのdiffをチェックします.
$ git diff master test-fork
よければ現在のブランチ(master)にtest-forkをマージします
$ git merge test-fork


必要なら確認してみます.

$ gitk

ローカルのmasterがtest-forkの最新バージョンのところに来てると思います.

あとは,リモートにpush
$ git push

いつも通りです.


必要のなくなったtest-forkブランチを削除します(ほんとに必要なければ)
$ git branch -d test-fork

git branchで消えたか確認してみてください

リモートのtest-forkブランチの削除方法

# ここからはまだ必要ないと思い調べてない


おわり

長くなったけれど,ブランチを使って開発していくときに使うコマンドをまとめました.

そのうち,必要になったらコミットやり直しのときのコマンドとかも追記します.


参考

  • githubを活用していつでもどこでも開発をおこなう

http://d.hatena.ne.jp/Ubuntu/20081023/github

  • Guides: Git Cheat Sheet

http://github.com/guides/git-cheat-sheet

  • Gitを使いこなすための20のコマンド

http://sourceforge.jp/magazine/09/03/16/0831212