Gitというバージョン管理ソフトウェアがあります。Linuxの開発のために作られた多人数で大規模な開発でのソフトウェアのバージョン管理のために作られたものですが、個人開発でも使うといろいろ便利になります。
- 複数のpcで開発ができる(mac, win, linux, 会社PC, 個人PC )
- 前のバージョンに戻したい時などに簡単に戻せる
- githubと連携させて、自分の開発したものを公開できる
gitのコマンドと動作を理解するのは若干ハードルが高いので、この記事では、よく使うコマンドをチートシート的にまとめました。
また、自宅サーバーにgitリポジトリを作るための手順など、シチュエーションに合わせた手順も載せています。
gitとは: 概要とアーキテクチャ
バージョン管理とはどのようなものでしょうか?
例えば「abcについて20200617.txt」というファイルにいろいろ書き足して「abcについて20200618.txt」として別名保存するのも立派なバージョン管理と言えます。
ファイルに、いつどのように変更が加えられたのかを記録し、いつでも前の状態に戻せるようにするのがバージョン管理です。
gitはさらに「複数人が同時に作業」している場合に起こる不整合(コンフリクト)への対応や、派生バージョン(ブランチ)の管理なども可能な多機能バージョン管理ソフトです。
gitの用語とアーキテクチャ
gitはプロジェクト(ディレクトリ・フォルダ)単位でリポジトリを作成して履歴を管理します。例えば「gitリポジトリA」は「projectAディレクトリの内容全ての履歴管理」する。といった具合です。
以下の図は、一つのgitリポジトリを例にgitアーキテクチャを図にしたものです。この図を見ながら用語と意味を覚えましょう
用語 | 意味 |
---|---|
リポジトリ | 履歴を保持しているところ。実際作業をするローカルリポジトリ(作業PC上)と、 作業はしないけど履歴だけ保持するリモートリポジトリ(サーバ上)の2種類あります。 |
作業エリア | 実際にプログラムファイルや、テキストファイルがあるプロジェクトディレクトリ。 ここに、リポジトリから最新のファイルを持ってきて、変更作業して、最後にリポジトリに記録し直す、というのが一連の作業になります。 |
ステージング | ファイルの追加や変更は、いきなり「リポジトリに登録」されるのではなく、一旦、「ステージングエリア」でまとめられます。 これをステージングと呼び、ステージングされた変更点だけが、リポジトリに記録(コミット)することができるようになります。 |
コミット | ステージングされた内容をローカルリポジトリに記録することです。 |
リモート追跡ブランチ | リモートリポジトリの変更点をローカルに持ってくるリポジトリ。fetch コマンドでリモートリポジトリの最新状態をローカルに持ってくることができます。 |
ブランチ | 派生バージョンのこと。開発用、公開用など分けるときにも使います。 |
変更記録の流れとしては図の通り、
作業エリアで変更→ステージング→ローカルリポジトリ→リモート追跡ブランチ→リモートリポジトリ、と変更点の記録が伝わります。
逆にリモートリポジトリでの他の人が行った変更は、リモートリポジトリ→リモート追跡ブランチ→ローカルリポジトリ→作業エリアと伝わってきます。
gitのよく使うコマンド一覧
セットアップと日常作業にわけてコマンドを見ていきましょう。インストールは終わっている前提です。
gitコマンド: セットアップ系(チートシート)
コマンド | 動作内容 |
---|---|
git config --global user.name “hoge” | このPCで使う場合のグローバル(デフォルト)ユーザー名をhogeに設定 |
git config --global user.email “hoge@example.com” | グローバルemailをhoge@example.comに設定 |
git config --global core.autocrlf input | 改行コード(windows: CRLF, mac/linux:LF)をLFに統一する設定。 リポジトリへのpush時にCRLF->LFに変換する。pull時はLFのまま。 |
git config --local user.name “fuga” | 特定のプロジェクトだけユーザー名変えたい時の設定。例えばgithubに公開する場合はgithubと同じユーザ名にしておく等 |
git config --local user.email “fuga@example.com” | 同様に特定プロジェクトのためのローカルemail設定 |
git init | 作業エリア付きのローカルリポジトリ作成コマンド。空のプロジェクトディレクトリに移動してから実行。cd project-a;git init |
git remote add origin https://github.com/hoge/abc.git | git initでローカルリポジトリ作成した後にリモートリポジトリと関連付けるためのコマンド。 左の例はgithubのリポジトリと関連付け |
git clone ssh://hoge@192.168.0.10/abc.git | リモートリポジトリのコピーを持ってきてプロジェクトを始める場合のローカルリポジトリ作成コマンド。 この方法の場合 git init やgit remote add は不要。例は自宅サーバ192.168.0.10のリポジトリ |
git init --bare --shared | 作業エリアの無いリモートリポジトリ用リポジトリ作成(サーバー上)。mkdir project-a.git;cd project-a.git;git init --bare --shared |
.gitignoreファイル
作業ディレクトリにある.gitignoreファイルは、gitの履歴管理対象にしないファイルを記した特別なファイルです。
gitは基本的にソースコード等のテキストファイルを管理するので、画像ファイルやexe等の実行ファイルは管理から外しておきます。
画像などのバイナリファイルは、別途共有ストレージ等でアセット管理しましょう。
.gitignoreの書き方は以下のようになります。
# どこにあってもimagesディレクトリの中身は管理対象外
images/
# どこにあっても、拡張子jpgのファイルは管理対象外
*.jpg
# ディレクトリの一番上からみて./abc/hoge.txtは管理対象外
/abc/hoge.txt
gitコマンド: 日常作業(チートシート)
作業前には、リモートの最新状態をローカルに持ってきてから作業します。
コマンド | 動作内容 |
---|---|
git fetch origin master | リモートリポジトリoriginの中のmasterブランチの最新の状態を、リモート追跡ブランチに持ってくる。マージ(ローカルとの統合)は行わない。 |
git merge origin/master | リモート追跡ブランチorigin/masterを現在のローカルブランチとマージ(ローカルと統合) |
git pull origin master | 上記fetch+merge。リモートリポジトリの最新ををローカルに持ってきてマージ(ローカルと統合) |
最新の状態になったら変更をしていき、最後に以下のコマンド群でリモートに反映させます。
コマンド | 動作内容 |
---|---|
git status | どのファイルが追加・削除・変更されたのかを表示させます。 |
git diff <file名> | ファイルのどこをいじったかを表示させます。 |
git add . | 変更のあったファイル全てをステージングします。(特定ファイルだけステージングする場合は”.”ドットの代わりにファイル名を指定します。) |
git commit -m “変更したよ” | コミット(ローカルリポジトリに反映)します。-m の後にコミットメッセージを書きます。 |
git push origin master | リモートリポジトリoriginのmasterブランチに反映させます。 |
gitコマンド: ブランチ関連(チートシート)
派生バージョンや、開発用、公開用などを作成できるブランチ(branch)を覚えればgithub公開用にブランチを切ることができるようになるので便利です。
コマンド | 動作内容 |
---|---|
git checkout -b <branch名> | 最初にブランチを作成する時 |
git checkout <branch名> | 作業エリアのブランチを切り替える時 |
git branch | 今、どのブランチを見ているか確認する時 |
gitコマンド: 過去に戻りたい(チートシート)
「やってしまった。。。もとに戻したい。。。」という場合に使えるコマンドです。
シチュエーション | コマンド |
---|---|
add(ステージング)前。あるファイルを書き換える前の状態に戻したい | git checkout <file名> |
commit前、あるファイルを書き換える前の状態に戻したい | git reset <file名> |
前のコミットのハッシュ値(コミットを特定する値)が知りたい | git log |
commit後、あるファイルをcommit前の状態に戻したい | git checkout <hash値> <file名> |
そもそもcommitをなかったことにしたい。跡形もなく(危険!慎重に) | git reset --hard <hash値> |
自分専用のgitリポジトリをサーバー上に作る
IPでアクセスできる自宅サーバー上にgitのリモートリポジトリを作成して、PCから接続するまでの手順です。
セキュアな環境にするためgitユーザを作成してそのgitユーザはサーバにログイン出来ないようにしています。
初期設定
sudo apt install git #ubuntuでのgitインストールコマンド
パスワードログインできないセキュアなユーザ”git”を作成
sudo adduser --disabled_password git
sudo su git
mkdir .ssh
touch .ssh/authorized_keys
chmod 700 .ssh
chmod 600 .ssh/authorized_keys
リモート(bare)リポジトリ作成
sudo mkdir /my_repo/project1.git
cd /my_repo/project1.git
sudo git init --bare
cd ..
sudo chown -R git.git project1.git/
サーバー上のgitリポジトリにリモート接続する(ssh)
上記の方法で作成したリモートリポジトリにはssh経由で接続可能です。
クライアント側では接続のために以下の作業をします。
ssh公開鍵をgitに登録しておきます。
ssh-copy-id git@192.168.0.10
プロジェクトフォルダを作って、ローカルリポジトリを作成して、接続します。
mkdir project1
cd project1
git init
touch readme.md
git add .
git commit -m "initial commit"
git remote add origin ssh://git@192.168.0.10/my_repo/project1.git
git push origin master
gitのシチュエーション別Tips
gitで一部のファイルだけcloneしたい
$ mkdir project-a
$ cd project-a/
project-a$ git init
Initialized empty Git repository in /home/heisaku/python_project/project-a/.git/
project-a$ git config core.sparsecheckout true #リポジトリの一部だけ取ってくる宣言
project-a$ git remote add origin ssh://git@192.168.0.10/my_repo/project-a.git
project-a$ echo 'folder_i_want' > .git/info/sparse-checkout #持ってきたいフォルダを指定
project-a$ git pull origin master
githubの他の人のライブラリを使う
自分のgit対象内のディレクトリに、他の人のライブラリをsubmoduleとしてダウンロードすると、自分のgitリポジトリでは、submoduleが使っているhash値だけを管理するようになり、他人のライブラリの更新などで自分のリポジトリに影響がでるのを防ぐことができます。
cd lib/
git submodule add https://github.com/xxxxx.git hogelib
cd ..
git add .
git commit -m "submodule hogelib added"
submoduleをダウンロードした後は、自分のプロジェクトのリポジトリもadd/commitしておきます。(submoduleのハッシュの記録が追加されます)
submoduleを更新しない場合はこのまま使い続けるだけですが、submoduleを更新する場合は2箇所(submodule内と自分のローカルリポジトリ)で作業が必要となります。
cd lib/
git pull
cd ..
git add .
git commit -m "submodule hogelib updated"
特定のファイル・ディレクトリを「後から」管理対象外にしたい
- .gitignoreに管理対象外にしたいファイル・ディレクトリを記述
git rm --cached <ファイル名>
またはgit rm --cached -r <ディレクトリ名>
実行
$ cat .gitignore
/want_to_delete/
$ git rm --cached -r want_to_delete
最後に:gitは個人開発でも役に立つ
gitは奥が深いので、まだ書き足りないですが、雰囲気はつかめたのでは無いでしょうか?
実は、このブログもマークダウンというテキスト形式で書いてgitで履歴管理しています。
あなたも、この機会に是非、個人開発にもgitを導入しましょう!