🌜

Gitの復習

2023/05/10に公開

はじめに

チーム開発に向けて色々動画やブログなど見てGitの概念を理解しようと努力中の初心者です!
奥が深過ぎてどこまで調べれば良いのかわからなくなり、うまくまとまっていないですが、、、
またチーム開発に特に必要な部分は後日まとめられたらと思います🏋🏻

操作方法よりも、まずgitの概念や用語を理解することが大事!

Gitとは

分散型バージョン管理システム。
ざっくりいうとファイルのバージョン管理が簡単にできるシステム。
リーナス・トーバルズが開発・Linuxのソース管理

(⚠️GitとGitHubは別物!⚠️)
GitHubはあくまでリモートサーバーの中身をWebブラウザで見るためのツールにすぎない。

特徴

  • ファイルの変更履歴の確認
  • 過去の状態にファイルを戻す
  • チーム間でのファイル共有
  • さまざまなファイルの管理
  • ポートフォリオとしての活用

Sourcetree

コマンドを使わずにgitを操作できるツールもある(マウス操作)
https://www.sourcetreeapp.com/
が、コマンドを使う方がおすすめ!覚えましょう。

バージョン管理システムとは

いつ誰がどのファイルに対してどのような変更を行なったのか?という、履歴を記録しておくためのもの。

バージョン管理システムの種類

バージョン管理システムには、次の2種類のタイプがあります

集中型

  • CVS
  • Subversion(SVN)

分散型

  • Git
  • Mercurial

Gitは分散型リポジトリです
Gitは分散型バージョン管理システム(Distributed Version Control System)と呼ばれます。

その対比として、Subversionは集中型バージョン管理システム(Centrlized Version Control System)と呼ばれることもあります。

Subversionはサーバーにインストールした"リモートリポジトリ"だけが、ソースコードのバージョンを管理しています。

開発者はリモートリポジトリにアクセスして自分のローカルPCに指定したバージョンのソースコードをダウンロード>[チェックアウト]して開発します。

修正や追加したソースコードはリモートリポジトリへ登録<コミット>します。

それに対してGitは開発者自身のローカルPCに"ローカルリポジトリ"を持ちます。

開発者はこのローカルリポジトリに修正や追加したソースコードをコミットするのがSubversionとの大きな違いで>す。

ローカルリポジトリはリモートリポジトリの完全なコピー["クローン"]として作成します。ローカルリポジトリにコミット>したソースコードは、リモートリポジトリに反映["プッシュ"]することでローカルリポジトリとリモートリポジトリの内容>を同じに合わせます。個々のローカルPCにもリポジトリを構築するので分散型と呼ばれています。

参照:https://www.ricksoft.jp/blog/articles/001410.html#:~:text=Gitは分散型リポジトリです&text=Subversionはサーバーにインストール,して開発します。

Git基本概念

せっかくなので、diagramで図を作ってみた!

リポジトリ

gitでファイルやディレクトリの状態を記録する場所。
一つのシステムにつき一つのリポジトリと言われる入れ物を作って、その中で作業をしていくという感じ!
保存された状態は、内容の変更履歴としてリポジトリに格納されている。

リポジトリには次の二つがある。

  • リモートリポジトリ
    専用のサーバで管理し、複数人で共有するためのリポジトリ(GitHub等)
  • ローカルリポジトリ
    PCで自身が管理するリポジトリ

Git全体構成

手元のPCの中には、ローカルリポジトリだけでなく、リモートリポジトリのコピーも持っている。リモートリポジトリのコピーは読み取り専用で、手元のPCの中でリモートリポジトリの情報を確認する際に利用する。

コミット

コミットとは、ファイルやディレクトリを追加・変更・削除したという情報を、リポジトリに記録する操作のこと。
ローカルリポジトリにコミットすることで、変更した部分だけでなく、その時点での全体の状態(スナップショット)も保存し、管理していく。

スナップショットで保存するとは?

ワークツリー

実際に作業(ファイルの中身を変更したり、追加や削除など)を行う場所、ワーキングディレクトリとも呼ばれる。

インデックス(ステージングエリア)

インデックスは、ローカルリポジトリへのコミットを準備するための場所。
ローカルリポジトリとワークツリーの間にあり、インデックスに準備されてからローカルリポジトリへコミットする流れになる。

基本コマンド

[初回]ローカルにリポジトリを作成し、リモートにプッシュする際の手順

コマンド 説明
git init 現在いるディレクトリをgitで管理するための設定ファイルを生成
git add ファイル名 「ファイル名」の部分にファイル名を指定することで、指定したファイルをインデックスに追加できる
git commit -m "コメント" メッセージをつけて変更履歴を保存
git branch -M main デフォルトブランチをmasterからmainに変更(デフォルトブランチがmainの場合は不要)
git remote add origin リポジトリURL originという名前でリモートリポジトリのURLを登録
git push origin ブランチ名 ローカルの変更をリモートリポジトリにアップロード。「ブランチ名」にアップロードしたいブランチの名前を指定

便利コマンド git stash 「作業ツリーの状態を一時的に保存」

