1人でGitを使う話

直前の記事に引き続き、カジュアルにGitを使う話をしようと思います。
Hokkaido.pm Casual#12で伝えきれなかった内容とかですね。

基本的に開発は、Dropboxが自動で同期してくれるフォルダか、
その日の作業を終えたときにバックアップを取るフォルダで行うわけですが、
さらにGitを使って中央リポジトリで管理することで、
バックアップ対象と、そうでないフォルダ間のコピーが簡単にできます。
もちろん、Dropboxによる同期が行われるフォルダの中ですべてやれば完璧なのですが、
容量の問題だったり、転送量の問題もあると思うので、
リポジトリだけでもDropboxに置いとくと、他のPCでも作業が出来て便利ですね。

という訳なので、例えばこんな感じのフォルダ構成を用意します。

Projects
├── Dropbox
│   └── Repo
├── Repo
└── Work

だいたい何をやろうとしてるか分かると思いますが、
“Projects/Work”の中で作業した内容を、
“Projects/Repo”と”Projects/Dropbox/Repo”に反映して、
片方はDropboxによる同期を取ろうとしてるわけですね。

さて、さっそく”Projects/Work”の中で作業しようと思います。
いきなり、git init --bareを行っても良いのですが、
そもそも、バージョン管理を念頭に置いて作業なんかしないですよね?
「最初はワンライナーでやってたけど、小っちゃいスクリプトファイル書いて、
ちょっと大きくなってきたし、バージョン管理しようかなー。」っていう意味です。

という訳で、こんな感じのスクリプトを用意してみました。

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

my $n = shift @ARGV or die;
my $sum = 0;
for (my $i=1; $i<=$n; $i++) {
    $sum += $i;
}

say $sum;

引数に数字を1つとって、その数字が3の場合は、1+2+3の結果を出力するスクリプトです。
もっと良い方法がありそうなので、その変更を管理してみようと思います。

まず、プロジェクト名を”Hello”とし、”Hello”フォルダを作って、
先ほどのスクリプトをMacVimで”hello.pl”に保存すると、以下のようになりました。

Projects
├── Dropbox
│   └── Repo
├── Repo
└── Work
    └── Hello
        ├── hello.pl
        └── hello.pl~

次に、”Projects/Work/Hello”以下をバージョン管理したいので、
$ cd Projects/Work/Hello
$ git init
これで、”Hello”フォルダの中を、Gitで管理できるようになりました。
$ ls -a
を使うと、”.git”が存在すると思います。(*1)

次に、”hello.pl”をコミットしましょう。
$ git status
で、”hello.pl”が管理対象に含まれてないことが分かると思います。

これから行うコミットに、”hello.plのバージョン管理開始”を含めたいので、
$ git add hello.pl
を実行します。

もう一度、
$ git status
を入力すると、コミットすべき内容はあるが、
まだ、コミットされていない旨が表示されると思います。
同時に、コミットすべき内容から”hello.plのバージョン管理開始”を削除する方法も、
表示されていると思います。

$ git commit -m"初回コミット"
これで、コミットが完了しました。

なんのことはないですね、
これによって、これからいくら編集しても、
コミットした時の内容に戻せるようになったのです。
もし、この手順を繰り返したければ、”.git”を削除すればいいのです。
気が変わって、バージョン管理するのを中止する場合も同じです。

さて、ちょっと気になる部分を修正してみました。

