初心者のためのGit/GitHub



# はじめに

本記事はエンジニアにおいて切ってもきれないGitとGitHubについて最低限纏めたものになっています。
Git/GitHubをハンズオンで学習を行いたい方は

https://learngitbranching.js.org/?locale=ja

をプレイしてみてください！画面下の?マークからlevelsで設問を解くことができますよ。

# Gitとは

Gitはファイルのバージョンを管理します。

https://git-scm.com/docs/git

# 最低限のワード

Gitを説明するにあたってこれだけは知っておきたい用語達

| word | description |
| --- | --- |
| コミットオブジェクト | コミットオブジェクト＝スナップショット。SHA1のIDで区別する |
| ディレクトリ | フォルダのこと |
| ブランチ | 最新のコミットを指し示すポインタ。処理を分散させ、枝分かれのようにすることもできる |
| HEAD | 現在作業中のコミットを表すポインタ |
| タグ | コミットについたタグ。付箋のようなもので最新コミットには追従しない |
| マージ | ブランチの分岐を一つに統合する |

# ローカルリポジトリ

ローカルリポジトリとはローカル（自身のPC上）の履歴データの保管場所である

## ワークツリー

コードを書いてたり変更したりなど、自分の作業場にあたる

## インデックス

ステージとも呼ばれリポジトリにコミットする変更を準備する場所にあたる。

## リポジトリ

スナップショットの保管場所にあたる

# リモートリポジトリ

リモートリポジトリとはGitHub等インターネット上にあるリポジトリのことである。
チーム開発やオープンソース開発などで利用される。
ローカルリポジトリとリモートリポジトリを紐付けることで、ローカルでの作業をリモートにプッシュしたり、リモートの更新をプルしたりすることができる。

# .gitの構成内容

$git initで作成された.gitの中身を把握しましょう

