Gitについて簡単にまとめてみた

ツール

Gitとは?

Git(ギット)は、プログラムソースなどの様々なファイルの変更履歴を管理するためのバージョン管理システムの1つです。

バージョン管理システムはGit以外にCVSやSVN(Subversion)などがあります。

なぜバージョン管理が必要なのか

バージョン管理は今や開発にとって必要不可欠な存在です。なぜバージョン管理が必要なのか、その役割をまとめていきます。

変更内容を共有する

変更内容はコミットという単位で管理されます。このコミットの集まりをリポジトリといい、サーバーにリポジトリを置くことで変更内容を共有することができます。

コミットには変更内容と変更した人の情報をみることができます。コミットの単位でコードチェックなどを行うことも可能です。

状態を保持できる

コミットの単位でその時の状態を保持することができます。例えば余計な変更(コミット)をしてしまった場合に、以前の状態に簡単に戻すことができます。

プロジェクトの管理ができる

ブランチを利用することで本番環境と開発環境を簡単にわけることができます。またタグなどを利用することでリリースの状態を管理することもできます。

なぜGitなのか

Gitは今まで利用されていたCVSやSVNとは大きく異なるところがあります。

CVSやSVNは集中型といってサーバーにのみリポジトリがあり、ユーザーはそのリポジトリに対して直接コミットをしていきます。

対してGitは分散型といってサーバー以外にユーザーがそれぞれにリポジトリ(ローカルリポジトリ)を持ちます。そしてユーザーは自身が持つリポジトリに対してコミットをしていきます。サーバー側のリポジトリにコミットを反映させるには別の操作が必要になります。

基本的な考え方として、サーバーにあるリポジトリは正しい状態でなければいけません。正しい状態というのはエラー無く動作する状態ということです。仮にエラーがあり動作しなかった場合、他の開発者もそのエラーが直るまで開発を進められないという事態が発生します。

このことを考えた場合、集中型はコミット単位でサーバーリポジトリに反映されてしまうため、当然コミット単位で正しい状態を担保する必要があります。一方Gitはサーバーリポジトリの反映はコミットではなく別の操作で行うため、この操作の時に正しい状態が担保できていればいいのです。つまりコミット単位で正しい状態を担保しなくてもよくなります。

このことの何がうれしいのかというと、Gitはより細かい単位でコミットをすることができます。つまりより柔軟に状態を管理することができるということになります。

その他にもGitにはCVSやSVNに無い機能も備わっていたりします。あとは単純に世の中的にGitを利用率が高いですし、GitHubBitBucketといったサービスもあるので使えるようになって損はないです。むしろ技術者にとって必須スキルといっても過言ではないでしょう。

Gitのインストール

Gitのインストールについては過去記事を参考にしてください。

【Git入門】Gitの基礎知識とインストール方法についてちょこっと解説
Git(ギット)は、ファイルのバージョン管理を行うためのシステムの1つです。開発を行う上でバージョン管理は必要不可欠なものなので、基礎的な知識とGitインストールについて解説していきます。

Gitの基本

Gitはコマンドラインツールです。GitをインストールするとGit Bashというツール使用できるようになります。Git BashではLinuxのコマンドとなります。

コマンドと一緒にGitの基本的な考え方・操作を覚えましょう。

ローカルリポジトリの作成

ローカルリポジトリは、対象となるフォルダまで移動し以下のコマンドを実行します。

$ git init

フォルダ内に「.git」という隠しフォルダが作成されます。ここにリポジトリの情報などが保存されていきます。このフォルダを削除するとリポジトリとして判断されなくなるので注意しましょう。

変更内容のコミット

ローカルリポジトリに対し何かしらの変更を加えます。今回は「test.txt」を作成したとします。

変更内容を確認するためには以下のコマンドを実行します。

$ git status

Gitでコミットを行う場合にはまずコミットの対象を選択する必要があります。このことをステージ(stage)といいます。

$ git add test.txt

複数ファイル存在する場合はスペースで区切って追加します。すべての変更をステージする場合は「-A」オプションを指定します。

