はじめに
こんにちは。
今回はTortoiseGitを使い始めた方に、もう少し進んだ使い方をご説明します。チームで開発するようになる時に役立つ操作などが多くありますので、これらの操作が使いこなせるようになると、より効率よく開発を進めていくことができます。
この記事のレッスンはTortoiseGitで基本操作ができる方を対象としています。
全くの初心者という方や、基本操作にまだ不安がある方は、まずは基礎編を進めてみてください。
基礎編のURL→https://tracpath.com/bootcamp/learning_tortoisegit.html
レッスン 0. 事前準備
Gitの基礎知識がある方で、msysgit及び、TortoiseGitのインストールがまだの方は、以下のページにアクセスして事前にインストールを済ませておいてください。
msysgitのインストール手順はこちらのページを参照してください↓
https://tracpath.com/bootcamp/learning_tortoisegit.html#id9
TortoiseGitのインストール手順はこちらのページを参照してください↓
https://tracpath.com/bootcamp/learning_tortoisegit.html
また、今回は既にtracpath上に共有リポジトリが作成されている状態を想定します。
まだ、tracpathでリポジトリを作成していない場合には、下記に示すリンクから共有リポジトリを作成してください。(アカウント作成ができていない方は、まず登録からお願いします)
https://tracpath.com/bootcamp/version_management_with_tracpath.html#tracpath-3
共有リポジトリができたら、HTTPのURLを取得してください。取得出来たURLを使ってクローンしておきます。
下記の内容をテキストに記載して「test.html」と名前を付けて、共有リポジトリに入れておいてください。
<HTML> <HEAD> <TITLE>サンプルページ</TITLE> </HEAD> <BODY> <H1>これはGitのテストです</H1> <OL> <LI>その1</LI> <LI>その2</LI> <LI>その3</LI> </OL> </BODY> </HTML>
- msysgitのインストール
- TortoiseGitのインストール
- 共有リポジトリに「test.html」を入れておく
以上の準備ができたら、それでは早速レッスンに入っていきましょう。
レッスン 1. フェッチ
まずはフェッチからやってみましょう。フェッチとは、共有リポジトリの内容をローカルリポジトリに取り込む操作になります。
プルと何が違うの?と思った方もいると思います。プルとの違いは、作業フォルダの内容は更新されないという点です。
下記に違いを表にしています。
操作 | ローカルリポジトリ | 作業フォルダ |
---|---|---|
プル | 更新される | 更新される |
フェッチ | 更新される | 更新されない |
どういった時にこの操作が必要になるかというと、チーム開発しているときに、他のメンバーが作った共有リポジトリの内容を見たい時などです。
プルを使うと、自分が今いる作業コピーの更新までしてしまうので、取り込みに時間がかかったり、はたまた変更途中で更新が入ってしまって競合が起こったりと、混乱する事態が起こるかもしれません。
フェッチを使えば、ローカルリポジトリだけが更新されますので、そういった事態を招きません。例えば自分が何か作業中にレビューを依頼されたので、レビュー対象のブランチの変更を見たいなどといったことが起こります。そういった時にも便利に使うことができます。
前置きが長くなりましたが、実際のフェッチ操作はとても簡単です。
更新したい作業フォルダ内ならどこでもよいので、右クリックして「TortoiseGit -> フェッチ」を選びます。
そのままOKを押したらフェッチの操作は完了です。
正しくフェッチが行われたかどうかを確認するためには、refブラウザを見てみましょう。
refブラウザの見方を簡単にご説明します。まずは「heads」を押してみてください。ここではローカルリポジトリに存在するブランチがリストアップされます。今はまだブランチを何も作成していない状態なので、masterだけになっています。
次に、共有リポジトリ側を見てみましょう。「origin」を選ぶと、こちらは共有リポジトリに存在するブランチがリストアップされます。フェッチで更新されるのはここのリストになります。
今はmasterしかブランチが存在しないので、1つだけ表示されていますが、ログを見たいブランチを右クリックして「ログを表示」を選択すると、チェックアウトせずに直接ログを参照できます。
もしエラー無くフェッチが終わったのにリストアップされていなければ、ブランチの作成者にプッシュを行ったかもう一度確認をしてみてください。
レッスン 2. ブランチをマージする
次にブランチのマージ方法を学んでいきましょう。マージは変更内容を比較し、取り込む作業です。
この操作を使う場面としては、自分専用のブランチで作業をしている際に、他の人が作ったブランチの、ある変更内容を自分のブランチに取り込みたいときなどです。
まず、下記のようにmasterをベースに作ったfeature_Aというブランチがあったとします。そこで、masterからある特定の変更をfeature_Aに取り込みたいというケースを想定します。
ここではマージを使って変更を取り込んでいきます。
マージに失敗しないコツは、マージ元とマージ先を明確にすることです。色々と作業していると意外と混乱しますので、はっきりとさせておきましょう。
- マージ元 → 取り込みたい変更が入っているブランチのこと
- マージ先 → 取り込む先のブランチのこと
では、ここから実際の操作です。
まずは、feature_Aというブランチを作りましょう。作った後はすぐに使いたいので、「新しいブランチに切り替える」のオプションにチェックを入れてください。
右クリックメニューで切り替わっていることが確認できました。
ではまずはfeature_Aのブランチに変更を入れていきます。test.htmlを開いてコードを変更してみましょう。
変更したら、コミットを済ませてください。
続いて共有リポジトリにプッシュします。そのままOKで良いです。
これで、共有リポジトリ上にfeature_Aというブランチができて、変更されたファイルがアップロードされました。
続いて、master側が成長したことを再現するため、master側のファイルを変更しましょう。「切り替え/チェックアウト」からmasterに切り替えます。
切り替わったらファイルを変更します。こちらはTITLEタグを変更してみましょう。
こちらも変更が終わったらコミットとプッシュを済ませてください。
masterの変更が終わると、それぞれのブランチの内容は下記のようになっていることになります。
では準備が整ったのでマージしてみましょう。一旦またfeature_Aブランチに切り替えます。マージ作業を行いたい場合は、マージ先のブランチ側に切り替えるということを覚えておいてください。
TortoiseGitのメニューから、マージを選びます。
次の画面でマージの詳細を設定できますが、マージ元はmasterなので、Fromのところで選択します。
それ以外はそのままでOKです。
今回の変更では競合が発生しないので、すんなりと終わると思います。
では、本当にマージされたかファイルを開いてみてみましょう。
ちゃんとマージされていますね。ではログを確認してみましょう。下記のようにmasterをfeature_Aにマージしたというログが記録されています。
これでマージ操作は終わりになります。もし、実際の運用で競合等が発生した場合には、解消法もこの記事で後ほど紹介していますのでご覧ください。
レッスン 3. ブランチのログをまとめる(スカッシュマージ)
ローカルブランチは好き勝手に使えるのがGitの良いところですが、変更がまとまったので本線にマージをかけたいという際、あまりにこまめにコミットしすぎてコミットの数が膨大になってしまい、masterのログが見づらくなってしまうことがあります。また、ログメッセージを毎回チームのルールに沿ったものに厳密に従うことでコミットが億劫になってしまいかねません。
そんな問題を解決してくれるのが「スカッシュマージ」です。これは、マージする際にコミットをまとめることができる機能。ローカルブランチで変更していた内容を1つにまとめてから本線にマージできます。その際にコミットのログメッセージを書き換えることもできます。
この操作はマージの操作とほとんど同じ、ひと手間加える形となります。では早速操作方法を見てみましょう。
まずは、複数のコミットをまとめる作業のベースを作りたいので、ファイルを2回変更してみましょう。
変更→コミット→プッシュ→変更→コミット→プッシュ
という流れで、2回変更を入れていきます。コミット先のブランチは引き続きfeature_Aにします。今回は下記のように1行ずつ2回に分けて追加しました。
変更が終わると、下記のように2回に分けてログが記録されます。
では、今回はmasterに対してマージするので、masterに切り替えてこれらの変更をマージしてみます。
masterに切り替わったら、マージを実行します。Fromはfeature_Aです。その際に、オプションの「融合」を選択してください。この「融合」がスカッシュマージと呼ばれるオプションです。
終わったら、コミットを押してください。この時点ではまだ「マージする」とマークを付けているだけの状態になりますので、その変更をコミットする必要があります。
コミットウィンドウが出ます。ここでコミットログを自由に変更することができます。一旦入力されているものを全て消去して、変更に即した内容に正しく書き換えましょう。終わったらコミットとプッシュをしてください。
さて、ログメッセージはどうなったでしょうか?masterブランチのログを早速見てみましょう。
複数のコミットが1つにまとまり、綺麗に整理されていること分かります。この機能を知っておけば、masterにマージするまでは好き勝手にログメッセージを書けます。また、こまめに変更をコミットすることができるので、便利に進められます。
レッスン 4. ブランチのベースを変更する(リベース)
では次にリベースを学びましょう。
リベースは概念を理解するために、少し説明をしたいと思います。
今回はmasterをベースとした、新しいfeature_Bというブランチがあったとします。
feature_Bで機能を開発してブランチが成長していきます。しかし、それと同時にmaster側にもいろいろな変更が加えられていきます。そうなると、master側の変更が一切入ってこないことになります。
そういったときに、あたかもmasterの最新から作ったように分岐点の切り替えをすることができます。これをリベースといいます。
マージとリベースは一見似ている操作ですが、リベースの利点としては、ログメッセージを見ると今作ったブランチのように見えますので、ログが時系列的に分かりやすくなることです。多くの人が関係するプロジェクトでは、こういった一人一人のメンバーの意識の積み重ねによって、皆にとってより良い運用ができます。
リベースの注意点
リベースはベースを付け替える都合上、コミットのキーをすべて書き換えてしまいますので、複数のメンバーで同じブランチを使って開発している場合に使ってしまうと、思わぬ混乱招いてしまうことがあります。そのため、あくまで1人で使っているブランチに対して使うようにするのが得策です。
複数のメンバーで使っているブランチに対して最新の変更を取り込みたい場合には、マージを使いましょう。
では、実際にリベースを行ってみましょう。
まずは、feature_Bというブランチを作るところからです。現在のmasterの最新からブランチを作ってみます。
今回はmasterを成長させてみますので、新しいブランチに切り替えるオプションは外して結構です。
何も表示されませんが、これでfeature_Bブランチができます。続いてmasterを成長させてみましょう。
master側に以下の変更を入れてみてください。
変更したら、コミットとプッシュをします。
これでmaster側が成長しました。今はこういう状態ですね。
それではリベースをしてみます。リベースを実施すると、このようにベースのリビジョンを付け替えますので、feature_Bに先ほどmasterに入れた「その7」が入ってこれば成功となります。
TortoiseGitのメニューから「リベース(ブランチの付け替え)」を選びます。
リベースのウィンドウが出ますので、ブランチはfeature_Bを選んでください。上流というところがベースとなるブランチです。remotes/origin/masterでOKです。
翻訳の都合でボタンが少しわかりにくくなっていますが、「ファストフォワード」を押してください。ボタンが「終了」に変わったらもう一度押してください。
そうすると、今いるブランチが自動的にfeature_Bブランチに切り替わっていると思います。そのままログメッセージを見てみましょう。「その7」が無事に追加されていますね。これでリベースが成功しました。
注意して使えば便利な機能です。リベースが自在に扱えるようになると、もうGit上級者と言えるかと思います。
レッスン 5. 競合が発生した場合の解消方法
では続いて競合が発生した場合の解消方法について説明していきます。
複数の人が変更するファイルでは競合が起こることがあります。競合の解消とは、2つの変更内容を確認し、どちらを採用するのか選択するもしくは、マージして2つの良いとこ取りの変更内容に加工するといった作業になります。では、競合が発生した時にはどのように解消したらよいか学んでいきましょう。
今回は、先ほど作ったfeature_Bというブランチをもう一度使って、意図的に競合を起こしてみましょう。
まずは、feature_Bに下記の変更を入れて、コミットとプッシュをしてください。
続いて、masterに切り替えて、下記の変更をコミットとプッシュしてください。
これで準備ができました。
2つのブランチでは同じ場所を変更していますので、自動でマージがかからない状態になっています。この状態でfeature_Bからmasterにマージをかけると競合が起きます。
今回はfeature_Bからmasterにマージをかけるので、masterでそのまま作業します。TortoiseGitからマージを選択しましょう。マージ元のブランチはfeature_Bです。
すると、競合が発生したことを知らせるメッセージが表示されます。とりあえずここはOKを押してください。
では、競合の解消をしていきましょう。TortoiseGitのメニューから、「解決する」を選んでください。
ここで修正方針を確認しておきましょう。目指すところは、下記のように、「その8」の後に「おわり」が来るようにしたいです。
マージウィンドウが開きますので、目的の変更を入れていきます。
簡単にウィンドウの説明をします。まず、ウィンドウが3つのエリアに分かれていると思いますが、まず左上はタイトルにあるようにマージ元つまり「feature_B」の変更です。
そして右上はHEADと表示されていますが、現在使っているブランチの最新をHEADと呼びますので、masterの最新の変更を指します。
最後に下の広めのウィンドウが編集対象のファイルになります。そのため、このエリアを正しい形に修正する必要がありますが、ここは手動で行います。修正が終わったら保存してこのウィンドウを閉じましょう。
マージウィンドウを閉じると、以下のようなメッセージが出ます。「解決済みとする」を押しましょう。
では、競合が解消されたので、コミットしましょう。TortoiseGitの「コミット」を選びましょう。
下記のメッセージが出ると思いますが、気にせずOKを押してください。
いつものコミットウィンドウが出ますが、下記で選択している青い部分は消しましょう。この部分は競合があったということを示しますが、解消済みですので不要になります。これが残った状態でコミットすると、エラーメッセージが出ます。
コミットが終わったら、プッシュして終了です。これで無事に競合が解消できました。
ワンポイントアドバイス:
解消方法があるとはいえ、競合は往々にしてマージミスや先祖戻りを引き起こす原因となります。そのため、よく競合が起こる場合には、ファイル毎に担当を分ける等、競合が起こらない運用ができないか見直してみることをお勧めします。
さいごに
今回はTortoiseGitの発展編として少し高度なことを学びました。1回では覚えられないかもしれません。中には使用頻度が低い機能もありますので、まずはGitにはこのような機能があるということだけでも頭に入れておいていただければよいと思います。
実際にこれらの機能を使うべき場面に出くわしたときに、このページを参照しながら操作すれば問題ありません。何度も実践するうちに覚えていくことができます。
それでは、今回のレッスンはこれで終わりになります。お疲れさまでした。
参考情報
tracpathへのリンク
(https://tracpath.com/bootcamp/learning_tortoisegit.html#id26)
1 Comment
[…] してはTortoise Gitを使った方法を紹介しておりますので、使用経験があると理解が早いと思います。 Tortoise Gitに関しては、下記の記事を参考になさってください。 →Tortoise Git紹介記事へ […]