-for (my $i=1; $i<=$n; $i++) {
-    $sum += $i;
+foreach (1..$n) {
+    $sum += $_;

この変更をコミットしてみようと思います。
$ git commit -a
-aは変更をすべて適用するためのオプションです。
そして、-mによるコミットログが指定されていないので、
この直後にコミットログの入力が求められます。
なので、このように入力しました。

リファクタリング
    
 - foreachを使って書き直し

Gitでは、2行目の空行は意味があって、
最初の空行までがコミットログのタイトルとして扱われます。
ところで、ここまでずっとコマンドラインで作業してますが、
ファイルを追加したり、コミットするだけなら、
Git Guiも便利なので、個人的にはGit Guiを愛用しています。(*2)

次に、中央リポジトリを作って、そこに反映することを考えてみます。
例えば、このフォルダをファイルサーバーにコピーするのも手ですが、
必要なファイルだけ、コマンド1つでコピーできるなら使わない手はないですよね?

では、中央リポジトリを作ります。
$ cd Projects/Repo
$ mkdir Hello
$ cd Hello
$ git init --bare
これで、中央リポジトリができました。

次に、作業中のリポジトリに、リモートリポジトリとして登録します。
$ cd Projects/Work/Hello
$ git remote add origin ../../Repo/Hello
これで、登録は完了です。
以下のコマンドで、登録されたことを確認することができます。
$ git remote
今回は、originという名前で登録したので、”origin”が出力されます。

次に、現在のコミット先のブランチを、中央リポジトリに反映します。
ここで初めて「ブランチ」という単語が出てきました。
まず、以下のコマンドを実行して、Git Guiを立ち上げます。
$ git gui

そして、[ファイル]-[ブランチ master の履歴を見る]を選択します。
まだ、2回しかコミットしていなので、2点しか表示されていませんが、
コミット順に点をつないだ線のことをブランチと言います。
整理すると、git initして、変更をコミットすると、
masterブランチができて、そこにコミットされていた訳です。

では、一旦、GUIを閉じて、以下のコマンドを実行します。
$ git branch
すると、”* master”が表示されます。(*3)
このリポジトリには、masterブランチが存在することが確認できました。

次に、このmasterブランチを、
リモートリポジトリとして登録したoriginに反映したいと思います。
この反映する作業は、今後「プッシュ」と表現します。
$ git push origin master
これで、プッシュは完了です。
ちなみに、以下の方法で確認することができます。
$ git branch -r
この-rはリモートを意味し、
登録済みのリモートリポジトリにあるブランチ一覧が表示されます。
今回は、originにmasterブランチを登録したので、
“origin/master”が表示されます。

同様の方法で、”Dropbox/Repo”にも中央リポジトリを作って、
それをリモートリポジトリとして登録して、Dropboxに同期させようと思います。
$ cd Projects/Dropbox/Repo
$ mkdir Hello
$ cd Hello
$ git init --bare
$ cd Projects/Work/Hello
$ git remote add dropbox ../../Dropbox/Repo/Hello
これでdropboxという名前でリモートリポジトリを追加することが出来ました。
確認方法は前回と同じで、
$ git remote
で、確認できます。

次に、このリモートリポジトリにもmasterブランチをプッシュします。
$ git push dropbox master
確認方法は、
$ git branch -r
です。

既存の中央リポジトリからcloneした場合と違って、
git pushのみ実行すると、以下のようなメッセージが表示されます。(*4)
fatal: The current branch master has no upstream branch.
To push the current branch and set the remote as upstream, use

git push –set-upstream origin master

なので、今後はgit pushのみで任意のリモートリポジトリにプッシュするには、
以下のコマンドを実行します。
$ git push --set-upstream origin master
この例では、originにプッシュが行われると同時に、
今後はgit pushのみでoriginにプッシュされるような設定が行われました。
このタイミングでgit pushを実行すると、
まだ何もコミットしていないので、”Everything up-to-date”が表示されます。

もし、”warning: push.default is unset〜“が表示される場合は、
こちらを読んで解決してい頂ければと思います。

おしまい。

(*1) Windowsの場合は、隠しファイルを表示することで確認できます
(*2) Macの場合は、Source Treeを使ってます
(*3) “* master”の*印の意味は、そのうち説明します
(*4) “push.default”の設定によっては、実行結果は異なります

参考にさせて貰ったページ
1. [git] コミットメッセージの最初の空行までがsubjectです。 – blog.aklaswad.com
2. git remote リポジトリを複数登録する – bayashi.net

Leave a Comment