ステージをしたらもう一度「git status」を実行してみてください。先程と出力される内容が変わっていると思います。それがステージされている状態を表します。

ステージをキャンセルしたい場合はリセット(reset)を実行します。ファイルを指定しなかった場合はすべてのステージがキャンセルされます。

$ git reset test.txt

今までの例ではステージの対象はファイルですが、変更箇所ごとにステージすることができます。その場合は「-p」オプションを指定します。

$ git add -p test.txt

今回はtest.txtを作成したばかりなので動作しませんが、プロジェクトが進むにつれて必要なケースが出てくるかもしれません。

ステージができたら以下のコマンドでコミットを実行します。

$ git commit

実行するとviが起動し、コミットコメントを入力するようになります。viについての説明は割愛しますが、Gitのコミットコメントのルールとして、1行目はタイトル2行目は改行3行目以降に詳細を記載します。

1行目のタイトルは、コミットの一覧を参照する際に表示される内容になります。2行目の改行はタイトルと詳細を区別するためのものです。2行目から詳細を書き始めてしまうと、その行もタイトルとして扱われてしまうので注意しましょう。

コミットコメントはプロジェクト内で内容が共有できるようにルールを決めると良いでしょう。

コミット履歴の確認

コミットの履歴を確認するには以下のコマンドを実行します。

$ git log

「git log」には様々なオプションがあり、これを使いこなすことでコミット履歴を見やすく表示することができます。が、ここでは割愛します。

ブランチの作成

Gitにはブランチという仕組みがあり、これを利用することで管理する状態を増やすことができます。例えば本番の状態と現在開発している状態をブランチを分けることで管理します。

Gitには必ずベースとなる「master」ブランチが存在します。

例えばdevelopブランチを作成する場合は以下のコマンドを実行します。

$ git branch develop

ブランチを切り替える場合はチェックアウト(checkout)を実行します。

$ git checkout develop

ブランチから変更内容を反映

例えば開発が終了したのでdevelopブランチの内容を本番環境であるmasterに反映したいとします。方法としてはマージ(merge) 、リベース(rebase)チェリーピック(cherry pick) の3種類があります。

それぞれ図のような違いがあります。

マージ(merge)

$ git merge master develop

masterにdevelopの内容を反映します。ブランチ元(master)に変更がない場合は、masterとdevelopは同じ状態になります(ファストフォワード)。ブランチ元に変更がある場合は、新たにマージコミットが作成されます。

ファストフォワードの場合でも、意図的にマージコミットを作成することはできます。

リベース(rebase)

$ git rebase develop master

マージと同じくmasterにdevelopの内容を反映します。ブランチ元に変更がない場合はマージと同じ結果になります。しかし、ブランチ元に変更がある場合の結果は異なります。

イメージとしてmasterのコミットが一度取消され、反映元(develop)のコミットを反映した後に再度masterのコミットを反映し直します。

リベースを用いることでマージコミット作成せずにブランチの内容を反映させることができます。注意点として、リベースはリポジトリにコミットしていない変更がない場合にのみ実行できます。

チェリーピック(cherry pick)

$ git cherry-pick [commit id]

チェリーピックは他の二つとは違い、コミットを指定します。指定したコミットの変更内容を現在のブランチに別コミットとして反映します。

コミットにはコミットIDというのがあり、「git log」で確認することができます。

競合(Conflict)

別ブランチから変更を反映したりする場合に、同じ個所を変更しているとうまく変更が反映されません。これを競合(Conflict) といいます。

競合の解決についてはここでは割愛しますが、単純なものではありません。実際に競合が発生したらレベルダウンなど起こさないように注意しましょう。

コミットの取消

コミットを取り消す方法にはリセット(reset)リバート(revert)の2種類があります。

リセット(reset)

$ git reset [--hard | --mixed | --soft] [commit id]

リセットはステージのキャンセルにも使用しますが、コミットIDを指定することで指定したコミットより後のコミットをなかったことにします

