「gitの基本」
gitとは
- ファイルのバージョン管理システム
- 誰がいつ何を編集したのか分かる
- スナップショットのように管理されていていつでも戻れる
gitの操作の流れ
- ローカルでは主に3つに分かれている
| 名前 | 役割 |
|---|---|
| ワークツリー | 作業している場所 |
| ステージ | スナップショットを記録する準備場所 |
| リポジトリ | スナップショットを記録 |
- ワークツリーからステージ
git add- ファイルを圧縮し、名前と紐付ける
- ステージからリポジトリ
git commit- ステージのものに様々な情報を付け加える
- 最終的にリポジトリには 圧縮ファイル 名前が紐付けられたツリー 様々な情報のコミット の3種類が保存されている
- リポジトリに追加で変更を加える際には前のとの紐付けデータも併せて保存される
リポジトリ内容の詳細
-
圧縮ファイル
- 正式名称は「blobオブジェクト」
- 実際にはハッシュID
- 違う内容の
git addを行うたびに作成される
-
ツリーファイル
- 正式名称は「treeオブジェクト」
- 構造や名前を持たない圧縮ファイルに構造を与えるための物
-
コミットファイル
- 正式名称は「commitオブジェクト」
- ファイルの構造に いつ 誰が 何を 何のために を保存した物
-
これら3つでもってスナップショットを記録している
「gitの流れ」
リポジトリの作成
- 管理したいフォルダに移動し、
git initと入力- .gitファイルが作成される
- objectsは前著した3つのリポジトリが保存されている
- configはgitの設定ファイル
- .gitファイルが作成される
既にあるリポジトリのコピー
git clone <リポジトリのURL>と入力するとクローンが作成される- コピー内容は本体と.gitディレクトリ
変更をステージに追加
git add <ファイル名ORディレクトリ名>で追加したいファイルを、git add .で全てをステージに追加出来る
変更を記録
git commitで記録することが出来るgit commit -m "xxx"でコメントをgit commit -vで変更内容確認など様々なオプションがある
現在の状況の確認
git statusで現在の変更状況を確認できる- 確認出来る情報は主に2点
- ワークツリーとステージの差分
- ステージとリポジトリの差分
- addやcommitをする前に確認する癖をつけよう
何を変更するのか確認
git diffgit diff <ファイル名>でワークツリーとステージ間の差分をgit diff --stagedでステージとリポジトリ間の差分を表示出来る- 正確には一つ前の物と最新の物の違いを表示するコマンド
変更履歴の確認
git logコマンドで今までの変更履歴の確認が出来るgit log --onelineで一行表示git log -n <コミット数>で一定数git log -p <ファイル名>で一ファイルのみ- 最近の変更から順に表示される
ファイルの削除
git rm <ファイル名>でワークツリーのファイルごと削除git rm -r <ディレクトリ名>でワークツリーのディレクトリごと削除git rm --cached <ファイル名>でgitの記録のみ削除
GitHubへのプッシュ
- 気をつけるのはデフォルトのブランチ名
- gitの初期設定は
master - githubの初期設定は
main - デフォルトのブランチ名の変更は
git config --global init.defaultBranch main - 既にあるブランチ名の変更は
git branch -m master main
- gitの初期設定は
git remote add origin <github_URL>でリモートリポジトリを登録できる- このoriginとは以後URLの代わりに使える物
git push <リモート名> <ブランチ名>でGitHubへ送信出来る- 通常は
git push -u origin mainとなることが多い -uコマンドを付けると以後git pushのみでプッシュ出来るようになる
- 通常は
「gitの小技」
コマンドの簡易入力(エイリアス)
git config --global alias.ci commitでcommitをciと入力できる- commitをci statusをst branchをbr chekoutをcoなど
- –globalを付けるとPC自体の設定を変更できる
バージョン管理しないファイルの設定
- パスワードなどのファイルやチーム開発で必要では無いものはgit管理から外す
.gitignoreファイルを作成し、その中に記述するtemp.htmlはtemp.htmlファイルを無視temp/は全てのtempディレクトリを無視/temp/はgitignoreのディレクトリから相対パスで判断して無視*.txtは.txt全てを無視
「変更した物の取り消し」
ワークツリーの変更をステージ時点に戻す
git checkout -- <ファイル名ORディレクトリ名>で戻すgit checkout -- .で全て戻す
ステージに追加した変更を取り消す
- 間違った物を
git addしてしまったときに使われる- ステージから取り消すだけなのでワークツリーには影響ない
git reset HEAD <ファイル名ORディレクトリ名>ファイルやディレクトリのみ取り消しgit reset HEAD .全ての変更を取り消す
コミットした物をやり直す
- 正確には一度コミットした物を変更したい場合に使う
- 変更後のステージに更新するもの
- PUSHした後に使うのは絶対にNG
git commit --amendで現在のステージに改正される
「GitHubとのやり取り」
リモートリポジトリ関連
git remote・・・登録されているリモート名git remote show <リモート名>で全体の詳しい情報が見られるgit remote -v・・・登録されているリモートURLgit remote add <リモート名> <リモートURL>で複数登録する事も出来るgit remote show <リモート名>で全体の詳しい情報が見られる
リモートからの取得(fetch)
- リモートリポジトリからローカルリポジトリに取得してくる
- ワークツリーは変化ないので注意
git fetch <リモート名>でローカルリポジトリへ取得できるgit margeで持ってきた物をワークツリーへ反映出来る
リモートからの取得(pull)
- リモートからの取得とマージを両方したい時に使う
git pull <リモート名> <ブランチ名>でfetch+margeと同じ事が出来る- 自分の今いるブランチに統合されてしまう事に注意
- 慣れるまではfetch margeしたほうが良いかも
リモート名の変更削除
git remote rename <旧リモート名> <新リモート名>で名前の変更が出来るgit remote rm <リモート名>でリモートの削除が出来る
「ブランチとマージ」
ブランチとは
- 複数人が並行して複数機能を開発するためにある機能
- 大本のブランチとは別にブランチを作成し、後で合流させることで大本の変更に左右されること無く開発が出来る
ブランチの仕組み
- コミットを行うと一意のハッシュ関数が割り当てられる
- コミットで追加される情報の中にはparentという親のハッシュ情報も含まれている
- これによって前のコミットへ辿れるようになっている
- ブランチというのはコミットファイルを指し示しているポインタと考えていい
- 今作業しているブランチ名をHEADと言い、通常はHEAD:mainが本流となる
- mainブランチでコミットをすると新規のコミットファイルが作成され、最新のファイルにポインタが移動する
- ポインタとスナップショットという特徴でgitは他のバージョン管理ソフトよりも高速
新しいブランチの作成
git branch <ブランチ名>でブランチを作成する- ブランチの切り替えまではしないので注意
git branchで今あるブランチの一覧が表示される- 現在いるブランチは
*がßついている -aオプションでリモートリポジトリも表示される
- 現在いるブランチは
ブランチの切り替え
git checkout <既存のブランチ名>で既存ブランチへの切り替えがgit checkout -b <新ブランチ名>でブランチの作成と切り替えが一度に行える
マージとは
- 分岐した開発ラインを一つのブランチへまとめること
- マージには主に3種類ある
- FastFoward(早送りマージ)
- 枝分かれしていなかった場合のマージ
- AutoMerge(基本的なマージ)
- 枝分かれしているものを統合するマージ
- コンフリクト
- 同一箇所を複数人が編集している場合にどの変更を優先するか分からない状態
- FastFoward(早送りマージ)
マージする
git marge <ブランチ名ORリモート名/ブランチ名>自分のいるブランチへ統合されるため、統合したいブランチ名を記述し、マージ出来る
コンフリクト(衝突)
- コンフリクトした場合には以下のような内容が表示される
<<<<<<< HEAD
<p>aaaaaaaa</p>
=======
<p>bbbbbbbb</p>
>>>>>>> sub
- HEADは自分のブランチの内容
- 下部はsubブランチの内容
git statusで状況を確認し、それをもとに修正する
ブランチ名の変更とブランチの削除
git branch -m <変更後のブランチ名>でブランチ名を変更出来るgit branch -d <ブランチ名>でmainブランチにマージ済みの場合のみ削除できるgit branch -D <ブランチ名>でマージ関係なく強制削除ができる
「プルリクエスト」
プルリクエストとは
- 誰かが変更したコードをリポジトリへ取り込む前にレビューを他の人へ依頼する仕組み
- バグの抑止やコードの質の担保
プルリクエストの手順
newブランチをmainブランチへマージする場合
- gitHubへ移動し、リポジトリのPullRequestsをクリック
- new pull requestをクリックし、baseをmainに compareをnewにする
- Createを押すとタイトルと本文を入力できる
- プルリクエストを作成したのち、Reviewersからレビューの依頼が行える
- 依頼された側はプルリクエスト画面へ行き、レビューを行った後、Review changesボタンから完了できる
- レビューが完了したら、Confirm mergeボタンからマージが出来る
Githubでチーム開発する際の決まり事
- mainブランチはいつデプロイしても良い状態にしておくこと
- そのために開発する際は新しくブランチを作り、その中で開発すること
git push -fなどの強引なコマンドはダメ- mainにマージする際はプルリクエストを使い、レビューを受けること
- 出来ればmainブランチにマージした時点で自動でテストとデプロイを行いたい
「タグについて」
タグとは
- リリースした時点など特徴的なコミットをわかりやすくする機能
- バグが起きた際の切り戻しにも役立つ
- 2種類のタグがあり、コメントなどが付けられるタグと名前のみの簡単なタグがある
- 基本はコメントを付ける
git tagコマンドで登録済みのタグ一覧を閲覧できる
タグの作成
git tag -a <タグ名> -m "コメント"でコメント付きのタグをgit tag <タグ名>で簡単なタグを作成出来る- コメント付きの場合は署名などの情報も自動で追加される
git show <タグ名>でタグのデータを表示できる
タグをリモートリポジトリへ送信
git push <リモート名> <タグ名>でタグ単体をgit push <リモート名> --tagsでリモートリポジトリに存在しないタグを一斉送信出来る
「スタッシュでの一時避難」
スタッシュとは
- 「まだコミットしたくないけど、別のブランチで急遽作業しないといけなくなった」などの場合に今あるデータを一時保存できる仕組み
スタッシュの保存
git stashで現在のステージ内容をスタッシュ領域に一時保存出来るgit stash listで避難した作業一覧を表示出来る
スタッシュの復元
git stash applyで最新の作業の復元をgit stash apply --indexでステージ状況も合わせて復元できるgit stash <スタッシュ名>で特定の作業を復元できる
スタッシュの削除
git stash dropで最新の作業を削除git stash drop <スタッシュ名>で特定の作業を削除出来るgit stash clearで全てのスタッシュを削除出来る