Git

Gitは分散型のバージョン管理システムである。分散型バージョン管理システムは、リポジトリが複数あるバージョン管理システムである。Gitはリモートサーバにある中心リポジトリのコピーをローカル環境にコピーして、そのローカルリポジトリを使って作業を行う。

Linuxへインストールする

UbuntuやLinux Mintなど、DebianベースのLinuxディストリビューションの場合、apt コマンドを使ってgitをインストールする。

$ sudo apt install git

Windowsへインストールする

  1. GitのWebサイトを開く。
    http://git-scm.com/
  2. 「Downloads」をクリックする。
  3. 「Windows」をクリックする。
  4. ファイルのダウンロードが始まる。
  5. ダウンロードしたファイルを実行する。

インストーラを実行すると、「Git Setup Wizard」の画面が表示される。

ライセンス

Information
Figure 1. Information

インストール先フォルダ

Select destination location
Figure 2. Select destination location

インストール先を選択する画面が表示される。デフォルトのままでよい。

コンポーネント

Select components
Figure 3. Select components

インストールするコンポーネントを選択する画面が表示される。必要なものにチェックを入れる。

Gitのコンポーネント
コンポーネント 説明
Addional icons On the Desktop デスクトップにアイコンを追加する。
Windows Explorer integration Git Bash Here Windowsエクスプローラーのコンテキストメニューに「Git Bash Here」を追加する。
Git GUI Here Windowsエクスプローラーのコンテキストメニューに「Git GUI Here」を追加する。
Git LFS (Large File Support) ラージファイルサポート
Associate *.git* cofiguration files with the default text editor Gitコンフィグレーションファイルをデフォルトのテキストエディタに関連付ける。
Associate *.sh files to be run with Bash 拡張子が「*.sh」のファイルをBashで実行する。
Use a TrueType font in all consle windows すべてのコンソールウィンドウでTrueTypeフォントを使う。
Check delay for Git for Windows updates Git for Windowsの更新プログラムの遅延を確認する。

スタートメニューのフォルダ

Select start menu folder
Figure 4. Select start menu folder

スタートメニューのフォルダを選択する画面が表示される。

スタートメニューにフォルダを作りたくなければ「Don't Create a Start Menu folder」にチェックを入れる。

Gitで使うデフォルトのテキストエディタ

Choosing the default editor used by Git
Figure 5. Choosing the default editor used by Git

Gitで使うデフォルトのテキストエディタを選択する画面が表示される。次のうちいずれかを選択する。

「Select other editor」を選択すれば、任意のテキストエディタを使える。とくに使いたいものがない場合は、「Nano」を選ぶ。

PATH環境変数

Adjusting your PATH environment
Figure 6. Adjusting your PATH environment

HTTPS

Choosing HTTPS transport backend
Figure 7. Choosing HTTPS transport backend
Use the OpenSSL library
OpenSSLライブラリを使用すると、サーバ証明書はca-bundle.crtファイルを使用して検証される。
Use the Windows Secure Channel library
Windows Secure Channelを使用すると、サーバ証明書はWindows Certificate Storesを使用して検証される。このオプションを使用すると、配布されている社内のルートCA証明書を使用することもできます。

改行コードの変換

Configuring the line ending conversions
Figure 8. Configuring the line ending conversions

Gitからチェックアウトするときとコミットするときに改行コードの変換方法を選ぶ。

Checkout Windows-style, commit Unix-style line endings
チェックアウトするときはWindowsスタイル(CRLF)に変換する。コミットするときはUnixスタイル(LF)に変換する。
Checkout as-is, commit Unix-style line endings
チェックアウトするときに改行コードを変換しない。コミットするときはUnixスタイル(LF)に変換する。
Checkout as-is, commit as-is
チェックアウトするときに改行コードを変換しない。コミットするときも改行コードを変換しない。

HTMLCSSはUnixスタイルで作るのが一般的である。Windowsで使っているテキストエディタがWindowsスタイルの改行コードしかサポートしていない場合は、チェックアウトするときにWindowsスタイルに変換して、コミットするときにUnixスタイルに変換するのがよい。

Git Bashで使う端末エミュレータ

Configuring the terminal emulator to use with Git Bash
Figure 9. Configuring the terminal emulator to use with Git Bash

追加オプション

Configuring extra options
Figure 10. Configuring extra options

しばらく待つと、Gitのインストールが完了する。

Completing the Git setup wizard
Figure 11. Completing the Git setup wizard

gitコマンド

git [-c name=value] [--exec-path[=path]] [--html-path] [--man-path] [--info-path] [--p|--paginate|--nopager] [--noreplace-objects] [--bare] [--git-dir=path] [--work-tree=path] [--namespace=name] command [arg...]