リセットはオプションによってリセットの度合を変更します。「–hard」はコミットの情報とその変更内容を全て破棄します。「–mixed」と「–soft」はコミットは破棄しますが変更内容はそのまま残ります。「–soft」の場合はリセットした内容がステージされた状態になります。

リバート(revert)

$ git revert [commit id]

リバートは取消したいコミットを指定し、そのコミットに対する取消のコミットを作成します。意図的に取消したことを履歴として残したい場合などに使用します。

リモートリポジトリへの反映

リモートリポジトリはあらかじめ作成されている想定で話を進めます。リモートリポジトリはGitHubやBitBucketなどのサービスを利用することで自分でも作成することができます。

リモートリポジトリに反映する前に、対象のリモートリポジトリを指定する必要があります。リモートリポジトリにはURLが設定されています。これを以下のように追加することで対象のリモートリポジトリを追加することができます。

$ git remote add origin [url]

ここではリモートリポジトリはoriginとして定義しています。一般的にこの名前が使用されます。

ローカルリポジトリの内容をリモートリポジトリに反映することをプッシュ(push) といいます。先程追加したリモートリポジトリに対しプッシュするには以下のコマンドを実行します。

$ git push origin master

リモートリポジトリからローカルリポジトリを作成

複数人で開発する場合、既にリモートリポジトリが存在していれば、他の開発者はリモートリポジトリの内容をそのままにローカルリポジトリを作成することができます。このことをクローン(clone) といいます。

クローンを実行する場合は、先程も登場したリモートリポジトリのURLを指定します。

$ git clone [url]

リモートリポジトリからの反映

リモートリポジトリの内容をローカルリポジトリに反映する方法にはフェッチ(fetch)プル(pull) の2種類あります。

フェッチ(fetch)

$ git fetch origin

フェッチはリモートリポジトリの状態を取得します。フェッチによってローカルリポジトリに変更内容が反映されることはありません

プル(pull)

$ git pull origin master

プルはリモートリポジトリの状態を取得するとともに、変更内容をローカルリポジトリに反映します。イメージとしては、リモートリポジトリを別ブランチと考え、それをマージするといった感じです。

そのためリモートリポジトリとローカルリポジトリに差異がある場合は、マージコミットが作成されます

マージコミットを作成したくない場合は、1度コミットをリセットするか、プルリベースをします。プルリベースはプルのオプション「-rebase」で実行でき、基本的な考え方はブランチの時に説明したリベースと同じです。注意点も同じで、実行する際はコミットされていない変更が無い状態にしておく必要があります。

変更の退避

リベースを実行する際は何度もいうようにコミットされていない変更がない状態にしておく必要があります。このために変更を破棄したり、仮コミットをするのは面倒です。

このような場合にはスタッシュ(stash)を使用します。

$ git stash save             #退避
$ git stash list             #一覧表示
$ git stash apply stash@{0}  #適用

注意点として、スタッシュでは新規に作成したファイルやファイルを削除した場合の変更は退避されません。

Gitを簡単に使いこなすために

コマンドツールだとコマンドを覚えなければいけません。どうしても面倒だという人は、無料使えるGUIツールを紹介するので利用してみてください。

  • Fork
Fork - a fast and friendly git client for Mac and Windows
Fork - a fast and friendly git client for Mac and Windows
  • Sourcetree
Sourcetree | Free Git GUI for Mac and Windows
A Git GUI that offers a visual representation of your repositories. Sourcetree is a free Git client for Windows and Mac.
  • GitKraken
Free Git GUI Client - Windows, Mac, Linux | GitKraken
GitKraken is the best Git GUI client for Windows, Mac & Linux! Streamline your Git workflow by connecting GitHub, GitLab, Bitbucket or Azure DevOps repos & inte...

その他、Visual Studio CodeやEclipseといったIDEにアドオンとして備わっている場合もあります。ぜひ自分で使いやすいものを見つけてみてください。

 

- Gitのおすすめ書籍はコチラ -

コメント

タイトルとURLをコピーしました