入門Git (Chapter8)

この章は7章の続きのような感じになっていて、複数人での開発の方法について書かれています。

基本的な流れ

「git clone」する
% git clone /path/to/public/myproject.git myproject
「git branch」でブランチを確認する。
  • 「git branch」でローカルにあるブランチの確認が出来ます。最初はmasterだけでmasterが選択されている状態になっています。
% git branch
* master
  • 「-r」オプションを付けるとリモートのブランチを表示することが出来ます。
# maintブランチがリモートにある場合
% git branch -r
  origin/HEAD -> origin/master
  origin/maint
  origin/master
  • このブランチに直接コミットすることは出来ませんが、logなどを確認することは出来ます。また下記のように指定することでブランチの比較も出来ます。
    • これは便利なので積極的に使いたいです。
# origin/masterブランチにのみ存在するコミットを表示
% git log master..origin/master

# ローカルのmasterブランチのみに存在するコミットのみを表示
% git log origin/master..master

# 上記の両方を表示。(「.」が3つになっている)
% git log origin/master...master

# --left-right オプションを付けるとどのコミットがどっちのブランチに存在しているかを確認できる
% git log --left-right master...origin/master
作業用のブランチを作る
  • masterブランチからチケット番号が199のバグフィックスをするブランチを作る場合はこんな感じでしょうか。
% git checkout -b bugfix-199 master
  • 元となるリポジトリには「origin/master」のようにリモートブランチを指定することも出来ます。
マージしてプッシュ
  • まずはmasterにリモートリポジトリの最新を反映させます。
% git checkout master
% git pull
  • マージする
% git merge bugfix-199
% git push origin master

リベースしてまとめる

  • 上記の方法だと、コミットツリーに分岐が多く発生することになるのでちょっとわかりにくい部分もあります。
  • また、変更が常に最新のコミットを元にして行われていることを要求されることがありますので、その場合はリベースをしてコミットが1直線になるようにします。
  • リベースが簡単に出来るのであればリベースするのが共同作業に参加するメンバーのよいしつけともあります。なるほど、覚えておきます。
トピックブランチでrebase
# masterブランチを最新の状態に
% git checkout master
% git pull

# トピックブランチでrebaseする
# (トピックブランチの変更がmasterの最新状態からされたことにしてくれる)
% git checkout bugfix-199
% git rebase master bugfix-199

# masterブランチにマージする
% git checkout master
% git merge bigfix-199
コンフリクトした場合
  • rebaseした時にコンフリクトが発生した場合は、下記のようにしてrebaseします。
% git rebase master bugfix-199
First, rewinding head to replay your work on top of it...
:
When you have resolved this problem run "git rebase --continue".
If you would prefer to skip this patch, instead run "git rebase --skip".
To restore the original branch and stop rebasing run "git rebase --abort".

# 〜手動でマージする〜

# マージした内容をインデックスに記憶
% git add .

# continueオプション付けてrebase
% git rebase --continue master bugfix-199
% git checkout master
% git merge bigfix-199

トピックブランチを共有する

  • ここではトピックブランチを共有する方法として、同サーバー上で共有する方法とリモートリポジトリのトピックブランチ共有する方法が紹介されていますが、同サーバーで複数ユーザーがトピックブランチを共有するシチュエーションはあまりなさそうなので省略。
リモートのトピックブランチを共有
  • まずはトピックブランチを作ってリモートリポジトリにpushします。
% git checkout -b share-topic
〜適当に編集してコミット〜

# originにshare-topicをプッシュ
% git push origin share-topic
  • 別のユーザーでshare-topicを持ってきます。
# まだtopicブランチは見えない
% git branch -r
  origin/HEAD -> origin/master
  origin/master

#fetchすると見えるようになります
% git fetch

% git branch -r
  origin/HEAD -> origin/master
  origin/master
  origin/share-topic
  • こっちからもプッシュします。
% git checkout -b share-topic origin/share-topic
〜適当に編集してコミット〜
% git push origin share-topic
  • トピックブランチ作った方から変更を取り込む
# 本に載っていた方法はこっち
% git fetch origin
% git rebase origin/share-topic

# 自分で思いついた方法
% git pull origin share-topic
  • この方法の欠点としては、みんなにshare-topicブランチが見えてしまうということがあります。
  • 正直この章では「git fetch」コマンドがいまいちよく理解出来なかったです。後で出てくるのかな?

それぞれが公開リポジトリを持つ方法

  • 先程の例のように、中央のみんなで使う共有リポジトリにトピックを作るのではなく、それぞれが公開リポジトリを持って誰かに確認して欲しい時や一緒に作業する場合は、そこを使うようにする方法です。
  • 個人用の公開リポジトリを作る
# 共用リポジトリを作成
% mkdir -p /Users/bob/git/pub/bob/project.git
% cd /Users/bob/git/pub/bob/project.git && git init --bare --shared

# bobという名前で作成したリポジトリを参照出来るようにする
% git remote add bob /Users/bob/git/pub/bob/project.git

% cd /Users/bob/git/project.git
% git checkout -b bob-topic
〜編集してコミット〜

# bobにプッシュする
% git push bob bob-topic
  • 別ユーザーから参照する
# bobで参照出来るようにする
% git remote add bob /Users/bob/git/pub/bob/project.git

# fetchする
% git fetch bob
% git checkout -b bob-topic bob/bob-topic
〜編集してコミット〜

# プッシュする
% git push bob bob-topic
  • bobから取り込む
% git pull bob bob-topic

# or 

% git fetch bob
% git merge bob/bob-topic
  • ごちゃごちゃ色々していますが、ここでのポイントは「git remote add 」でリポジトリに別名を付けることが出来るってことでしょうか。

pullとfetchとrebase

  • fetchは「FETCH_HEAD」にリモートリポジトリの変更を取り込んでくれているようです。多分。。
  • ネットの色んな情報を見る限りgit pullは下記のコマンドと同様のようです。
# git pull origin master は下記2つのコマンドを実行したのと同じ
% git fetch origin master
% git merge origin/master
  • mergeの代わりにrebaseしたい場合は、pullにrebaseオプションを付ければいいと思います。
# git pull --rebase origin master は下記2つのコマンドを実行したのと同じ
% git fetch origin master
% git rebase origin/master
  • 個人的には、「git pull」はrebaseがデフォルトでmergeがオプションの方が自然なのですが。。
  • うーん、こうして見ると自分が理解出来ていないのがよくわかります。。
  • 上記では統合ブランチの変更をトピックブランチにマージしまくっていましたが、トピックブランチはそのトピックを達成することが目的なので、やたらと統合ブランチの更新をマージしてはいけないと最後にありました。
    • 肝に命じておけということですね。
  • 次は「変更履歴を追いかける」というこれまでとはちょっとテーマの違う章になっていそうです。