Gitの基本

2015. 11. 13. 10:2999. 정리전 - IT/11. Java

  1. 출처 : 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桁の名前が付けられています。この名前を指定することで、リポジトリの中からコミットを指定することができます。

Tips

バグ修正や機能追加などの異なる意味を持つ変更は、できるだけ分けてコミットするようにしましょう。後から履歴を見て特定の変更内容を探す時に探しやすくなります。

コミットの実行時にはコミットメッセージの入力を求められます。コミットメッセージは必須となっているため、空のままで実行するとコミットが失敗します。

Tips

コメントは、他の人がコミットの変更内容を調べる場合や、自分で後から履歴を見直す際に大切な情報となるので、変更内容のわかりやすいコメントを書くように心がけましょう。 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にドロップします。

これでインストールは完了です。

SourceTreeというGUIクライアント







チュートリアル1 Gitの基本

初期設定

インストールしたGitに対して、自分のユーザ名とメールアドレスを登録しましょう。この作業はインストール後の一回だけ行えば大丈夫です。 これは、リポジトリに対してコミットした人の情報として履歴などに表示されます。

Mac

インストールしたSourceTreeを起動すると、セットアップウィザードが始まります。 次の画面の、「本名」と「メールアドレス」を入力してから「次の」ボタンをクリックします。

本名とメールアドレスを入力してから次のボタンをクリック

次の画面は、何も入力せずに「次の」ボタンをクリックします。

次のボタンをクリック

次の画面も、何も入力せずに「仕上げ」ボタンをクリックします。

仕上げボタンをクリック

これでセットアップは終了ばい!
次のページでリポジトリを作成してみんしゃい!






チュートリアル1 Gitの基本

新しいリポジトリを作成する

それでは、新しいリポジトリをローカルに作成します。ここでは、「tutorial」という名前で空のディレクトリを作成して、Gitの管理下に置きましょう。

以降のチュートリアルでもこのディレクトリを使って進めていきます。

Mac

まずは「tutorial」ディレクトリを好きな所に作成してください。
その後、SourceTreeを起動します。

ブックマーク一覧画面の左上の「Add Repository」ボタンをクリックします。もしくは、メニューバーから「ファイル」 > 「新規」を選択してください。

SourceTreeを起動

「リポジトリを作成」ボタンをクリックします。
ローカルリポジトリに設定するディレクトリと、SourceTree上で表示する名前を「ブックマーク名」に入力して作成ボタンをクリックします。

ここでは、tutorialディレクトリを「tutorial」というブックマーク名で登録しました。

リポジトリを作成

すると、ブックマークの一覧に今追加したリポジトリが表示されました。

ブックマークの一覧

次は、このリポジトリにファイルばコミットするばい!







チュートリアル1 Gitの基本

ファイルをコミットする

tutorialディレクトリに新しいファイルを追加して、リポジトリにファイルを登録してみましょう。

まずは、tutorialディレクトリの中に「sample.txt」という名前でテキストファイルを作成してください。ファイルの内容には、次のテキストを入力してください。

サルでもわかるGitコマンド

Mac

SourceTreeのブックマーク一覧画面で、先程追加したtutorialリポジトリをダブルクリックすると次のtutorialリポジトリの操作画面が表示されます。リポジトリに設定したディレクトリ内に、新しく追加したファイルや編集したファイルがあれば、左下の作業ツリーのファイル一覧に表示されます。

ここでは、新しく追加した「sample.txt」ファイルが表示されています。

リポジトリ画面

コミットに追加したいファイルを右クリックして、右クリックメニューから「Indexに追加」をクリックします。すると、選択したファイルが「Indexにステージしたファイル」一覧に移動されます。

Indexに追加をクリック

この状態で、ツールバーの「コミット」ボタンをクリックすると、次の画面が表示されるので「コミットメッセージ」を入力して「コミット」ボタンをクリックします。

コミットメッセージを入力してコミットボタンをクリック

コミットに成功していれば、「ブランチ」の「master」をクリックして表示したコミットログに今のコミットが新しく追加されています。

コミットが追加

次は、リポジトリをみんなで共有する方法について
説明するばい!







リポジトリの共有

リモートリポジトリにプッシュする

ここまでは、ローカルリポジトリの基本的な使い方を説明してきました。
ここからは、リモートリポジトリを使ってローカルリポジトリの変更履歴を共有する方法について説明します。

Push

