👾

Gitの仕組みと使い方を理解する

2022/10/18に公開約4,200字

Gitって何?

そもそもGitとは何か?について調べてみると、分散型バージョン管理システムと出てきました。
ソースコードの状態を記録して、それぞれのバージョンを管理する仕組みなんだなということは分かりました。
バージョンが管理されていないと複数人で作業するときに大変なことになることは想像できます😩

リポジトリとは?

リポジトリとは、データを保存しておく場所で貯蔵庫みたいなイメージです。
そのリポジトリにも以下のような種類があります。

  • リモートリポジトリ
    GitHubなどのネットワーク上の保管場所で複数人で共有できる。
  • ローカルリポジトリ
    自分のPCの保管場所

ローカルある3つのエリア

  • ワークツリー
    自分が変更などの作業をしている場所
  • ステージ
    コミットする変更を準備する。(仕分けをする場所みたいなイメージ)
  • リポジトリ
    スナップショットとして記録する(記録することをコミットという)

ここでスナップショットってなんだろうとなりました・・

スナップショットとは、その時点の状態を保存する方法で、差分ではなく、全ての状態を記録しているらしいです。
今まではなんとなく差分なのかと思っていましたが、実は違ったようです。

スナップショットをデジカメで撮影した風景写真に例えた場合がイメージしやすくて分かりやすかったです。
まず撮影した写真が時間の経過とともに変化していきます。
数時間前に撮影をした写真に戻したいとき、何個か前の写真が見たくなるときもあると思います。
そんなときは、その写真に含まれる撮影日時や撮影者などを参考に見たい写真を探し出します。

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

  • 以下のコマンドを実行したディレクトリに.gitディレクトリが作成される
  • initは、initialize(初期化)の略
git init

.gitの中には何が入っている??

  • リポジトリ(.git/objects)
    • 圧縮ファイル
    • ツリーファイル
    • コミットファイル
      git addしたファイルを圧縮したファイルが.git/objectsに保存される。
  • インデックスファイル
    ステージで使用したファイル
  • 設定ファイル(.git/config)
    リポジトリのGit設定

Gitコマンド一覧

Gitリポジトリのコピーを作成する

GitHubなどのリモートリポジトリから2つのものがコピーされる

  • ファイルがワークツリーにコピーされる
  • .gitディレクトリがコピーされる
git clone <リポジトリ名>

変更をステージに追加する

git add <ファイル名>
git add <ディレクトリ名>
git add .

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

git commit
git commit -m "<メッセージ>"
git commit -v
  • 変更内容を確認できる
git commit -v

現在の変更状況を確認する

git status

変更差分を確認する

# git addする前の変更分(ワークツリーとステージの間の差分を確認)
git diff
git diff <ファイル名>

# git addした後の変更分(ステージとリポジトリの間の差分を確認)
git diff --staged

変更履歴を確認する

git log

# 1行で表示する
git log --oneline

# ファイルの変更差分を表示する
git log -p index.html

# 表示するコミット数を制限する
git log -n <コミット数>

ファイルの削除を記録する

# ファイルごと削除
git rm <ファイル名>
git rm <ディレクトリ名>
# ファイルを残したいとき(ワークツリーにはのこして、gitの記録だけ消したい時)
git rm --cached <ファイル名>

ファイルの移動を記録する

git mn <旧ファイル><新ファイル>

# 以下のコマンドと同じ
mv <旧ファイル><新ファイル>
git rm <旧ファイル>
git add <新ファイル>

リモートリポジトリ(GitHub)を新規追加する

  • originというショートカットでurlのリモートリポジトリを登録する
  • 今後はoriginという名前でGitHubリポジトリにアップしたり、取得したりできるようになる。
git remote add origin <url>

リモートリポジトリ(GitHub)へ送信する

  • プッシュとはローカルリポジトリの内容をリモートリポジトリに送ること。
git push <リモート名><ブランチ名>
git push origin main

ファイルへの変更を取り消す(破棄)

--をつけているのは、ブランチ名とファイル名が被ったときに、どちらを指しているのかが、Gitが分からなくなってしまうため。
ステージの状態をワークツリーに反映させることで取り消している。

git checkout -- <ファイル名>
git checkout -- <ディレクトリ名>

前変更を取り消す
git checkout -- .

ステージに追加した変更をもとに戻す

ステージから取り消すだけのため、ワークツリーのファイルには影響しない。
リポジトリの内容でステージを上書きして変更を取り消している。
HEADとは、今いるブランチの最新のコミットのこと。

git reset HEAD <ファイル名>
git reset HEAD <ディレクトリ名>

前変更を取り消す
git reset HEAD .

直前のコミットをやり直す

  • リモートリポジトリにプッシュしたコミットはやり直してはいけない。
git commit --amend

ブランチを新規追加する

  • ブランチを作成するだけで、切り替えまでは行わない。
git branch <ブランチ名>
git branch feature

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

git branch

全てのブランチを表示する
git branch -a

ブランチを切り替える

git checkout <既存ブランチ名>
git checkout feature

ブランチを新規作成して切り替える
git checkout -b <新ブランチ名>

ブランチ名を変更・削除する

作業しているブランチの名前を変更する

git branch -m <ブランチ名>
git branch -m new_branch

削除する

  • mainにマージされていない変更が残っている場合は、削除されない。
git branch -d <ブランチ名>
git branch -d feature

強制削除する

git branch -D <ブランチ名>

変更履歴をマージする

git merge <ブランチ名>
git merge <リモート名/ブランチ名>
git merge origin/main

マージには3種類ある

  • Fast Foward 早送りになるマージ
    ブランチが枝分かれしてなかったときは、ブランチのポインタを前にすすめるだけ

  • 基本的なマージ
    枝分かれして開発していた場合、マージコミットという新しいコミットを作る

  • コンフリクト
    同じファイルの同じ行に対して異なる編集を行なったときにおこる。

コンフリクトしてしまったとき

コンフリクトしたファイルの内容

<<HEAD 〜 == HEADの変更分

== 〜 >>feature featureの変更分

解決方法

  • ファイルの内容を書き換える
  • 「<<」「==」「>>」の記述を削除する

コンフリクトが起きにくい運用ルール

  • 複数人で同じファイルを変更しない
  • pullやmergeする前に変更中の状態をなくしておく(commitやstashをしておく)
  • pullするときは、pullするブランチに移動してからpullする
  • コンフリクトしても慌てない

コマンドにエイリアスを付けて楽にする

エイリアスを付けることで入力を楽にしていくことができる。
毎回すべてを打つのは大変なので、やっておいたほうがいいですね👍

git config --global alias.ci commit
git config --global alias.st status
git config --global alias.br branch
git config --global alias.CO checkout

gitの管理から無視したいファイルがある場合

gitの管理から無視したいファイルを設定することができます。
.gitignoreファイルを作成して無視してほしいファイルを記述する

.gitignore
# 指定したファイルを除外
index.html
# ルートディレクトリを指定
/root.html
# ディレクトリ以下を除外
dir/
# 以外の文字列にマッチ「*」
/*/*.css

参考文献

https://www.udemy.com/course/unscared_git
https://qiita.com/nnahito/items/565f8755e70c51532459
https://kledgeb.blogspot.com/2015/02/ubuntu-git-4_19.html

Discussion

ログインするとコメントできます