以下に示すオプションを git コマンドに指定できる。

--exec-path
gitの中核(core)プログラムがインストールされているパスを表示する。
--help
Gitのコマンド一覧を表示する。
$ git --help
--html-path
gitのHTML文書がインストールされているパスを表示する。
--p, --paginate
すべての出力をページャ(less)で出力する。
--nopager
gitの出力をページャで出力しない。
--git-dir=path
リポジトリのパスを指定する。
--bare
リポジトリを裸(bare)のリポジトリとして扱う。
--version
Git のバージョンを表示して、コマンドを終了する。
$ git --version
git version 2.39.0

commandに指定できるコマンドを次に示す。

gitのサブコマンド
コマンド 説明
add 新しいファイルや修正したファイルのコンテンツを索引に追加する。
branch ブランチを作成又は削除する。
checkout チェックアウトする。
clone リポジトリを新しいディレクトリに複製する。
commit 記録された変更をローカルリポジトリに反映する。
config Gitやリポジトリの設定を変更する。
diff 作業ツリーとコミットとの変更点を表示する。
fetch 他のリポジトリを参照又はオブジェクトをダウンロードする。
help Gitに関するヘルプ情報を表示する。
init 空のGitリポジトリを作成する。または既存のリポジトリを再初期化する。
log コミット・ログを表示する。
ls-files インデックスと作業ツリーにあるファイルに関する情報を表示する。
merge 2つ以上の開発履歴を一緒に結合する。
mv ファイルやディレクトリの名前を変更したり場所を移動する。
pull 他のリポジトリ又はローカルブランチをフェッチしてからマージする。
push リモートリポジトリを更新する。
remote トラックされたリポジトリのセットを管理する。
rm 作業ツリーとインデックスからファイルを削除する。
status 作業ツリーの状態を表示する。

add

git addは、作業ディレクトリの内容をステージングエリアに追加するコマンドである。このコマンドは、個々のファイルの更新内容を次回コミットの対象となることをGitに指示する。

git add path

pathにはファイルまたはディレクトリのパスを指定する。ディレクトリのパスを指定した場合は、ディレクトリ内のすべての変更をステージして次回のコミットの対象とする。

ブランチの一覧を表示する

ブランチの一覧を表示するには、引数を指定せずにgit branchコマンドを実行する。

git branch

ブランチを作成する

ブランチを作成するには、新たに作成するブランチの名前を指定してgit branchコマンドを実行する。

git branch foo

ブランチを削除する

ブランチを削除するには、git branchコマンドにdオプションを付けて実行する。

git branch -d foo

リモートのブランチを削除するには、ブランチを削除した後にプッシュする。

git branch -d foo
git push origin :foo

checkout

checkout はローカルリポジトリからファイルをチェックアウトするGitコマンドである。

git checkout [-b] branch-name

ブランチを切り替える。

git checkout foo

ブランチを作成して、そのブランチに切り替える。

$ git checkout -b foo
Switched to a new branch 'foo'

編集したファイルをコミット時の状態に戻すには、ローカルリポジトリからファイルをチェックアウトする。

  1. ファイルの状態を確認する。
    $ git status
  2. ローカルリポジトリからファイルをチェックアウトする。
    $ git checkout example.txt

clone

git cloneは、既存のGitリポジトリのコピーを作成するコマンドである。リポジトリのクローンを行うと、元のリポジトリを指すoriginという名前のリモート接続が自動的に作成される。これにより、簡単に中央リポジトリとの通信を行うことができる。中央リポジトリから開発者の作業コピー(ローカルリポジトリ)を新たに作成する場合は、git cloneコマンドを使用する。

git clone [--template=template-directory] [-l] [-s]
[--no-hardlinks] [-q] [-n] [--bare] [--mirror] [-o name]
[-b name] [-u upload-peak] [--reference repository] [--separate-git-dir git-dir] [--depth depth] [--[no-]single-branch] [--recursive|--recurse-submodules]
[--] repository [directory]

リモートリポジトリを複製する例を次に示す。

$ git clone c:/repo
Cloning into 'repo'...
done.

既存のGitリポジトリ(GitHub)のクローン(複製)を作成する。

$ git clone https://github.com/account/example.git

commit

git commitは、ステージされたファイルをローカルリポジトリにコミットするコマンドである。変更をコミットするには、原則としてgit addコマンドでファイルをステージしておく必要がある。

git commit [option] [path]

引数

引数を省略して commit コマンドを実行すると、ステージされた変更および追加がコミットされる。

$ git commit

ファイル名を指定することにより、特定のファイルをコミットすることもできる。

$ git commit example.txt

オプション

以下に示すオプションを commit コマンドに指定できる。

-a
変更されたすべてのファイルをコミットする。