リモートリポジトリで自分の手元のローカルリポジトリの変更履歴を共有するには、ローカルリポジトリ内の変更履歴をアップロードする必要があります。

そのために、Gitではプッシュ(Push)という操作を行います。 Pushを実行すると、リモートリポジトリに自分の変更履歴がアップロードされて、リモートリポジトリ内の変更履歴がローカルリポジトリの変更履歴と同じ状態になります。

Push






リポジトリの共有

リモートリポジトリをクローンする

誰かの変更履歴の入ったリモートリポジトリがあれば、それをまるごと複製して自分の手元で作業をすることができます。

Clone

リモートリポジトリを複製するには、クローン(Clone)という操作を行います。

クローンを実行すると、リモートリポジトリの内容をまるまるダウンロードしてきて、別のマシンにローカルリポジトリとして作成できます。

Note

クローンしたローカルリポジトリは変更履歴も複製されているので、
元々のリポジトリと全く同じように履歴の参照やコミットをすることが
できます。






リポジトリの共有

リモートリポジトリからプルする

リモートリポジトリを共有して複数人で作業すると、みんながリモートリポジトリにプッシュしていきます。すると、自分のローカルリポジトリに、ほかの人がプッシュした変更内容を取り込む必要があります。

Pull

リモートリポジトリからローカルリポジトリを更新するにはプル(Pull)という操作を行います。

Pullを実行すると、リモートリポジトリから最新の変更履歴をダウンロードしてきて、自分のローカルリポジトリにその内容を取り込みます。

Pull

次からチュートリアルばい!
Backlogのリモートリポジトリを使ってリポジトリを
共有してみんね!






チュートリアル2 リポジトリの共有

リモートリポジトリをBacklog上に作成する

まずはリモートリポジトリをBacklog上に作成しましょう。

Tips

Backlogでは、管理者権限のあるユーザからでないとGitリポジトリの作成ができません。自分のユーザが管理者権限を持っていない場合は、管理者権限を持っている方に頼んでリポジトリを作成してもらってください。
または、フリープランのBacklogスペースを取得してご利用ください。

スペースの取得はこちらから

まずは、Backlogにログインし、リポジトリを作成するプロジェクトのメニューから「Git」をクリックします。プロジェクトがまだ一つもない場合はプロジェクトを作成してください。

リポジトリを作成するプロジェクトから「Git」をクリック

Gitの項目が表示されていない場合は、Git機能を有効にするプロジェクトを選択し、「プロジェクト設定」 > 「Gitの設定」で、Git機能を有効にします。

Gitの設定で、Git機能を有効

Git機能を有効にしたら、同じくGitの設定画面より「リポジトリを追加する」をクリックします。

「リポジトリを追加する」をクリック

「リポジトリ名」と「説明」を入力して「リポジトリを作成する」ボタンをクリックします。ここでは、名前に「tutorial」、説明に「チュートリアル用です」と入力しました。

「リポジトリ名」と「説明」を入力して「リポジトリを作成する」ボタンをクリック

次の図のように、新しいリポジトリが追加されました。

新しいリポジトリが追加されました

次はこのリモートリポジトリにプッシュするばい!






チュートリアル2 リポジトリの共有

リモートリポジトリにプッシュする

「チュートリアル Gitの基本」で作成したローカルリポジトリ「tutorial」をプッシュしましょう。

Mac

SourceTreeを起動して、「tutorial」リポジトリを選択します。

「tutorial」リポジトリを選択

リポジトリ操作画面のツールバー右端にある「設定」ボタンをクリックします。

リポジトリ操作画面のツールバー右端の設定ボタンをクリック

次の画面が表示されるので「追加」ボタンをクリックします。

追加ボタンをクリック

「リモートの名前」に「origin」、「URL/パス」に前のページで作成したリモートリポジトリのURLを入力して「OK」ボタンをクリックします。

リモートリポジトリのURLを入力してOKボタンをクリック

認証を求められるので、Backlogのユーザ名とパスワードを入力します。

Backlogのユーザ名とパスワードを入力

リモートの一覧に今登録した「origin」が追加されました。これで、Backlogのリポジトリにpushする準備が完了しました。

「origin」が追加されました

Tips

コンソールの場合プッシュやプルは実行時にリモートリポジトリ名を省略すると、originという名前のリモートリポジトリを使用します。そのため、リモートリポジトリにはoriginという名前を付けるのが一般的です。

