Gitを使いこなすための20のコマンド 4ページ

ブランチを作成/管理するコマンド

コマンド12:「git branch」-ブランチ情報の表示およびブランチの作成
コマンド13:「git checkout」-ブランチの切り替え
コマンド14:「git show-branch」-ブランチの作成/変更/マージ履歴を表示

 現在のソースツリーを元に新たなブランチを作成するには、「git branch」を使用する。また、操作対象とするブランチを切り替えるには、「git checkout」を使用する。

 たとえば、新たに「temp01」というブランチを作成し、以後このブランチで作業を行うには次のようにする。

$ git branch temp01
$ git branch
* master
  temp01
$ git checkout temp01
Switched to branch "temp01"
$ git branch
  master
* temp01

 なお、git checkoutに「-b」オプションを付けて実行すると、新たにブランチを作成してそのブランチに切り替える、という作業が一発で行える。たとえば、「git checkout -b temp01」は、次の2つのコマンドを順に実行した場合と同じ結果になる。

$ git branch temp01
$ git checkout temp01

 どのブランチがどのブランチを元に作られたか、という情報は「git show-branch」で確認できる。git show-branchでは次の例のような出力を行うが、前半の「---」までがブランチ履歴、「---」から後半が最近のコミット履歴を表している。

$ git show-branch
! [master] add script merging google anal.'s log and OTP's log.
 ! [temp01] Cleaning codes and convert TAB to space.
  * [temp02] Cleaning codes and convert TAB to space.
---
 +* [temp01] Cleaning codes and convert TAB to space.
 +* [temp01^] Cleaning code, and add comments
++* [master] add script merging google anal.'s log and OTP's log.

 前半部分ではブランチが階層構造で表示されており、「*」が付いている行が現在の作業ブランチになる。また、[]内の文字列はそれぞれのコミット単位を表すショートネームだ。この例では、「master」から「temp01」ブランチが作成され、さらに「temp01」から「temp02」ブランチが作成されたことが分かる。

コマンド15:「git merge」-ローカルブランチのマージを行う

 「git merge」は、現在の作業ブランチに別のブランチで行われた変更点を取り込むコマンドだ。

$ git merge <変更点の取り込み元ブランチ>

 マージが成功した場合はそのままコミットも行われる。いっぽう、競合が発生したファイルには下記のような形式で競合している個所にマーカーが埋め込まれる。

<<<<<<< <ブランチ名>:<ファイル名>
<作業中ブランチの内容>
=======
<変更点の取り込み元(マージ元)ブランチの内容>
>>>>>>> <ブランチ名>:<ファイル名>

 たとえば、下記は「markup.pl」というファイルに対してマージを行い、競合が発生した例である。「<<<<<<< HEAD:markup.pl」から「=======」までが作業ブランチ内のmarkup.plに記述されていたもので、「=======」から「>>>>>>> e74597cbfdb9995e540ca9e8c8a6e79705e2889c:markup.pl」までがマージ元ブランチ内のmarkup.plに記述されていたものとなる。

sub ulist {
    if( $l =~ m/^☆(リスト.*)$/ ) {
      $cap = $1;
    }

<<<<<<< HEAD:markup.pl
    print "<ul>\n";
    while( $l =~ m/^・/ ) {
      $l =~ s/^・(.*)$/<li>$1<\/li>/;
      print "foo:$l\n";
      $l = <>;
=======
    print "<p><b>$cap</b></p>\n";
    print list_start( $cap );
    while( $l = <> ) {
>>>>>>> e74597cbfdb9995e540ca9e8c8a6e79705e2889c:markup.pl
      chomp $l;
      $l =~ s/&/&amp;/g;
      $l =~ s/</&lt;/g;
      $l =~ s/>/&gt;/g;
}

 なお競合が発生した場合、このマーカーを取り除いて競合を解消するか、もしくはマージを取り消すまでコミットが行えないので注意してほしい。