バージョン管理Tweetこんにちは、アシアルの志田です。社内でもgitが浸透し、皆バージョン管理といえばgitだよね、という空気になってきました。「そもそもバージョン管理して何が嬉しいの?なんか難しそうでいやだ」というような反応ばかりでした。今回はgit入門の入門、gitってなんだ?というところから、簡単にgitを使う際の流れについてご説明します。不安を覚えるようなイラストがついていますので、頑張って読んでください。バージョン管理ってなに?プログラムを書いていて、こんなことありませんか?私はあります...何度も...・修正前は動いていたのに!・ああ、数時間前のコードに戻りたい...・別の人のコードを古いコードで上書きしちゃった!!やばい...・こっちは本番用、こっちは開発用。どれがどこまで最新だっけ...?戻りたい!戻れない!大変だ!こんなとき、バージョン(履歴)を管理しておくのがいいんです。バージョン管理をするには?じゃあその、バージョン管理をするには何が必要でしょうか?そこで、バージョン管理システムが必要になってきます。前まではSubversion(サブバージョン)が主流でした。現在はgit(ギット)が主流です。みんな!便利なgitを使おうよ!gitはLinuxカーネルの開発にも使われているのです。Subversionとはではgitについて勉強する前に、Subversionについて触れておきましょう。Subversionとは、集中型バージョン管理システムという分類にあたるシステムです。サーバ上に「中央リポジトリ」を作り、そこからソースコードを取得する。ファイルをロックして、他人から編集されないようにもできるここで、不明な単語「リポジトリ」について説明します。リポジトリとは、訳すと「貯蔵庫」という意味になります。いろいろな情報、例えば、ソースコードそのものや、誰が編集したか?どのように編集したか?といった履歴(バージョン)などが保持されています。「コミット」というのは、ドラクエでいう「セーブ」のことです。修正した内容や、新規作成したファイルをセーブすることを、バージョン管理システムでは格好良く「コミット」と言います。このコミットは、機能ごとに行うことが多いです。これがコミットするっていうこと!SubversionのデメリットSubversionには、中央集中だからこそ起こるいろいろなデメリットがあります。代表的なものが、サーバに接続できない環境だと、最新のソースコードが取得できないというものです。社内でのみ開発するならば問題ないかもしれませんが、サーバに接続できない場所でもコードが書きたいときもありますよね。サーバに接続できなければ編集もできないのは不便です。それに、サーバがダウンし、データが全部吹っ飛んでしまったら、泣くしかないです...。他者から編集されるのを防ぐロック機能があるとご説明しましたが、ロックしたまま放置されると、その間誰もそのファイルを編集できなくて不便です。gitとはここで、gitの出番です!gitは分散型バージョン管理システムに分類されるシステムです。その名の通り、リポジトリが分散しています。自分のPC上、ローカル環境で編集して、自分のリポジトリにコミットしていきます。複数人での開発gitを使って複数人で開発するときはこんなかんじです。pullすると自動的にマージされ、自分+他人の最新コードになる(3)の、マージというのがイメージしづらいかもしれません。ポケモンでいうと、サトシがイッシュ地方でポケモンを捕まえたセーブデータ(コミット内容)があり、タケシがジョウト地方でポケモンを捕まえたセーブデータ(コミット内容)があるという状態を想像してください。サトシがタケシのセーブをpullすると、マージされ、タケシの捕まえたポケモンのデータまで、サトシのポケモン図鑑やパソコンに保存されるということです。(※余計わかりづらいですか?がんばってください!)・・・でもこれって、サトシとタケシだけのときはいいですけど、カスミもムサシもコジロウも参加したら、どうなっちゃうでしょうか。いちいち、自分のコミット内容をpullしてくれとみんなに言うのは面倒ですよね。gitとSubversionのいいとこどりをしよう!・普段はローカルで開発、コミットをして(gitのいいところ)・キリのいいところで中央リポジトリにpush(Subversionのいいところ)...こうしたら、きっと中央リポジトリを介して、カスミとムサシとコジロウもpushしたりpullしたりできるはず。gitでそれを実現するには、共有リポジトリを置けばOK!!これで、共有リポジトリを介して他人のコードをpullできるようになりました。pullしたりpushしたりすると、自分のリポジトリも共有リポジトリも最新版になります。共有リポジトリのサーバが爆発しても、誰かが持っている最新版のリポジトリからコピーすればいいんです。便利ですね!では、どんな流れでgitをはじめて、どういう流れで使っていくのかについて、説明します。gitプロジェクト作成まず、gitで管理する空のディレクトリを作ります。initと入力すると、.gitというディレクトリができて、git管理下になります。.gitディレクトリとは、個人リポジトリの管理ファイルやpush先の情報など、要するに大事なディレクトリなのです。.gitディレクトリを消せば、すぐにgit管理をやめることができます。ディレクトリのトップに.gitがあるだけで、それ以下の入れ子のディレクトリまですべて管理することができます!Subversionだと、管理下に入れこのディレクトリを作ると、.svnというディレクトリがたくさんできてしまい、ちょっと煩雑です。ファイルの作成git管理下のディレクトリにファイルを作成します。作っただけではgit管理にはなりません。コマンドを入力すると、現在の状態がわかります。file(gitがトラックしていないファイル=未管理のファイル)と表示が出ます。track)「こういうファイルを作ったので、gitが管理してね」と通達する必要があります。ファイルを管理対象にするでは、作ったファイルをgitに管理させましょう。コマンドを打つと、そのファイルが管理対象になります。commited(コミットされる変更点=このファイルがコミットできすよー!)という状態になっています。コマンドは新規作成時のほか、編集時にも行う必要があります。管理対象になっているファイルでも、変更したからコミットするのだ!追加してくれ!というイメージです。commitでコミットします。コミットすることで、新しいセーブデータとして保存されます。ドラクエと違うのは、古いセーブデータも残っていることと、コミットメッセージが残せることです。選択肢はいいえを押すこと」といった、コミットに対するメッセージが残せるかんじです。することで、ボスを倒したあとで、「いややっぱり中ボスからやり直したい」と思ったら、コミットメッセージを参考に中ボス前のデータまで戻ればいいのです。pushするプッシュすることで、これまでのコミット内容を共有リポジトリに送ることができます。pushした後も開発は続き、コミット内容もたまっていきますね。すると、次回pushするのは、前回pushした内容より新しいコミット達です。未pushのデータをどんどんpushしていきます。pullするみんなの更新内容を取得してくるのがpullです。自分以外の開発者たちも、皆それぞれpushを繰り返しています。pullすることで、自分のコードと他人のコードがマージされ、最新の状態にすることができます。他人と同じところを編集していたらどうでしょうか?他人とかち合ってしまうことを「コンフリクト」といいます。コンフリクトが起きたときは、gitがそう教えてくれるので自分と他人のコードのどちらを生かすか決めます。(gitにはどちらのコードを優先すべきかわからないので、コンフリクトが起きたことはわかっても、解消まではできません)おさらい!・gitは便利なバージョン管理システム・自分の編集内容をcommitし、共有リポジトリへpushしていく・共有リポジトリからpullし、他人のコードを取得する以上が、gitを使うときの基本的な流れになります。導入してみると、「どうして今までバージョン管理をしてなかったんだろう!?」と思うくらい変わりますよ!gitに助けられたこと、何回もあります。みなさんも、gitを使ってみてくださいね。byスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。