Git 概要

『サル先生のGit入門』- 入門編

Gitを使ったバージョン管理

Gitを使ったバージョン管理|サル先生のGit入門【プロジェクト管理ツールBacklog】

  • Gitでは、ファイルの状態を好きなときに更新履歴として保存しておくことができる
    • 一度編集したファイルを過去の状態に戻したり、編集箇所の差分を表示したりすることができる
  • 古いファイルを元に編集したファイルで、他人の編集した最新ファイルを上書きしようとすると、サーバにアップロードした時に警告が出る
    • そのため、知らず知らずのうちに他人の編集内容を上書きしてしまう心配がない

リポジトリ(履歴を管理する)

履歴を管理するリポジトリ|サル先生のGit入門【プロジェクト管理ツールBacklog】

  • リポジトリとは、ファイルやディレクトリの「状態」を記録する場所
  • 保存された状態は、内容の変更履歴として格納されている
  • 変更履歴を管理したいディレクトリをリポジトリの管理下に置くことで、そのディレクトリ内のファイルやディレクトリの変更履歴を記録することができる

リモートリポジトリとローカルリポジトリ

  • リモートリポジトリ

    • 専用のサーバに配置して複数人で共有するためのリポジトリ
  • ローカルリポジトリ

    • ユーザ一人ひとりが利用するために、自分の手元のマシン上に配置するリポジトリ
  • リポジトリをリモートとローカルの2種類に分けることで、普段の作業はローカルリポジトリを使って全て手元のマシン上で行うことができる
  • 自分のローカルリポジトリで作業した内容を公開したい時は、リモートリポジトリにアップロードして公開する
  • また、リモートリポジトリを通してほかの人の作業内容を取得することもできる

リポジトリの作成

  • 自分の手元にローカルリポジトリを作成する方法は二種類ある
    1. 全く新しいリポジトリを作成する方法
    2. リモートリポジトリをコピーして作成する方法

コミット(変更を記録する)

変更を記録するコミット|サル先生のGit入門【プロジェクト管理ツールBacklog】

  • ファイルやディレクトリの追加・変更を、リポジトリに記録するにはコミットという操作を行う
  • コミットを実行すると、リポジトリの内では、前回コミットした時の状態から現在の状態までの差分を記録したコミット(またはリビジョン)と呼ばれるものが作成される
    • このコミットは、時系列順につながった状態でリポジトリに格納されている
    • このコミットを最新の物から辿ることで、過去の変更履歴やその内容を知ることができるようになっている
  • これらのコミットには、コミットの情報から計算された重複のない英数字40桁の名前が付けられている
    • この名前を指定することで、リポジトリの中からコミットを指定することができる

コミットは変更する内容の種類によって分ける

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

コミット実行時のコメント

  • コミットメッセージは必須のため、空のままで実行するとコミットが失敗する
  • コミットメッセージは、他の人がコミットの変更内容を調べる場合や、自分で後から履歴を見直す際に大切な情報となるので、変更内容のわかりやすいコメントを書く
  • コミットメッセージの書き方の作法は下記
1行目 : コミットでの変更内容の要約
2行目 : 空行
3行目以降 : 変更した理由

ワークツリーとインデックス

ワークツリーとインデックス|サル先生のGit入門【プロジェクト管理ツールBacklog】

  • Gitでは、Gitの管理下に置かれた、実際に作業をしているディレクトリのことをワークツリーと呼ぶ
  • Gitではリポジトリとワークツリーの間にはインデックスというものが存在する
  • インデックスとは、リポジトリにコミットする準備をするための場所のこと

  • Gitでは、コミットを実行した時にワークツリーから直接リポジトリ内に状態を記録するのでない
    • ワークツリーとリポジトリの間に設けられているインデックスの設定された状態を記録する
    • コミットでファイルの状態を記録するためには、まずインデックスにファイルを登録する必要がある
  • インデックスを間に挟む理由
    • ワークツリー内の必要ないファイルを含めずにコミットできる
    • ファイルの一部の変更だけをインデックスに登録してコミットすることができる

.gitconfig

初期設定|サル先生のGit入門【プロジェクト管理ツールBacklog】

  • gitの設定はユーザのホームディレクトリに作成される .gitconfig ファイルに記録される