「とあるブランチで作業中だけど、いますぐやりたいことができた。作業がすごく中途半端だからコミットはしたくない。」というとき、作業ツリーの状態を一時的に保存するコマンド。
コミットしていない変更を退避することができ他の作業をした後で戻って再適用できる便利なコマンド。

作業しているローカルのGitリポジトリにのみ適用され、プッシュ時にサーバーには転送されない。

ログの確認・操作

操作を行う前に確認の癖をつける!

コマンド 説明
git log コミットの履歴を確認
git reset コミット 履歴を元に前の状態に戻す。「コミット」には識別番号を指定。git reset HEAD^で一つ前に戻すことも可能
git status ファイルの追加/変更/削除の確認

[2回目以降]ローカルにリポジトリの変更をリモートにプッシュする際の手順

コマンド 説明
git add ファイル名 「ファイル名」の部分にファイル名を指定することで、指定したファイルをインデックスに追加することができる。
git commit -m "コメント" メッセージをつけて変更履歴を保存。
git push origin ブランチ名 ローカルの変更をリモートリポジトリにアップロード。「ブランチ名」にアップロードしたいブランチの名前を指定。

リモートリポジトリをローカルリポジトリに複製(ダウンロード)

git cloneは 新規にリポジトリをローカル側にコピーする場合に使うコマンド。
手元にリポジトリが存在している場合は、git pullを使う!

コマンド 説明
git clone リポジトリURL リモートリポジトリをローカルリポジトリに複製する(ダウンロード)。「リポジトリURL」は複製したいリモート先のURLを指定する。

cloneしたいものの、SSHのURLをコピーして
ターミナルで上記コマンドを実行!

開いた後は必ず下記のコマンドを実行する!

1.bundle install
bundlerを使ってGemfileからgemをインストールするコマンド。
git cloneだけではgemが使える状態ではない。

gemなどは容量が重いので、gitignoreと、gemfileにだけ書いてgitに保存してあった状態。

.gitignoreファイル
.gitignore に記載された対象ファイルは、git add の実行時に、インデックスに追加されないようになる。

bundle installで実行することは以下の3つ。
  1. Gemfile.lockでどのgemがinstallされているか確認する。
  2. Gemfile.lockを確認した後にGemfileに記述されているgemを確認する。
  3. Gemfile.lockにないgemをGemfileから見つけた場合、そのgemをインストールする。

2.yarn install
package.jsonファイルを基にすべての依存関係をインストールする。

3.rails db:migrate
git cloneだけではデータベースが存在しないので、データベースを同期させる。

https://hackmd.io/@chan-sena/Bk3Lfi77_

リモートリポジトリの変更をローカルに反映させる

git merge ブランチを合流させること。
マージするときはマージ先のブランチに移動する。

コマンド 説明
git fetch origin リモートリポジトリからローカルにあるリモートリポジトリのコピーに最新情報をダウンロード
git merge ブランチ名 ローカルブランチに反映
git pull origin ブランチ名 fetchとmergeをまとめて実行できるコマンド

マージ

ブランチとブランチを合わせること。
他のブランチでの変更分を自分の手元に取り込める。

gitのマージには2種類ある

Fast-Forward = 早送り
Non Fast-Forward = 普通のマージ

https://backlog.com/ja/git-tutorial/stepup/04/

(ブランチの統合自体にも種類があり、mergeを使う方法と、rebaseを使う方法の2種類がある)

コンフリクト

複数人が同じブランチの同じファイルの同じ行に対して変更を行うと発生する問題。
コンピュータがどの変更を優先したらいいかわからなくなっている。

💡コンフリクトの解消

①差分を確認しファイルの内容を修正
②<<,==,>>を削除

<h1>Git</h1>
<<<<<<< HEAD
# HEAD(今のブランチ)のコード
<p>ようこそ</p>
=======
# featureブランチの変更コード
<p>こんにちは</p>
>>>>>>> feature

ブランチ

ブランチとは、分岐の連なりの記録。
ブランチを作る(=ブランチを切る)ことで、変更履歴を分岐して記録したり、合流させてそれぞれの変更内容を統合したりできる。

ブランチはコミットを指すポインタに過ぎない!
HEADとは、今自分が作業している場所を示すポインタ

https://qiita.com/ymzkjpx/items/00ff664da60c37458aaa

ブランチの作成・確認コマンド

コマンド 説明
git branch ブランチの一覧を表示
git branch ブランチ名 ブランチを作成。「ブランチ名」の部分に、作成するブランチの名前を指定
git checkout ブランチ名 ブランチ名を指定して切り替える
git checkout -b ブランチ名 ブランチの作成と切り替えをまとめて実行できるコマンド

参考にさせていただいたサイト🌱

https://zenn.dev/airiswim/articles/9ba44806ffd1b1
https://made.livesense.co.jp/entry/2017/08/22/080000
https://qiita.com/_ha1f/items/2dca1047c57d4f0bd465
https://www.slideshare.net/kotas/git-15276118
https://qiita.com/ymzkjpx/items/00ff664da60c37458aaa

https://www.youtube.com/watch?v=_RLmIG8rRIc&t=12s&ab_channel=だれでもエンジニア%2F山浦清透

Discussion