それでは、pushをしてみましょう。pushを実行するには、tutorialリポジトリ操作画面のツールバーの「プッシュ」ボタンをクリックします。

tutorialリポジトリ操作画面のツールバーのプッシュボタンをクリック

次のダイアログが表示されるので、「master」のチェックボックスを選択してから「OK」ボタンをクリックします。

masterのチェックボックスを選択してからOKボタンをクリック

プッシュが完了すると、コミットの説明にリモートリポジトリを表す「origin/master」が追加されました。

リモートリポジトリを表すorigin/masterが追加されました

BacklogのGitのページを開いてください。最近の更新にプッシュの項目が追加されています。

最近の更新にプッシュの項目が追加

リポジトリのファイル一覧には、pushしたリポジトリのファイルが追加されました。

pushしたリポジトリのファイルが追加

次はこのリモートリポジトリばクローンするばい!







チュートリアル2 リポジトリの共有

リモートリポジトリをクローンする

リモートリポジトリを複製して別の所でも作業ができるようにしてみましょう。

別のユーザになったつもりでリモートリポジトリば、別のディレクトリ「tutorial2」にクローンするばい。

Mac

SourceTreeのブックマーク一覧画面の左上の「Add Repository」ボタンをクリックします。もしくは、メニューバーから「ファイル」 >「新規を選択してください。」

SourceTreeを起動

「リポジトリをクローンボタン」をクリックします。
リモートリポジトリのURLとローカルリポジトリを保存するディレクトリを入力して作成ボタンをクリックします。

ここでは、前のページで作成したリモートリポジトリを、「tutorial2」というディレクトリ名でクローンします。

tutorial2というディレクトリ名でクローン

クローンしたリポジトリがブックマークの一覧に追加されました。

ブックマークの一覧に追加されました

複製したリポジトリ「tutorial2」内に、次の内容のsample.txtが存在しているか確認してください。

サルでもわかるGitコマンド






チュートリアル2 リポジトリの共有

クローンしたリポジトリからプッシュする

複製して作ったローカルリポジトリからもプッシュをしてみましょう。

Mac

tutorial2での作業
まずは、前のページで複製してきたリポジトリのディレクトリ内にあるsample.txtに、太字部分の内容を追加してからコミットしてください。

サルでもわかるGitコマンド
add 変更をインデックスに登録する

tutorial2での作業
ローカルリポジトリのコミットが一つ先に進みました。

ローカルリポジトリのコミットが一つ先に進みました

tutorial2での作業
次に、このコミットをプッシュします。ツールバーの「プッシュ」をクリックしてください。

ツールバーのプッシュをクリック

tutorial2での作業
次の画面が表示されるので、masterのチェックボックスが選択されているのを確認して「OK」ボタンをクリックします。

masterのチェックボックスが選択されているのを確認してOKボタンをクリック

tutorial2での作業
リモートリポジトリを表す「origin/master」のコミットも進みました。

origin/masterのコミットも進みました

Tips

一度コミットの位置についておさらいしてみましょう。

  • origin/master
    リモートリポジトリ「origin」のブランチ「master」の位置を表しています。
  • origin/HEAD
    リモートリポジトリ「origin」をクローンした時にダウンロードされるコミットの位置を表しています。
    通常「origin/master」と同じ位置を指します。
  • master
    ローカルリポジトリのブランチ「master」の位置を表しています。

ブランチについては発展編で詳しく説明します。

BacklogのGitのページを開いてください。最近の更新に今プッシュしたコミットが追加されています。

最近の更新に今プッシュしたコミットが追加







チュートリアル2 リポジトリの共有

リモートリポジトリからプルする

リモートリポジトリからtutorialに最新の変更内容を取り込みましょう。

Mac

前のページで「tutorial2」からリモートリポジトリにプッシュした内容を、「tutorial」に取り込んでみましょう。

tutorialでの作業
pullを実行するには、ツールバーの「プル」ボタンをクリックします。

ツールバーのプルボタンをクリック

tutorialでの作業
次の画面が表示されるので、そのままで「OK」ボタンをクリックします。

OKボタンをクリック

tutorialでの作業
「master」の位置がリモートリポジトリの「origin/master」と同じ位置まで進みました。

origin/masterと同じ位置まで進みました

tutorialでの作業
sample.txtファイルを開いて内容を確認してみましょう。

サルでもわかるGitコマンド
add 変更をインデックスに登録する

「add 変更をインデックスに登録する」が追加されています。





変更履歴の統合