-a オプションを指定することにより、変更されたすべてのファイルをコミットすることもできる。この場合、新規作成されたファイルはコミットされない。

$ git commit -a

コミットされる変更とgit commitコマンドの関係を次に示す。

コマンド ステージされた変更・追加 ステージされていない変更 ステージされていない追加
git commit コミット - -
git commit -a コミット コミット -

いちいち変更したファイルを git add コマンドでステージするのは面倒なので、git commit -a コマンドの方が便利である。ただし、新規作成したファイルをステージするのを忘れないこと。

ファイルを変更したもののうち、コミットしたくないものがある場合は、面倒でもひとつづつ git add コマンドでステージしてから git commit コマンドでコミットする。

-m message
コミットメッセージを指定する。-mオプションを指定しなかった場合は、テキストエディタが起動されてコミットメッセージの入力を求められる。

コミットする例を次に示す。

$ git commit -m "first commit"

コミットメッセージは git log コマンドで確認することができる。

diff

git diff [options] [commit] [--] [path...]
git diff [options] --cached [commit] [--] [path...]
git diff [options] commit commit [--] [path...
git diff [options] blob blob
git diff [options] [--no-index] [--] path path

fetch

git fetch [options] [repository [refspec..]]
git fetch [options] group
git fetch --multiple [options] [(repository|group)...]
git fetch --all [options]

help

helpコマンドは、Gitに関するヘルプ情報を表示するコマンドである。

git help [-a|--all] [-g|--guide] [-i|--info|-m|--main|--web] [COMMAND|GUIDE]

Git を紹介するチュートリアルを表示する。

$ git help tutorial

便利な最小限のGitコマンドを表示する。

$ git help everyday

Gitのリビジョンと範囲の指定を表示する。

$ git help revisions

Gitを使った推奨ワークフローの概要を表示する。

$ git help workflows

init

git initはGitリポジトリを新たに作成するコマンドである。このコマンドは、バージョン管理を行っていない既存のプロジェクトをGitリポジトリに変換する場合や、空の新規リポジトリを作成して初期化する場合に使用する。

git init [--bare] [directory]

directoryで指定したパスに空のGitリポジトリを作成する。directoryの指定を省略した場合は、カレントディレクトリをGitリポジトリに変換する。

git initコマンドには次に示すオプションを指定することができる。

--bare
作業ディレクトリを持たない空のGitリポジトリを作成する。共有リポジトリは必ず--bareフラグを指定して作成しなければならない。作業ディレクトリを持たないリポジトリでは、ファイルの編集やコミットをすることはできない。

リポジトリを作成するには、次の手順で操作する。

  1. フォルダを作成する。
    C:\repo
  2. Git Bashを起動する。
  3. フォルダに移動する。
    $ cd /c/repo
  4. 初期化する。
    $ git init
    Initialized empty Git repository in c:/repo/.git/

共有リポジトリを作成するには、次の手順で操作する。

  1. ディレクトリ(フォルダ)を作成する。
  2. 作成したディレクトリ(フォルダ)に移動する。
  3. 共有として初期化する。
    $ git init --bare --shared=true

log

git logは、コミット済みの履歴を表示するコマンドである。

git log [-n limit] [--oneline] [--stat] [-p]

このコマンドには次の示すオプションを指定することができる。

-n limit
表示するコミットをlimitに制限する。
--oneline
コミットの内容を1行に圧縮して表示する。
--stat
改変されたファイル及びその中での追加行数と削除行数を増減数で表示する。
-p
各々のコミットに対応するパッチを表示する。コミット履歴から取得できる詳細な情報である各々のコミットの完全な差分情報が表示される。
git log > /tmp/log.txt

ls-files

ls-files はファイルの一覧を表示するGitコマンドである。

コンフリクト(競合)を解消するには、次の手順で操作する。

  1. コンフリクトしているファイルの一覧を表示する。
    $ git ls-files -u
  2. ファイルの状態を表示する。
    $ git status
  3. ファイルを修正する。
  4. 修正したファイルをインデックスに追加する。
    $ git add foo.php

merge

git merge [-n] [--stat] [--no-commit] [--squash] [--[no-]edit] [-s strategy] [-X strategy-option] [--[no-]rerere-autoupdate] [-m msg] [commit...]
git merge msg HEAD commit...
git merge --abort

フェッチとマージを行うには、次の手順で操作する。

  1. フェッチする。
    $ git fetch
  2. ログを見る。
    $ git log FETCH_HEAD
  3. ローカルリポジトリに取り込んだ変更内容を確認する。
    $ git diff FETCH_HEAD
  4. マージする。
    $ git merge FETCH_HEAD
  5. リモートリポジトリの更新動作を確認する(実際には更新しない)。
    $ git push -n origin master:master
  6. リモートリポジトリを更新する。
    $ git push origin master:master

mv

git mvは、ファイルやディレクトリの名前を変更したり、場所を移動するコマンドである。変更前のファイルを削除(git rm)して、変更後のファイルをステージング(git add)する。また、ワーキングコピーのファイルも実際に名前変更や移動が行われる。

git mv [-v] [-f] [-n] [-k] source destination
git mv [-v] [-f] [-n] [-k] source... destination-directory

ファイルfoo.phpbar.phpに変更する例を示す。

git mv foo.php bar.php

pull

git pull [options] [repository [refspec..]]

リポジトリからプル

git pull repository refspec...
$ git pull origin master

push

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

git push repository refspec...

repositoryには以下のように指定する。

プロトコル 指定方法
rsync rsync://host-name/git-repository-path
HTTP http://host-name[:port-no]/git-repository-path
HTTPS https://host-name[:port-no]/git-repository-path
git git://host-name[:port-no]/git-repository-path
SSH ssh://[user-name@]host-name[:port-no]/git-repository-path
file [file://]git-repository-path
$ git push origin master

This repository moved. Please use the new location:

git push したときに、次のメッセージが表示されることがあります。

remote: This repository moved. Please use the new location:
remote:   https://github.com/user/old.git
To https://github.com/user/new.git

このときは、次のコマンドを実行します。

git remote set-url origin https://github.com/user/new.git

remote

remote はリモートリポジトリの情報を表示するGitコマンドである。

存在するリモートリポジトリの一覧を表示する。

$ git remote

存在するリモートリポジトリの詳細を表示する。

$ git remote -v

リモートリポジトリの情報を表示する。

$ git remote show origin

gitコマンドでリモートリポジトリを指定する場合、URLで指定する。しかし、URLは文字数が多いうえ分かりにくい。そこで、短くてわかりやすい別名をリモートリポジトリに付けることができる。リモートリポジトリに付けた別名は.git/configファイルに保存される。

$ git remote add remote-name url

rm

rm はファイルを削除するGitコマンドである。

コミットしたファイルの削除するには、次の手順で操作する。

  1. ファイルを削除する。
    $ git rm foo/bar
  2. 削除予定を確認する。
    $ git status
    # On branch master
    # Changes to be committed:
    #   (use "git reset HEAD <file>..." to unstage)
    #
    #       deleted:     foo/bar
    #
  3. コミットする。
    $ git commit -m "delete foo/bar"

status

git statusは、作業ディレクトリの状態を表示するコマンドである。このコマンドを実行すると、ステージされた変更内容、ステージされていない変更内容及びGitによる追跡の対象外となっているファイルが表示される。

$ git status

.gitignore

Gitで管理しないファイルを明示的に指定するには、.gitignore という名前でファイルを作成し、その中にGitで管理しないファイル名を記述する。

.gitignore の例を以下に示す。

/.vscode/setting.json

.gitignore ファイルの位置を基準としたパスを記述するため、 /home/tsuka/src/.gitignore であれば、 /home/tsuka/src/.vscode/setting.json がGitの管理対象外となる。

.gitkeep

Gitでは、中身が空のディレクトリをバージョン管理下に入れることはできない。空のディレクトリをバージョン管理下に入れるためには、ディレクトリの中に何か適当なダミー・ファイルを作成しておく必要がある。このときのファイル名は何でも構わないが、慣習的に .gitkeep というファイル名が用いられることが多い。

GitHub

GitHubでリポジトリを作成するには、GitHubにログインして、「New」ボタンをクリックする。

「Create a new repository」画面で、必要な項目を入力する。

項目 説明
Repository name リポジトリ名
Description リポジトリの説明
Public パブリックリポジトリ
Private プライベートリポジトリ
Initialize this repository with a README リポジトリを初期化する
Add .gitignore .gitignoreファイルを追加する
Add a license オープンソースライセンスを追加する

Publicを選択すると、誰でもこのリポジトリを見ることができる。誰がコミットできるかは選択できる。

Privateを選択すると、誰がこのリポジトリを見たりコミットできるかを選択できる。

「Initialize this repository with a README」にチェックを入れると、すぐに自分のコンピュータにリポジトリをクローンすることができるようになる。既存のリポジトリをインポートする場合は、チェックを外す。

必要な項目を入力して、「Create repository」ボタンをクリックすると、リポジトリが作成される。

既存のリポジトリをインポートする

すでに自分のコンピュータにリポジトリを作成している場合は、Git Bashで該当フォルダに移動して、次の手順を行う。

git init
git add index.html
git commit -m "first commit"
git remote add origin https://github.com/user/repository.git
git push -u origin master

参考文献

git(1)

Git - Reference