初心者のためのやさしいGit
はじめに
4月に新入社員が入ってきて、「Gitですか…?初めて聞きました…!」という人に教える機会があり、改めて自分も調べ直したりとかしたので、ここにまとめておこうと思います📝
(自分も完璧という訳ではないので、間違っているところ等ありましたら、やさしく教えていただけたら嬉しいです…!)
Gitって何?
Gitとは、プログラムのソースコードなどの変更履歴を記録・追跡するための分散型バージョン管理システムです。
「分散型…?」
「バージョン管理システム…?」
既にもうその言葉がわからない……と言う人のために先に「バージョン管理システム」「分散型」について説明します。
バージョン管理システムとは
まず、ファイルの変更履歴(=バージョン)を管理することを「バージョン管理」と呼んでいます。
バージョン管理をすることで、過去の変更箇所を確認する、ある時点の内容に戻すことができます。
これができると何が良いのか、例を出して考えてみましょう。
あなたは1週間前からいろいろと試行錯誤しながらコードを書いています。
いろいろとやってみた結果、5日前に書いたコードに一旦戻したいとなりました。
バージョン管理してない場合
「え…5日前って何を変更してたっけ…?」
「戻したいけど上書き保存しちゃったよ〜」
「5日前の状態のコードってどこにもなくね…」
「……」
「「「「「 絶望 」」」」」バージョン管理している場合
「一旦5日前に書いたコードを確認しよう!」
「あー結構今と違うところあるなあー」
「よし!5日前の状態にまるまる戻してしまおう」
<めでたしめでたし>
ということで、今までどんな変更をしたか確認したり、一旦元に戻したりするのにとても便利なのです。
逆に、バージョン管理システムを使わずにファイルを元に戻せるように管理していこうとなると大量のバックアップをしなければいけなくなってしまいます。
また、バージョン管理システムを使って管理をしていくことで、
「いつ」「誰が」「何をした」
のかが記録されていくため、チームで開発をする際に連携しやすくなります。
「分散型」バージョン管理システム
バージョン管理システムには「集中型」と「分散型」があります。
バージョン管理システムでファイルと履歴情報を保管するための場所(データベース)のことをリポジトリと呼びます。
「集中型」
「集中型」は特定のリポジトリに接続した状態でないといけません。
この場合の「特定のリポジトリ」はサーバー上にあるので、オフラインの状態ではリポジトリの取得・反映をすることができません。
例)CVS、Subversionなど
「分散型」
「分散型」では自分の手元で保管するため「ローカルリポジトリ」とそれらを集約した「リモートリポジトリ」があります。
なので、ある程度「ローカルリポジトリ」で開発を進めてから「リモートリポジトリ」に反映することができるので、オフラインでの開発はもちろん、複数人で進めた開発を集約しやすい形になっています。
例)Git、Mercurialなど
主なGitホスティングサービス
Gitを使う時には本来であれば専用のサーバーが必要ですが、ホスティングサービス(提供元のサーバーをインターネット経由で貸し出すサービス)を使うと便利です。
主なホスティングサービスには以下のものがあります。
- GitHub(https://github.co.jp/)
- GitLab(https://about.gitlab.com/ja-jp/)
-
BitBucket(https://bitbucket.org/product/ja)
それぞれのメリットがあるので、使う環境・用途に合わせて合ったものを選びましょう。
Gitの操作
Gitを操作するには「CUI」と「GUI」の2つの方法があります。
CUIとは
CUI(Character-based User Interface / キャラクタユーザインターフェース)とは、キーボードなどで文字列を入力して操作するユーザインターフェース。
※ユーザインターフェース : ユーザーと機械をつなぐ接点
映画やドラマでプログラマが黒い画面に文字をカタカタ打ち込んでいるあれをイメージしておけば一旦はOKだと思います。
CUIでGitを操作する場合は、gitコマンド(Gitを操作するための指令)を入力して操作します。
<CUIでGitを使うメリット>
- 使い方がツールに依存しないかつコマンドラインでの使い方はどのOSでもほぼ同じなので、ツールごとに使い方を覚えなくていい
- ツールをインストールしなくていい
GUIとは
GUI(Graphical User Interface / グラフィカルユーザインタフェース)とは、アイコンやボタンなどを用いて直感的にわかりやすく操作できるようにしたユーザインターフェース。
私たちが普段使っているコンピューターでの操作は基本的にほぼこのGUIでの操作です。
<GUIでGitを使うメリット>
- 視覚的に操作できるので、初心者でも直感的に操作をすることができる
<主なGitのGUIツール>
- Sourcetree(https://www.sourcetreeapp.com/)
- Fork(https://git-fork.com/)
- Gitkraken(https://www.gitkraken.com/)
Gitのよく使うコマンド10選
実際にはもっとたくさんありますが、Gitでよく使うコマンドを10個ピックアップしました。
まずは一旦この10個を把握しつつ、まずはGitに慣れていきながら、だんだん他の操作も覚えていきましょう。
- git init - リポジトリの作成
- git clone - リポジトリのコピー
- git pull - リモートリポジトリの変更を取り込む
- git add - ファイルをインデックスに追加
- git commit - ファイルをコミット
- git push - リモートリポジトリに変更を反映
- git branch - ブランチの作成・一覧表示
- git checkout - ブランチの切り替え
- git merge - 現在のブランチを他のブランチとマージする
- git rebase - 元のブランチに変更点をマージ
git init - リポジトリを作成
現在のディレクトリにリポジトリを作成します。
作成したリポジトリには「.git」という名前のディレクトリが作成され、Gitはこのディレクトリを使用することで、リポジトリの変更履歴を管理します。
$ git init
git clone - リポジトリをコピー
既存リポジトリを指定したディレクトリへコピーします。
$ git clone [コピーするリポジトリ] [コピー先ディレクトリ(省略可)]
git pull - リモートリポジトリの変更を取り込む
リモートリポジトリの変更内容を指定したローカルリポジトリに反映させます。
$ git pull [リモートリポジトリパス] [ブランチ名]
git add - ファイルをインデックスに追加
新たに追加/変更/削除したファイルをインデックスに追加します。
インデックスに追加することで、この後そのファイルをコミットすることができます。
$ git add [ファイル名]
$ git add . # すべてのファイルをステージングに上げる
$ git add *.html # 「〇〇.html」をステージングに上げる
git commit - ファイルをコミット
インデックスに存在するすべてのファイルをコミット(ローカルリポジトリに反映)します。
-mのオプションをつけることでコミットにメッセージをつけることができます。
$ git commit
$ git commit -m "[コミットメッセージ]"
git push - リモートリポジトリに変更を反映
git pullの反対で、指定したローカルリポジトリの変更内容をリモートリポジトリに反映します。
$ git push [リモートリポジトリパス] [ブランチ名]
git branch - ブランチの作成・一覧表示
現在処理対象となっているブランチを基にして新たなブランチを作成します。
また、ブランチの確認もできます。
$ git branch # 現在のブランチの確認
$ git branch [作成するブランチ名] # 新しいブランチを作成
$ git branch -a # すべてのブランチを確認
$ git branch -r # リモートブランチを確認
git checkout - ブランチの切り替え
処理対象のブランチを切り替えます。
$ git checkout [切り替えるブランチ名] # ブランチ移動
$ git checkout [ファイル名] # HEADと同じ状態に戻す
$ git checkout . # 全ファイル、HEADと同じ状態に戻す
$ git checkout [コミットID] [ファイル名] # 指定したコミットIDと同じ状態に戻す
git merge - 現在のブランチを他のブランチとマージする
現在処理しているブランチに、別のブランチから変更点を反映させます。
$ git merge [ブランチ名] # 現在のブランチをほかのブランチとマージする
git rebase - 元のブランチに変更点をマージ
他のブランチの変更点をすべて、元のブランチに反映します。
「git merge」がコミット当時の時系列にしたがって変更履歴が記録されるのに比べて、「git rebase」は新たに追記する形で変更履歴が記録されます。
$ git rebase [元のブランチ名]
Discussion