変更履歴のマージ

マージ

マージ 例1

最後にpullを実行してから次のpushをするまでの間に、ほかの人がpushをしてリモートリポジトリを更新してしまっていた場合には、自分のpushが拒否されてしまいます。

マージ 例2

この場合、マージという作業を行なって他の履歴での変更を取り込むまで自分のpushは拒否されます。これは、マージを行わないまま履歴を上書きしてしまうと、ほかの人がpushした変更(図中のコミットC)が失われてしまうからです。

マージでは、Gitが変更箇所を自動的に統合してくれるとよ!
でも、自動では統合出来ない場合もあるっちゃんね。
次のページでは、手動で統合する方法を説明するばい!






変更履歴の統合

競合の解決

前ページで説明したように、マージを行うとGitが変更箇所を自動的に統合します。しかし、自動で統合できない場合もあります。

それは、リモートリポジトリとローカルリポジトリでファイル内の同じ箇所を変更していた場合です。この場合、どちらの変更を取り込むか自動では判断できないのでエラーが発生します。

競合が発生した箇所は、Gitがファイルの内容を次の図のように修正するので、手動で修正する必要があります。

競合の発生の例

==で区切られた上側がローカルリポジトリ、
下側がリモートリポジトリの編集内容ば表しとるとよ。

次の図のように、すべての競合箇所を修正してから、コミットを行うと変更を統合したコミットが作成されます。

競合の解決の例






チュートリアル3 変更履歴の統合

競合状態でプッシュする

まずは「tutorial」と「tutorial2」を使って競合状態を作ってみましょう。

Mac

tutorialでの作業
まずは、tutorialディレクトリのsample.txtを開いて、太字部分の内容を追加してからコミットしてください。

サルでもわかるGitコマンド
add 変更をインデックスに登録する
commit インデックスの状態を記録する

commit インデックスの状態を記録する

tutorial2での作業
次に、tutorial2ディレクトリのsample.txtを開いて、太字部分の内容を追加してからコミットしてください。

サルでもわかるGitコマンド
add 変更をインデックスに登録する
pull リモートリポジトリの内容を取得する

pull リモートリポジトリの内容を取得する

tutorial2での作業
そのままtutorial2から、リモートリポジトリにpushしましょう。

リモートリポジトリにpush

今、リモートリポジトリには3行目が
「pull リモートリポジトリの内容を取得する」
に変更された履歴が記録されているばい!

tutorialでの作業
今度は、tutorialから、リモートリポジトリにpushしましょう。

リモートリポジトリにpush

エラーが発生してプッシュを拒否(rejected)されてしまいました。






チュートリアル3 変更履歴の統合

競合を解決する

まずはpullを実行して、リモートリポジトリから最新の変更履歴を取得しましょう。

Mac

tutorialでの作業
ツールバーの「プル」ボタンをクリックしてpullを実行します。

pullを実行

tutorialでの作業
次の画面が表示されるので、そのままで「OK」ボタンをクリックします。

OKボタンをクリック

tutorialでの作業
マージ中に競合が発生したことを表すダイアログが表示されてしまいました。

マージ中に競合が発生

tutorialでの作業
sample.txtファイル開いて確認してみます。
Gitが競合の発生した箇所(太字部)に次のような修正を入れています。

サルでもわかるGitコマンド
add 変更をインデックスに登録する
<<<<<<< HEAD
commit インデックスの状態を記録する
=======
pull リモートリポジトリの内容を取得する
>>>>>>> 17c860612953c0f9d88f313c8dfbf7d858e02e91

修正しよう

ここでは、両方の変更を取り入れることにして、
余計なマーカ行は削除します。

サルでもわかるGitコマンド
add 変更をインデックスに登録する
commit インデックスの状態を記録する
pull リモートリポジトリの内容を取得する

tutorialでの作業
ファイルの内容を変更したのでコミットする必要があります。ファイルをインデックスに追加してから、「コミット」ボタンをクリックしてコミットしてください。

これでリモートリポジトリから最新の変更内容の取り込みが完了しました。

リモートリポジトリから最新の変更内容の取り込みが完了

この表示から、二つの変更を統合したことがわかります。

これで、前のページでは拒否されたプッシュができるようになりました。プッシュして確認してみましょう。

おつかれさま!これでGitの基本的な使い方の説明は終わりばい!
ブランチとかコミットの修正みたいな、もっと高度な内容を知りたかったら発展編を見らんね!