$ git config --global user.name "<ユーザ名>"
$ git config --global user.email "<メールアドレス>"
$ cat ~/.gitconfig
[user]
    name = htksn
    email = htksn@gmail.com
[core]
    excludesfile = ~/.gitignore_global
  • gitの出力をカラーリング
    • $ git config --global color.ui auto
  • gitのコマンドにはエイリアスを設定することができる
    • 次のコマンドでは、「checkout」を「co」と省略しても実行できる
      • $ git config --global alias.co checkout

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

新しいリポジトリを作成する|サル先生のGit入門【プロジェクト管理ツールBacklog】

  1. 対象ディレクトリを作成
  2. ディレクトリ移動
  3. $ git init
$ mkdir testgit
$ cd testgit 
$ git init
hint: Using 'master' as the name for the initial branch. This default branch name
hint: is subject to change. To configure the initial branch name to use in all
hint: of your new repositories, which will suppress this warning, call:
hint: 
hint:   git config --global init.defaultBranch <name>
hint: 
hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and
hint: 'development'. The just-created branch can be renamed via this command:
hint: 
hint:   git branch -m <name>
Initialized empty Git repository in /Users/htksn/testgit/.git/
$ ls -a
.   ..  .git

ファイルのコミット

ファイルをコミットする|サル先生のGit入門【プロジェクト管理ツールBacklog】

  • サンプルファイルを作成する
$ cat << e > test.txt
heredoc> content of test
heredoc> e
  • status コマンドでワークツリーとインデックスの状態を確認する
$ git status
On branch master

No commits yet

Untracked files: # 履歴の追跡対象になっていないファイル
  (use "git add <file>..." to include in what will be committed)
    test.txt

nothing added to commit but untracked files present (use "git add" to track)
  • ファイルをインデックスに登録する
$ git add .

$ git add <ファイル名> # 単一ファイルをインデックス登録する場合
  • ワークツリーとインデックスの状態を確認
$ git status
On branch master

No commits yet

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)
    new file:   test.txt
  • commit コマンドでコミットする
$ git commit -m "first commit"
[master (root-commit) 103a4bb] first commit
 1 file changed, 1 insertion(+)
 create mode 100644 test.txt
$ git status
On branch master
nothing to commit, working tree clean # コミットされていない変更は無い
  • log コマンドでリポジトリの変更履歴を確認
$ git log
commit 103a4bbf1e05b7308a8e527a31b63ab1df765c9a (HEAD -> master)
Author: htksn <htksn@gmail.com>
Date:   Fri Sep 9 00:02:57 2022 +0900

    first commit

Push : リモートリポジトリにプッシュ

  • リモートリポジトリで自分の手元のローカルリポジトリの変更履歴を共有するには、ローカルリポジトリ内の変更履歴をアップロードする必要がある
    • プッシュ(Push)という操作を行う
    • Pushを実行すると、リモートリポジトリに自分の変更履歴がアップロードされ、リモートリポジトリ内の変更履歴がローカルリポジトリの変更履歴と同じ状態になる

Clone : リモートリポジトリをクローン

  • 誰かの変更履歴の入ったリモートリポジトリがあれば、それをまるごと複製して自分の手元で作業をすることができる
  • リモートリポジトリを複製するには、クローン(Clone)という操作を行う
    • クローンを実行すると、リモートリポジトリの内容をまるまるダウンロードしてきて、別のマシンにローカルリポジトリとして作成できる
    • クローンしたローカルリポジトリは変更履歴も複製されているので、元々のリポジトリと全く同じように履歴の参照やコミットをすることができる

Pull : リモートリポジトリからプル

  • リモートリポジトリを共有して複数人で作業すると、みんながリモートリポジトリにプッシュしていくことになる
    • → 自分のローカルリポジトリに、ほかの人がプッシュした変更内容を取り込む必要が出てくる
  • リモートリポジトリからローカルリポジトリを更新するにはプル(Pull)という操作を行う
  • Pullを実行すると、リモートリポジトリから最新の変更履歴をダウンロードしてきて、自分のローカルリポジトリにその内容を取り込める