gitの覚え書きまとめ

記憶の整理もかねて

Posted by     "sora" on Wednesday, April 5, 2023

「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 clone <リポジトリのURL>と入力するとクローンが作成される
    • コピー内容は本体と.gitディレクトリ

変更をステージに追加

  • git add <ファイル名ORディレクトリ名>で追加したいファイルを、
  • git add .で全てをステージに追加出来る

変更を記録

  • git commitで記録することが出来る
  • git commit -m "xxx"でコメントを
  • git commit -vで変更内容確認など様々なオプションがある

現在の状況の確認

  • git statusで現在の変更状況を確認できる
  • 確認出来る情報は主に2点
    • ワークツリーとステージの差分
    • ステージとリポジトリの差分
  • addやcommitをする前に確認する癖をつけよう

何を変更するのか確認

  • git diff git 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 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・・・登録されているリモートURL
  • git 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(基本的なマージ)
      • 枝分かれしているものを統合するマージ
    • コンフリクト
      • 同一箇所を複数人が編集している場合にどの変更を優先するか分からない状態

マージする

  • 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ブランチへマージする場合

  1. gitHubへ移動し、リポジトリのPullRequestsをクリック
  2. new pull requestをクリックし、baseをmainに compareをnewにする
  3. Createを押すとタイトルと本文を入力できる
  4. プルリクエストを作成したのち、Reviewersからレビューの依頼が行える
  5. 依頼された側はプルリクエスト画面へ行き、レビューを行った後、Review changesボタンから完了できる
  6. レビューが完了したら、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で全てのスタッシュを削除出来る