Gitのワークフロー

Gitでのバージョン管理は、こんな感じでいいのかな?
という手探り状態で始めました。
機能単体の解説は沢山ネット上にあるのですが、チームでプロジェクトを回していく方法というのが、いまイチ情報不足な気がします。
おそらく様々な方法があって、皆自分流のやり方を見つけていくツールなのでしょうが、普及するには運用方法のテンプレートみたいなものも必要なんだと思います。
使いこなしている方からすると稚拙なやり方だと思いますが、自分で見つけた方法を記述したいと思います。

■使う道具

  1. msysGit
  2. TortoiseGit

Windowsで開発するならこの2つが、便利だと思います。
安定してますし日本語にも対応しています。
Gitの評価を始めた頃は、特別なパッチのあたったバージョンでないと文字化けしましたが、現在はメインツリーに取り込まれているので最新バージョンをインストールするだけで使えます。
GitHub for Windowsは、まだ不安定で機能が少ないので、Gitlab用に利用するのは、お勧めできません。
良く「なんで2つツールをインストールする必要があるの?」と聞かれることがあるのですが、Windowsでは、msysGitが最も有力な移植版で、TortoiseGitなどは、内部でmsysGitを呼び出しています。
GitHub for Windowsも内部で、msysGitを持っているようです。
ツールを多くインストールしたくない方は、msysGitだけで、事足りるかもしれません。
ただ、ファイルエクスプローラーに統合されているTortoiseGitの使い勝手は、超魅力的なので、普通は、この2つを併用するのが、お勧めです。
ただし、TortoiseGitの作りは酷いらしく少し重たい動作をさせると容易に画面が固まります。

■ツールのインストールと鍵の登録
ツールのインストール自体は、難しい内容ではないのですが、SSHの鍵を生成、登録する所が難所です。
公開鍵、秘密鍵というのは、技術者でも理解してる人は少なく、拒否反応を示す人が居るので困ります。
やる内容は単純で、msysGitで公開鍵を作成して、その内容をGitlabへ登録するだけです。
Gitとは、SSHの暗号化通信でやりとりをするため非常に機密性の高い作業が行えます。
(オンプレミスのサーバーなので、機密性とか必要なのですが・・・)
TortoiseGitは、ppk形式の鍵を使って通信を行いますので、TortoiseGitと一緒にインストールされるputtygenというツールで、変換します。
(詳しく説明してるHPは多いので、そちらを参照してください)
Gitは、名前とメールアドレスで個人を特定しているので、グローバル設定で設定します。

■プロジェクトの登録
プロジェクトの作成は、Gitlab、つまりWeb上で行います。
デフォルトで、ユーザーは10個までのプロジェクトを作成することができます。
会社では、プロジェクトマネージャーか、プロジェクトリーダーが、作成することになるでしょう。
プロジェクトを作成したらチームメンバーを登録します。

■まずは、クローン
Gitlabの画面上で、クローンするためのアドレスをコピーします。
TortoiseGitを使用して、リポジトリをクローンします。
SVNのチェックアウトと違うところは、別インスタンスのクローンが生成されるというところです。
SVNに慣れている人は、とかく「良く分からなく成っちゃったから、もう一回クローンした方がいいかな?」と言うのですが、この思考は捨ててください。
同じPC上に、クローンが複数あるとツールが誤動作する事がありますので、どうしてもクローンからやり直したかったら.gitフォルダを削除して、ローカルリポジトリとしての機能を排除してから行う必要があります。
もしGit初心者が、思ったように動作しないから見て欲しいと泣き付いてきたらローカルリポジトリが複数存在しないか、確認すると良いです。
Gitに慣れてくれば、ファイルをコピーしてバックアップしながら作業をするという原始的な作業をしていたことが馬鹿らしくなりますよ。

■ファイルの編集
まず、作業ブランチを作成します。
チームで作業するプロジェクトでは、masterブランチで作業はしません。
名前は何でも良いのですが、英数文字を使います。2バイト文字だと正しく動作しないようです。
私は、dv620-3のように日付と番号の組み合わせで、作業ブランチを作成することにしています。
masterでブランチを作成するとmasterと同じ状態の作業ブランチが作成されます。
ここで必要な編集作業を行います。

■リモートリポジトリに誰もコミットしてない場合
Gitlabにアクセスして、コミットの状態を確認します。
Webで簡単にリモートリポジトリの状態が簡単に確認できるのが、Gitlabの良い所です。
編集内容をコミットします。
masterリポジトリへスイッチして、作業ブランチの内容をマージします。
コンフリクトする可能性はありませんので、そのままpushします。

■リモートリポジトリの開発が進んでいた場合
長時間の編集作業で、リモートリポジトリに対して複数のコミットがあったとします。
その場合、作業ブランチが枝分かれした履歴が古い状態になります。
簡単に言えば古いバージョンのソースコードに編集を行なっている状態のため衝突を起こしている可能性が高くなっているということです。
まず、"stash save"を行い、編集内容を一時保存します。
編集内容が一時退避され、枝分かれした頃の作業ブランチの状態へ戻ります。
rebaseを使って、リモートmasterの最新状態へ作業ブランチを進めます。
この機能を使うことによって、作業ブランチは最新のmasterと同じ状態になります。
"stash pop"を使って、一時退避した編集内容を呼び戻します。
運が悪ければ、コンフリクトが起きている筈です。
頑張って修正しコミットします。
masterリポジトリへスイッチして、pullしてから作業ブランチの内容をマージします。
コンフリクトは解決済みですので、pushします。

最近まで、何も考えずに、コミットしてマージしていたのですが、masterでコンフリクトを起こすとコミット履歴として、「ここでマージしたよ」という履歴が残ってしまいます。
コミット履歴が美しくないので、stashコマンドを活用するようにしました。

■急な不具合対応で、別ブランチで作業したい
作業中のファイルがあると別なブランチへスイッチすることはできません。
"stash save"を使用して、編集内容を退避してから別ブランチへ移動します。

■作業ブランチの削除
TortoiseGitで最も厄介な問題が、作業ブランチを削除する機能が無い事です。
私は作業ブランチの削除だけは、msysGitを使ってます。
(ちなみに複数を指定して一括削除できてすごく便利です)
msysGitは、.gitのデータベースも最適化してくれるので、一日の作業の終わりにマージ済みの作業リポジトリを削除するために立ち上げるのも悪くないんですが・・・