1人でGitを使う話(ローカル・マージ)

Gitを使ってるのに、ブランチ作ったり、マージしないのはもったいないので、
最低限必要なブランチの作り方とマージについて説明したいと思います。

まず、ここまでの作業内容をおさらい。
この記事の手順に従って、2回ほどコミットしてプッシュしました。

次に、以下のようなことを考えてみます。

現状だと、引数が存在するかどうかしかチェックしてなくて、
とんでもない大きな数字が入力された場合や、
数字以外が入力された場合は、使い方を表示して終了した方が良さそうです。
(*1)

という訳で、適当な制約を実装して、
使い方を表示する機能も実装してみましょう。

今回のように機能の追加やバグフィックスを行う場合は、
新しいブランチを作成して、そのブランチにコミットを行うことで、
masterブランチに影響を与えることなく安全に作業ができます。
作業が終わったら、新しいブランチに行ったコミットを、
masterブランチに反映します。
このように、異なるブランチからコミットを反映することを、
「(ブランチの)マージ」と表現します。(*2)

まずは、ブランチを作ります。
ブランチの名前は、add_input_checkとしましょう。
$ git branch add_input_check
これでローカルリポジトリに新しいブランチが追加されました。
$ git branch
で、確認してみましょう。

  add_input_check
* master

このように出力されるはずです。
次に、スクリプトを編集してコミットする訳ですが、
この状態でコミットしてしまうと、masterブランチにコミットされてしまいます。
*印は、どのブランチにコミットされるかを表していた訳です。
なので、コミット先を切り替えます。
$ git checkout add_input_check
これで切り替えが行われたはずです。
$ git branch
を実行すると、確認することが出来ます。

ここまでを整理すると、add_input_checkという名前のブランチを作成して、
コミット先をadd_input_checkに切り替えました。
これらの作業は、
$ git checkout -b add_input_check
という、1つのコマンドで行うことが出来ます。
-bはブランチを新規作成することを意味します。

次に、編集を加えましょう。

use strict;
use warnings;
use utf8;
use feature qw/say/;

if ( scalar(@ARGV) == 0 ) {
    die; # 引数がない
}
elsif ( $ARGV[0] =~ /^\d{1,4}$/ ) {
    # 0〜9999までの数字が入力された
    say 'here!';
}
else {
    die; # 0未満 or 9999より大きい
}

my $n = shift @ARGV;
my $sum = 0;
foreach (1..$n) {
    $sum += $_;
}

say $sum;

まずは、これをコミットします。
$ git add hello.pl
$ git commit -m"引数チェックを追加"
もしくは、
$ git commit -a -m"引数チェックを追加"
-aは変更のあったファイルをgit addしてくれるオプションです。

ところで、11行目にデバッグコードが存在してるのには、気が付いたでしょうか?
先にこのデバッグコードを削除してコミットしましょう。
直前のコミットの修正であれば、--amendオプションが使えます。
11行目を削除して、以下のコマンドを実行します。
$ git commit -a --amend -m"引数チェックを追加"
これで、直前のコミットが一旦、取り消されて、新しいコミットが追加されました。

ここまで合計3回コミットしました。
4回じゃないかって?--amendを使ったので、1回分は取り消されています。
それを確認するには、git guiを使って、
[リポジトリ]-[すべてのブランチの履歴を見る]で確認すると良いでしょう。
add_input_checkブランチがmasterブランチを追い越してる様子も確認できます。

次は、die;をする前に、使い方を表示します。

use strict;
use warnings;
use utf8;
use feature qw/say/;
use FindBin;

sub usage {
    say 'Usage:';
    say $FindBin::Script . ' [0-9999]';
}

if ( scalar(@ARGV) == 0 ) {
    usage();
    die; # 引数がない
}
elsif ( $ARGV[0] =~ /^\d{1,4}$/ ) {
    # 0〜9999までの数字が入力された
}
else {
    usage();
    die; # 0未満 or 9999より大きい
}

my $n = shift @ARGV;
my $sum = 0;
foreach (1..$n) {
    $sum += $_;
}

say $sum;

これをコミットしましょう。
$ git commit -a -m"dieする前に、Usageを表示するように変更"

これで、add_input_checkブランチにおける作業は終わりです。
この2つのコミットをmasterブランチにマージします。
そのためには、まずコミット先をmasterに切り替えます。
$ git checkout master
これによって、ファイルがmasterブランチにおける最新の状態になりました。
ファイルを開き直して、ファイルが変更されたことを確認してみましょう。

次に、add_input_checkブランチからmasterブランチにマージします。
$ git merge add_input_check

マージしたいコミットを選択したい場合や、
add_input_checkブランチをマージする前にmasterブランチを編集していない場合は、
やるべきことは、たったこれだけです。

もう一度、ファイルを開き直して、ファイルが変更されたことを確認してみましょう。
add_input_checkブランチで作業し終えた時と同じになっているはずです。

次に何が起こっているのか確認するために、Git Guiを立ち上げてみましょう。
先ほどと同様に、すべてのブランチの履歴を見てみます。
masterブランチがadd_input_checkブランチに追いついているのが確認できます。

これらの作業は、ローカルリポジトリ内で完結しているので、
ローカル・マージと言うようです。(*3)

あとは、リモートリポジトリにプッシュして、
不要になったadd_input_checkブランチを削除します。
$ git push
$ git branch -d add_input_check
-dは何を意味するでしょう?
--delete同様、ブランチの削除を意味します。

もし、ブランチで作業していた変更がボツになった等で、
マージしていないコミットが残ったままブランチを削除しようとすると、
マージが完了していない旨のメッセージが表示されて削除できません。
その場合は、-Dを使って削除します。

これで、すべての作業は完了です。
お疲れさまでした。

めでたし、めでたし。

(*1) 引用元はないです、強いて言うと脳内からです
(*2) この書き方が正確に表現できているかは自信ないです。。。
(*3) Git Guiでは、このように表示されています

Leave a Comment