2015. 11. 13. 10:29ㆍ99. 정리전 - IT/11. Java
출처 : http://www.backlog.jp/git-guide/stepup/stepup1_1.html
Gitの基本
はじめに
はじめまして。博多生まれGit育ちの「サル先生」ばい。
今日は一緒にバージョン管理システム「Git(ギット)」ば勉強するばい。
みなさんはファイルを編集前の状態に戻したい時、どのようにしていますか。
最も手軽なのは、あらかじめ編集前のファイルをコピーしておく方法です。 この方法の場合、ファイルやディレクトリ名に編集した日付を追加しておくことが多いです。しかし、ファイルを編集するごとに自分でファイルをコピーするというのは大変で、間違いも起こしやすくなります。
さらに、上の図のように無秩序に名前を付けてしまった場合、どのファイルが最新のものか区別できません。 また、チームで共有して作業しているファイルでは、編集者の名前を入れておくこともあります。しかし、どのような変更を行ったか簡単にはわかりません。
また、チームで共有しているファイルの場合では、二人で同時に編集してしまったために、先に編集した人の変更内容が消えてしまったという経験はないでしょうか。
このような問題を解決するために作られたのがGitなどのバージョン管理システムです。
Gitを使ったバージョン管理
Gitとは、分散型バージョン管理システムの一つで、もともとLinuxのソースコードを効果的に管理するために開発されました。
Gitでは、ファイルの状態を好きなときに更新履歴として保存しておくことができます。そのため、一度編集したファイルを過去の状態に戻したり、編集箇所の差分を表示したりすることができます。
また、古いファイルを元に編集したファイルで、他人の編集した最新ファイルを上書きしようとすると、サーバにアップロードした時に警告が出ます。そのため、知らず知らずのうちに他人の編集内容を上書きしてしまうといった失敗は起こりません。
Gitでファイルを管理すると、更新履歴がGitに保存されて行くばい。手元にバックアップ用のファイルのコピーを置く必要がなかけん、ちかっぱ(*1)スッキリばい!!
*1 ちかっぱ=すごく
履歴を管理するリポジトリ
リポジトリとは、ファイルやディレクトリの状態を記録する場所です。保存された状態は、内容の変更履歴として格納されています。変更履歴を管理したいディレクトリをリポジトリの管理下に置くことで、そのディレクトリ内のファイルやディレクトリの変更履歴を記録することができます。
リモートリポジトリとローカルリポジトリ
まず、Gitのリポジトリは、リモートリポジトリとローカルリポジトリの2種類に分けられます。
- リモートリポジトリ
専用のサーバに配置して複数人で共有するためのリポジトリです。 - ローカルリポジトリ
ユーザ一人ひとりが利用するために、自分の手元のマシン上に配置するリポジトリです。
リポジトリをリモートとローカルの2種類に分けることで、普段の作業はローカルリポジトリを使って全て手元のマシン上で行うことができます。
自分のローカルリポジトリで作業した内容を公開したい時は、リモートリポジトリにアップロードして公開します。また、リモートリポジトリを通してほかの人の作業内容を取得することもできます。
リポジトリの作成
自分の手元にローカルリポジトリを作成する方法は二種類あります。
一つ目は全く新しいリポジトリを作成する方法、二つ目はリモートリポジトリをコピーして作成する方法です。
次のページではコミットについて説明するばい!
変更を記録するコミット
ファイルやディレクトリの追加・変更を、リポジトリに記録するにはコミットという操作を行います。
コミットを実行すると、リポジトリの内では、前回コミットした時の状態から現在の状態までの差分を記録したコミット(またはリビジョン)と呼ばれるものが作成されます。
このコミットは、次の図のように時系列順につながった状態でリポジトリに格納されています。このコミットを最新の物から辿ることで、過去の変更履歴やその内容を知ることができるようになっています。
これらのコミットには、コミットの情報から計算された重複のない英数字40桁の名前が付けられています。この名前を指定することで、リポジトリの中からコミットを指定することができます。
バグ修正や機能追加などの異なる意味を持つ変更は、できるだけ分けてコミットするようにしましょう。後から履歴を見て特定の変更内容を探す時に探しやすくなります。
コミットの実行時にはコミットメッセージの入力を求められます。コミットメッセージは必須となっているため、空のままで実行するとコミットが失敗します。
コメントは、他の人がコミットの変更内容を調べる場合や、自分で後から履歴を見直す際に大切な情報となるので、変更内容のわかりやすいコメントを書くように心がけましょう。 Gitでは標準的に
1行目 : コミットでの変更内容の要約 2行目 : 空行 3行目以降 : 変更した理由
という形式でコメントを書きます。
リポジトリに変更を記録する
ワークツリーとインデックス
Gitでは、Gitの管理下に置かれた、みなさんが実際に作業をしているディレクトリのことをワークツリーと呼びます。
そして、Gitではリポジトリとワークツリーの間にはインデックスというものが存在しています。インデックスとは、リポジトリにコミットする準備をするための場所のことです。
Gitでは、コミットを実行した時にワークツリーから直接リポジトリ内に状態を記録するのでなく、その間に設けられているインデックスの設定された状態を記録するようになっています。
そのため、コミットでファイルの状態を記録するためには、まずインデックスにファイルを登録する必要があります。
このようにインデックスを間に挟むことで、ワークツリー内の必要ないファイルを含めずにコミットを行ったり、ファイルの一部の変更だけをインデックスに登録してコミットすることができます。
次からここまでの内容のチュートリアルばい!
Gitばインストールして、実際にコミットをやってみんね!
チュートリアル1 Gitの基本
Gitのインストール
チュートリアルに入る前に、まずはGitを利用するための環境を構築しましょう。ここでは、Windows(GUI)、Mac(GUI)、コンソール(コマンドライン)から環境を選択してインストールします。以降も選択したGitクライアントを使って説明を進めていきます。
開発者の人、コンソールに慣れとる人は、コンソールでGitにチャレンジしてみたらよかよ。
Mac
ここでは、日本語の使用できる無料のSourceTreeというクライアントを紹介します。
http://www.sourcetreeapp.com/
ダウンロードしてきたdmgファイルをダブルクリックし、SourceTreeをApplicationsにドロップします。
これでインストールは完了です。
チュートリアル1 Gitの基本
初期設定
インストールしたGitに対して、自分のユーザ名とメールアドレスを登録しましょう。この作業はインストール後の一回だけ行えば大丈夫です。 これは、リポジトリに対してコミットした人の情報として履歴などに表示されます。
Mac
インストールしたSourceTreeを起動すると、セットアップウィザードが始まります。 次の画面の、「本名」と「メールアドレス」を入力してから「次の」ボタンをクリックします。
次の画面は、何も入力せずに「次の」ボタンをクリックします。
次の画面も、何も入力せずに「仕上げ」ボタンをクリックします。
これでセットアップは終了ばい!
次のページでリポジトリを作成してみんしゃい!
チュートリアル1 Gitの基本
新しいリポジトリを作成する
それでは、新しいリポジトリをローカルに作成します。ここでは、「tutorial」という名前で空のディレクトリを作成して、Gitの管理下に置きましょう。
以降のチュートリアルでもこのディレクトリを使って進めていきます。
Mac
まずは「tutorial」ディレクトリを好きな所に作成してください。
その後、SourceTreeを起動します。
ブックマーク一覧画面の左上の「Add Repository」ボタンをクリックします。もしくは、メニューバーから「ファイル」 > 「新規」を選択してください。
「リポジトリを作成」ボタンをクリックします。
ローカルリポジトリに設定するディレクトリと、SourceTree上で表示する名前を「ブックマーク名」に入力して作成ボタンをクリックします。
ここでは、tutorialディレクトリを「tutorial」というブックマーク名で登録しました。
すると、ブックマークの一覧に今追加したリポジトリが表示されました。
次は、このリポジトリにファイルばコミットするばい!
チュートリアル1 Gitの基本
ファイルをコミットする
tutorialディレクトリに新しいファイルを追加して、リポジトリにファイルを登録してみましょう。
まずは、tutorialディレクトリの中に「sample.txt」という名前でテキストファイルを作成してください。ファイルの内容には、次のテキストを入力してください。
サルでもわかるGitコマンド
Mac
SourceTreeのブックマーク一覧画面で、先程追加したtutorialリポジトリをダブルクリックすると次のtutorialリポジトリの操作画面が表示されます。リポジトリに設定したディレクトリ内に、新しく追加したファイルや編集したファイルがあれば、左下の作業ツリーのファイル一覧に表示されます。
ここでは、新しく追加した「sample.txt」ファイルが表示されています。
コミットに追加したいファイルを右クリックして、右クリックメニューから「Indexに追加」をクリックします。すると、選択したファイルが「Indexにステージしたファイル」一覧に移動されます。
この状態で、ツールバーの「コミット」ボタンをクリックすると、次の画面が表示されるので「コミットメッセージ」を入力して「コミット」ボタンをクリックします。
コミットに成功していれば、「ブランチ」の「master」をクリックして表示したコミットログに今のコミットが新しく追加されています。
次は、リポジトリをみんなで共有する方法について
説明するばい!
リポジトリの共有
リモートリポジトリにプッシュする
ここまでは、ローカルリポジトリの基本的な使い方を説明してきました。
ここからは、リモートリポジトリを使ってローカルリポジトリの変更履歴を共有する方法について説明します。
Push
リモートリポジトリで自分の手元のローカルリポジトリの変更履歴を共有するには、ローカルリポジトリ内の変更履歴をアップロードする必要があります。
そのために、Gitではプッシュ(Push)という操作を行います。 Pushを実行すると、リモートリポジトリに自分の変更履歴がアップロードされて、リモートリポジトリ内の変更履歴がローカルリポジトリの変更履歴と同じ状態になります。
リポジトリの共有
リモートリポジトリをクローンする
誰かの変更履歴の入ったリモートリポジトリがあれば、それをまるごと複製して自分の手元で作業をすることができます。
Clone
リモートリポジトリを複製するには、クローン(Clone)という操作を行います。
クローンを実行すると、リモートリポジトリの内容をまるまるダウンロードしてきて、別のマシンにローカルリポジトリとして作成できます。
クローンしたローカルリポジトリは変更履歴も複製されているので、
元々のリポジトリと全く同じように履歴の参照やコミットをすることが
できます。
リポジトリの共有
リモートリポジトリからプルする
リモートリポジトリを共有して複数人で作業すると、みんながリモートリポジトリにプッシュしていきます。すると、自分のローカルリポジトリに、ほかの人がプッシュした変更内容を取り込む必要があります。
Pull
リモートリポジトリからローカルリポジトリを更新するにはプル(Pull)という操作を行います。
Pullを実行すると、リモートリポジトリから最新の変更履歴をダウンロードしてきて、自分のローカルリポジトリにその内容を取り込みます。
次からチュートリアルばい!
Backlogのリモートリポジトリを使ってリポジトリを
共有してみんね!
チュートリアル2 リポジトリの共有
リモートリポジトリをBacklog上に作成する
まずはリモートリポジトリをBacklog上に作成しましょう。
Backlogでは、管理者権限のあるユーザからでないとGitリポジトリの作成ができません。自分のユーザが管理者権限を持っていない場合は、管理者権限を持っている方に頼んでリポジトリを作成してもらってください。
または、フリープランのBacklogスペースを取得してご利用ください。
まずは、Backlogにログインし、リポジトリを作成するプロジェクトのメニューから「Git」をクリックします。プロジェクトがまだ一つもない場合はプロジェクトを作成してください。
Gitの項目が表示されていない場合は、Git機能を有効にするプロジェクトを選択し、「プロジェクト設定」 > 「Gitの設定」で、Git機能を有効にします。
Git機能を有効にしたら、同じくGitの設定画面より「リポジトリを追加する」をクリックします。
「リポジトリ名」と「説明」を入力して「リポジトリを作成する」ボタンをクリックします。ここでは、名前に「tutorial」、説明に「チュートリアル用です」と入力しました。
次の図のように、新しいリポジトリが追加されました。
次はこのリモートリポジトリにプッシュするばい!
チュートリアル2 リポジトリの共有
リモートリポジトリにプッシュする
「チュートリアル Gitの基本」で作成したローカルリポジトリ「tutorial」をプッシュしましょう。
Mac
SourceTreeを起動して、「tutorial」リポジトリを選択します。
リポジトリ操作画面のツールバー右端にある「設定」ボタンをクリックします。
次の画面が表示されるので「追加」ボタンをクリックします。
「リモートの名前」に「origin」、「URL/パス」に前のページで作成したリモートリポジトリのURLを入力して「OK」ボタンをクリックします。
認証を求められるので、Backlogのユーザ名とパスワードを入力します。
リモートの一覧に今登録した「origin」が追加されました。これで、Backlogのリポジトリにpushする準備が完了しました。
コンソールの場合プッシュやプルは実行時にリモートリポジトリ名を省略すると、originという名前のリモートリポジトリを使用します。そのため、リモートリポジトリにはoriginという名前を付けるのが一般的です。
それでは、pushをしてみましょう。pushを実行するには、tutorialリポジトリ操作画面のツールバーの「プッシュ」ボタンをクリックします。
次のダイアログが表示されるので、「master」のチェックボックスを選択してから「OK」ボタンをクリックします。
プッシュが完了すると、コミットの説明にリモートリポジトリを表す「origin/master」が追加されました。
BacklogのGitのページを開いてください。最近の更新にプッシュの項目が追加されています。
リポジトリのファイル一覧には、pushしたリポジトリのファイルが追加されました。
次はこのリモートリポジトリばクローンするばい!
チュートリアル2 リポジトリの共有
リモートリポジトリをクローンする
リモートリポジトリを複製して別の所でも作業ができるようにしてみましょう。
別のユーザになったつもりでリモートリポジトリば、別のディレクトリ「tutorial2」にクローンするばい。
Mac
SourceTreeのブックマーク一覧画面の左上の「Add Repository」ボタンをクリックします。もしくは、メニューバーから「ファイル」 >「新規を選択してください。」
「リポジトリをクローンボタン」をクリックします。
リモートリポジトリのURLとローカルリポジトリを保存するディレクトリを入力して作成ボタンをクリックします。
ここでは、前のページで作成したリモートリポジトリを、「tutorial2」というディレクトリ名でクローンします。
クローンしたリポジトリがブックマークの一覧に追加されました。
複製したリポジトリ「tutorial2」内に、次の内容のsample.txtが存在しているか確認してください。
サルでもわかるGitコマンド
チュートリアル2 リポジトリの共有
クローンしたリポジトリからプッシュする
複製して作ったローカルリポジトリからもプッシュをしてみましょう。
Mac
tutorial2での作業
まずは、前のページで複製してきたリポジトリのディレクトリ内にあるsample.txtに、太字部分の内容を追加してからコミットしてください。
サルでもわかるGitコマンド add 変更をインデックスに登録する
tutorial2での作業
ローカルリポジトリのコミットが一つ先に進みました。
tutorial2での作業
次に、このコミットをプッシュします。ツールバーの「プッシュ」をクリックしてください。
tutorial2での作業
次の画面が表示されるので、masterのチェックボックスが選択されているのを確認して「OK」ボタンをクリックします。
tutorial2での作業
リモートリポジトリを表す「origin/master」のコミットも進みました。
一度コミットの位置についておさらいしてみましょう。
- origin/master
リモートリポジトリ「origin」のブランチ「master」の位置を表しています。 - origin/HEAD
リモートリポジトリ「origin」をクローンした時にダウンロードされるコミットの位置を表しています。
通常「origin/master」と同じ位置を指します。 - master
ローカルリポジトリのブランチ「master」の位置を表しています。
ブランチについては発展編で詳しく説明します。
BacklogのGitのページを開いてください。最近の更新に今プッシュしたコミットが追加されています。
チュートリアル2 リポジトリの共有
リモートリポジトリからプルする
リモートリポジトリからtutorialに最新の変更内容を取り込みましょう。
Mac
前のページで「tutorial2」からリモートリポジトリにプッシュした内容を、「tutorial」に取り込んでみましょう。
tutorialでの作業
pullを実行するには、ツールバーの「プル」ボタンをクリックします。
tutorialでの作業
次の画面が表示されるので、そのままで「OK」ボタンをクリックします。
tutorialでの作業
「master」の位置がリモートリポジトリの「origin/master」と同じ位置まで進みました。
tutorialでの作業
sample.txtファイルを開いて内容を確認してみましょう。
サルでもわかるGitコマンド add 変更をインデックスに登録する
「add 変更をインデックスに登録する」が追加されています。
変更履歴の統合
変更履歴のマージ
マージ
最後にpullを実行してから次のpushをするまでの間に、ほかの人がpushをしてリモートリポジトリを更新してしまっていた場合には、自分のpushが拒否されてしまいます。
この場合、マージという作業を行なって他の履歴での変更を取り込むまで自分のpushは拒否されます。これは、マージを行わないまま履歴を上書きしてしまうと、ほかの人がpushした変更(図中のコミットC)が失われてしまうからです。
マージでは、Gitが変更箇所を自動的に統合してくれるとよ!
でも、自動では統合出来ない場合もあるっちゃんね。
次のページでは、手動で統合する方法を説明するばい!
変更履歴の統合
競合の解決
前ページで説明したように、マージを行うとGitが変更箇所を自動的に統合します。しかし、自動で統合できない場合もあります。
それは、リモートリポジトリとローカルリポジトリでファイル内の同じ箇所を変更していた場合です。この場合、どちらの変更を取り込むか自動では判断できないのでエラーが発生します。
競合が発生した箇所は、Gitがファイルの内容を次の図のように修正するので、手動で修正する必要があります。
==で区切られた上側がローカルリポジトリ、
下側がリモートリポジトリの編集内容ば表しとるとよ。
次の図のように、すべての競合箇所を修正してから、コミットを行うと変更を統合したコミットが作成されます。
チュートリアル3 変更履歴の統合
競合状態でプッシュする
まずは「tutorial」と「tutorial2」を使って競合状態を作ってみましょう。
Mac
tutorialでの作業
まずは、tutorialディレクトリのsample.txtを開いて、太字部分の内容を追加してからコミットしてください。
サルでもわかるGitコマンド add 変更をインデックスに登録する commit インデックスの状態を記録する
tutorial2での作業
次に、tutorial2ディレクトリのsample.txtを開いて、太字部分の内容を追加してからコミットしてください。
サルでもわかるGitコマンド add 変更をインデックスに登録する pull リモートリポジトリの内容を取得する
tutorial2での作業
そのままtutorial2から、リモートリポジトリにpushしましょう。
今、リモートリポジトリには3行目が
「pull リモートリポジトリの内容を取得する」
に変更された履歴が記録されているばい!
tutorialでの作業
今度は、tutorialから、リモートリポジトリにpushしましょう。
エラーが発生してプッシュを拒否(rejected)されてしまいました。
チュートリアル3 変更履歴の統合
競合を解決する
まずはpullを実行して、リモートリポジトリから最新の変更履歴を取得しましょう。
Mac
tutorialでの作業
ツールバーの「プル」ボタンをクリックしてpullを実行します。
tutorialでの作業
次の画面が表示されるので、そのままで「OK」ボタンをクリックします。
tutorialでの作業
マージ中に競合が発生したことを表すダイアログが表示されてしまいました。
tutorialでの作業
sample.txtファイル開いて確認してみます。
Gitが競合の発生した箇所(太字部)に次のような修正を入れています。
サルでもわかるGitコマンド add 変更をインデックスに登録する <<<<<<< HEAD commit インデックスの状態を記録する ======= pull リモートリポジトリの内容を取得する >>>>>>> 17c860612953c0f9d88f313c8dfbf7d858e02e91
ここでは、両方の変更を取り入れることにして、
余計なマーカ行は削除します。
サルでもわかるGitコマンド add 変更をインデックスに登録する commit インデックスの状態を記録する pull リモートリポジトリの内容を取得する
tutorialでの作業
ファイルの内容を変更したのでコミットする必要があります。ファイルをインデックスに追加してから、「コミット」ボタンをクリックしてコミットしてください。
これでリモートリポジトリから最新の変更内容の取り込みが完了しました。
この表示から、二つの変更を統合したことがわかります。
これで、前のページでは拒否されたプッシュができるようになりました。プッシュして確認してみましょう。
おつかれさま!これでGitの基本的な使い方の説明は終わりばい!
ブランチとかコミットの修正みたいな、もっと高度な内容を知りたかったら発展編を見らんね!