![.git ](https://s4.aconvert.com/convert/p3r68-cdx67/a32u7-1u26n.jpg)

- **objects**
リポジトリの本体。圧縮ファイルやツリーファイル、コミットファイルが保存される
- **config**
gitの設定が保存される
- HEAD
現在のブランチの参照が保存される
- branches
git fetchやgit
- description
GitWebで使われる
- hooks
Gitの各コマンドを実行した際に呼び出されるスクリプトの設定が保存される
- info
リポジトリに対する追加情報が保存される
- refs
Gitの各参照先が保存される

# 自身でプロジェクトを開始する - git init

`$ git init`　をエンターすることでカレントディレクトリに.gitという根幹的なファイルが生成される

# 他人のプロジェクトから始める - git clone

`$ git clone [リポジトリ名]`をエンターすることでカレントディレクトリに指定された

# 変更をステージに追加する -git add

`$ git add`を行ったファイルを圧縮し、圧縮ファイルとファイル名・内容をマッピングしたデータをインデックスへ保存する。

# 変更を記録する -git commit

`$git commit` を行うとツリーが生成される。ツリーにより、保存されているスナップショットを読み取れる。次にコミットファイルを作成し、誰が、いつ、何故変更したか？がわかる。
$git commitには-mや-v等の様々なオプションがあるので要チェック。

![スクリーンショット 0005-03-10 21.46.29.png](https://s4.aconvert.com/convert/p3r68-cdx67/alhyh-srv5p.jpg)

> 1 file changed = １ファイル変更された
2 insertions(+) = ２行挿入された
> 

# 現在どのファイルが変更されたか確認する　-git status

`$ git status　`でワークツリーとステージにある前回addしたインデックスとの間でファイル差分を把握したり、前回commitした際のリポジトリのコミットデータとステージのインデックスでファイル差分が把握できる。

<details><summary>$git status挙動</summary>

何もaddしてない状態でコマンドをエンターすると

![スクリーンショット 0005-03-10 22.00.14.png](https://s4.aconvert.com/convert/p3r68-cdx67/a64k8-vxfjx.jpg)

> 要約：コミットすべき変更はなにもないよ！
> 

適当にファイルを変更してもう一度コマンドをエンターすると

![スクリーンショット 0005-03-10 22.03.21.png](https://s4.aconvert.com/convert/p3r68-cdx67/a4fcf-fjv2w.jpg)

> 要約：ステージに追加されてない変更があるよ！
modified : index.html = 変更されたファイル：index.html
> 

`$git add index.html`し、`$git status`

![スクリーンショット 0005-03-10 22.05.49.png](https://s4.aconvert.com/convert/p3r68-cdx67/aewub-r2l5s.jpg)

> 要約：コミットすべき変更があるよ！
modified : index.html = 変更されたファイル：index.html
> 

`$git commit -vm` して`$git status`

![スクリーンショット 0005-03-10 22.08.56.png](https://s4.aconvert.com/convert/p3r68-cdx67/a8cyc-8kgeo.jpg)

> 要約：コミットすべき変更はなにもないよ！
> 
</details>

# 変更差分を確認する - git diff

`$git diff`でステージとワークツリーの差分。`$git diff - -staged`でリポジトリとステージの差分の確認。addやcommitする前に当コマンドで差分確認する癖を付けましょう。

# 変更履歴を確認する -git log

`$git log`で変更履歴を確認できる。様々なオプションがあるので要チェック。

# ファイルの削除 -git rm

`$git rm [ファイル名]`でファイル削除。`$git rm -r[ディレクトリ名]`でディレクトリ削除。
git rmを使うと、commitされたgitの記録や自身のローカルワークツリーからも削除される。
gitの記録からのみ削除したい場合は`--cached`オプションを用いる。

# ファイル名の変更 -git mv

$git mv[oldファイル][newファイル]を用いるとファイル名の変更ができる。

# Githubにプッシュする -git push

プッシュする前に`$git remote add origin`でリモートリポジトリ（アップ先）を指定する。
詳しくは

https://docs.github.com/ja/get-started/getting-started-with-git/managing-remote-repositories

指定後$git push [リモート名][ブランチ名]でローカルリポジトリにcommitした内容をリモートリポジトリにpush(アップロード）することができる

# ワークツリーの変更を取り消す -git checkout

`$git checkout  - - [ファイルorディレクトリ名]`でステージから情報を取得し、ワークツリーに反映させることによって、変更を取り消すことができる。後述するが、ブランチを切り替える際も使用する。

# ステージへの変更を取り消す -git reset

`$git reset HEAD [ファイルorディレクトリ名]`でリポジトリから情報を取得し、ステージに反映させることによって、変更を取り消すことができる。注意点として、ワークツリーの変更は何も変化は起きない。

# 直前のcommitをやり直す -git commit --amend

`$git commit --amend`でステージから情報を取得し、コミットを上書きすることによりやり直すことができる。**注意点としてリモートリポジトリにおいては、他ユーザとのデータに齟齬ができてしまうので絶対に行ってはならない。
commitしたが、まだpushを行っていない状態で用いるコマンド。**

# Github

## リモートを表示する -git remote

`$git remote`で設定しているリモートリポジトリの情報を表示することができる。また -vオプションを付加することにより対応するURLのリモートを表示する。

## 複数のリポジトリを登録する -git remote  add

`$git remote add [リポジトリ名][リポジトリURL]`で登録したリポジトリ名で管理ができる。

## リモートからデータを取得する -git fetch/pull

`$git fetch [リモート名]` でリモートリポジトリからローカルリポジトリにデータを取得できる。ワークツリーには反映されない。

`$git pull[リモート名][ブランチ名]`でリモートリポジトリからローカルリポジトリにデータを取得し、ワークツリーにも反映させる。`$git fetch + $git marge`のようなもの。注意点として、現在のブランチの位置を把握していないと、違うファイルと統合されて悲惨になる。

怖い場合は安全性が高い`$git fetchを用いると良いかも

## リモートの詳細情報を確認 -git remote show

`$git remote show`は`$git remote`より詳しい情報も表示される

## リモートの変更 -git remote rename

`$git remote rename[oldリモート名][newリモート名]` で名前を変更することができる

## リモートの削除 -git remote rm

`$git remote rm[リモート名]`でリモートを削除することができる

## ブランチを新規作成/一覧表示する　-git branch

`$git branch [ブランチ名]`でブランチを新規作成する。作成するのみでブランチの切り替えは行わない。
`$git branch `でブランチの一覧を表示する。また、`-a`オプションを付けることにより全てのブランチを表示する

## ブランチを切り替える -git checkout

`$git checkout [既存ブランチ名]`で作成済みのブランチに切り替えることができる

## ブランチが過去にどのコミットを指していたか表示する -git reflog

`$git reflog`でブランチが過去にどのコミットを指していたか表示する。rebaseなど行う前に確認すると安全に作業できる

## 変更をマージする -git merge

`$git merge [ブランチ名]`で他のブランチで変更されたデータを自分のブランチに取り込み新しいコミットファイルを作成する

## 履歴を整えた形でマージする -git rebase

`$git rebase [ブランチ名]`で現在居るブランチから、指定した他のブランチでの変更履歴も一緒に取り込みながら、新しいコミットファイルを作成する

## ブランチ名を変更する -git branch -m

`$git branch -m [newブランチ名]`で作業しているブランチの名前を変更することができる

## ブランチを削除する -git branch -d

`$git branch -d [ブランチ名]`でブランチを削除できる。`-D`オプションで強制削除ができる

## 一時的に変更を隠しておく -git stash

`$git stash`でコミットするまでもない作業などをstashファイルに作業を一次避難し、別ブランチで作業することができる。

## 一次避難したデータを戻す -git stash pop

`$git stash pop`で一番最初にstashファイルに一次避難したデータを戻すことができる

# GitHubFlow

以下の手順で開発を進めていくワークフロー。シンプルでありながら安全性を担保しつつ開発の流れが追いやすい。

手順：

masterブランチから分岐を作成する→
変更を加える→
commit→
push→
Pull requestを作成する→
（レビューに対応する→）
承認されたらpull requestをmergeする→

ローカルのmain(or master)をリモートのmain(or master）と合致させる(`$git pull origin main(master) —rebase`)→
masterブランチから分岐を作成する….

詳しくはこちらを御覧ください

https://docs.github.com/ja/get-started/quickstart/github-flow

# タグ
簡単に言えば付箋のようなものです。

https://git-scm.com/book/ja/v2/Git-%E3%81%AE%E5%9F%BA%E6%9C%AC-%E3%82%BF%E3%82%B0

## タグを作成する -git tag

`$git tag [tagName]`でタグを作成する。
また`$git tag [tagName] [commitName]`で過去のcommitにもタグを付与することができる。

## 注釈付きタグを作成する -git tag -a

`$git tag -a [tagName] -m “message”`で注釈付きタグを作成する。また、誰がタグを付与したかの署名も自動的に付加される。

## タグを表示する -git tag

`$git tag`で作成されたtagを表示する。
-l(エル）オプションでパターン指定でタグを表示できる

## タグのデータを表示する -git show

`$git show [tagName]`でタグのデータと関連付けされたコミットを表示する。

## タグをGitHubに送信する -git push

GitHubにタグ情報を送信するにはpushで別途指定が必要になる

`$git push [remoteName] [tagName]`でGitHubに送信する。

# おわりに

辞書的な記事内容になってしまったので、単語ごとふわっと理解しておいて、冒頭のwebサイトでハンズオン学習を行えばある程度すんなりと理解が深まると思います！
とりあえずGitHub Flowを何も見ずに回せるようになれればOKかと思います。