gitについて、まとめてみました。

Gitのメリット
--

__1.分散型バージョン管理システム__
Gitは分散型バージョン管理システムであるため、複数人での共同作業やリモートでの開発が容易に行えます。また、ローカルにリポジトリを持つことで、インターネットに接続されていない環境でも開発を進めることができます。

__2.履歴管理が容易__
Gitはファイルの変更履歴を記録するため、履歴管理が容易です。また、変更履歴を逆行させることもできます。これにより、コードのバグ修正や機能追加などを行う際に、安全に作業を進めることができます。

__3.ブランチ管理が容易__
Gitは、ブランチという機能を利用して、複数のバージョンを管理することができます。これにより、複数人での開発や複数の機能を同時に開発する場合に、混乱を避けながら作業を進めることができます。

__4.リモートリポジトリとの連携が容易__
Gitは、リモートリポジトリとの連携が容易です。リモートリポジトリにコードをアップロードしたり、他の開発者のコードを取り込んだりすることができます。

__5.オープンソース__
Gitはオープンソースソフトウェアであり、誰でも自由に利用することができます。また、多くの開発者によって開発が進められており、バグ修正や新しい機能の追加などが継続的に行われています。

目次
--
git init
git config
Gitのステージングエリア
git commit
git status
.gitignore
origin
remote add origin
git push
git pull
git clone
git branch
git merge
git rebase
git checkout
git reset --hard
git reset --soft
rebase -i

git init 
--
git init は、Gitリポジトリを作成するためのコマンドです。Gitリポジトリは、Gitで管理するプロジェクトのルートディレクトリに配置されます。 git init コマンドを実行すると、Gitは現在のディレクトリをリポジトリとして初期化し、必要なデフォルトファイルを作成します。このコマンドを実行することで、Gitの履歴を管理するための初期セットアップが完了します。git init コマンドを実行することで、新しいGitリポジトリを作成し、Gitでバージョン管理を開始できます。
~~~
git init
~~~

git config 
--
git config は、Gitの設定を管理するためのコマンドです。Gitの動作に関する設定を行うことができます。例えば、Gitのユーザー名やメールアドレスを設定したり、デフォルトのエディタを設定することができます。また、リモートリポジトリのURLや、ブランチのマージ方法に関する設定なども行えます。

git config コマンドは、グローバル設定やローカル設定を行うことができます。グローバル設定は、システム全体に適用される設定で、--global オプションを使用して設定します。一方、ローカル設定は、特定のリポジトリにのみ適用される設定で、--local オプションを使用して設定します。

リポジトリを使用する前に、コミットユーザー名とメールアドレスを設定する必要があります。以下は、例として設定する手順です。
~~~
git config --global user.name "Your Name"
git config --global user.email "your_email@example.com"
~~~
このようにして、新しいGitリポジトリが初期化され、コミットする準備が整います。

Gitのステージングエリア
--
Gitのステージングエリア（ステージ、インデックスとも呼ばれます）は、Gitでファイルをバージョン管理するための中間の領域です。Gitでは、ファイルの変更をステージングエリアに追加し、コミットに含める変更を選択します。

ステージングエリアを使うことで、Gitでは次のようなフローが可能になります。

__1.ファイルを変更する__
__2.git add コマンドで、変更をステージングエリアに追加する__
__3.git commit コマンドで、ステージングエリアに追加した変更をコミットする__
ステージングエリアを使用することで、複数のファイルの変更を一度にコミットに含めることができます。また、ファイルの変更内容を細かくコミットすることができるため、履歴を見やすくすることができます。

ステージングエリアは、Gitリポジトリの中に .git/index というファイルとして保存されます。git add コマンドでファイルをステージングエリアに追加すると、そのファイルのスナップショットが .git/index ファイルに保存されます。

__git addとgit commitの例__
example.txtという新しいファイルを作成し、git addコマンドを使用してファイルをステージング。
次に、git commitコマンドを使用して変更をコミットし、コミットメッセージ "Initial commit"を追加。

1.ファイルの新規作成
~~~
$ touch example.txt
~~~
2.Gitリポジトリの初期化
~~~
$ git init
Initialized empty Git repository in /path/to/repo/.git/
~~~
3.ファイルのステージング
~~~
$ git add example.txt
~~~
4.コミットの作成
~~~
$ git commit -m "Initial commit"
[master (root-commit) 08248c5] Initial commit
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 example.txt
~~~

git commit
--
git commit コマンドは、Gitのリポジトリに変更をコミットするためのコマンドです。git commit を使用することで、ステージングエリアに追加された変更を、Gitリポジトリの履歴に永続的に保存することができます。

git commit コマンドを実行すると、コミットメッセージのエディタが開きます。このエディタには、コミットに含める変更に関する詳細な情報を記述することができます。コミットメッセージには、変更内容や目的、修正した問題など、できるだけ詳細な情報を記述するようにしましょう。これにより、将来の開発者がコードを理解しやすくなります。

git commit コマンドのオプションを使用することで、コミットメッセージを直接指定することもできます。たとえば、git commit -m "Initial commit" のように、-m オプションを使用すると、直接コミットメッセージを指定できます。

git commit コマンドでコミットを作成すると、コミットID（SHA-1ハッシュ）が生成され、Gitリポジトリに永続的に保存されます。コミットIDは、将来的にそのコミットを特定するために使用されます。また、 git log コマンドを使用して、リポジトリの過去のコミット履歴を閲覧することができます。

git status
--
git status は、Git バージョン管理システムで現在の作業ディレクトリの状態を表示するためのコマンドです。Git リポジトリ内で作業をする際に、どのファイルが変更されたか、どのファイルがステージングされているか、どのブランチにいるかなどを確認することができます。また、コンフリクトやファイルの削除・追加など、現在の作業ディレクトリにある変更点を一覧表示してくれます。

git status コマンドの出力
現在のブランチ名
ステージングエリアに追加されているファイル
ステージングエリアに追加されていないが、Gitの管理下にあるファイル（変更がある場合は変更内容も表示されます）
コミットされていない変更がある場合、その変更の要約

__git statusコマンドを実行した際に表示される例__
~~~
On branch main
Your branch is up to date with 'origin/main'.

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
	modified:   file1.txt

Untracked files:
  (use "git add <file>..." to include in what will be committed)
	new_file.txt

no changes added to commit (use "git add" and/or "git commit -a")
~~~
現在のブランチがmainであることが表示されています。また、file1.txtが変更されていることが表示されており、コミットされていない変更があることが示されています。さらに、new_file.txtが未追跡のファイルであることも表示されています。最後の行では、変更をコミットする方法が示されています。

.gitignore 
--
.gitignore とは、Gitが無視するべきファイルを指定するためのファイルです。Gitリポジトリには、コードの他にも多くのファイルが含まれる場合があります。たとえば、実行可能ファイル、ログファイル、一時ファイル、バックアップファイルなどがあります。これらのファイルをGitが追跡しないように、.gitignore ファイルを使用して指定することができます。

.gitignore ファイルは、リポジトリのルートディレクトリに置かれます。ファイルの形式は、1行に1つのパターンを記述します。これらのパターンは、追跡しないファイル名、ディレクトリ名、拡張子などの情報を含みます。たとえば、次のような記述ができます。
~~~
# コメントは # で始める
*.log       # .log ファイルを無視する
/tmp        # tmp ディレクトリを無視する
~~~
また、ワイルドカードや正規表現などを使用して、複雑なパターンを指定することもできます。.gitignore ファイルに記述されたパターンにマッチするファイルやディレクトリは、Gitが無視し、コミットの対象から外れます。

.gitignore ファイルを使用することで、Gitリポジトリのサイズを小さくし、無関係なファイルを追跡することを避けることができます。また、共同作業をする場合に、開発者間で無視するファイルやディレクトリを共有することができます。

origin 
--
origin は、リモートリポジトリのデフォルトの名前です。git push や git pull コマンドなど、リモートリポジトリとのやり取りを行う際に、通常は origin という名前が使用されます。

リモートリポジトリを追加する際に、リモートリポジトリのURLを git remote add コマンドで追加することができます。このとき、リモートリポジトリの名前を指定することができます。通常は、最初に追加されたリモートリポジトリが origin という名前になります。

リモートリポジトリの名前を変更することもできますが、origin という名前は、一般的にデフォルトの名前として使用されているため、変更する必要がある場合は慎重に行う必要があります。

remote add origin
--
git remote add コマンドは、リポジトリにリモートリポジトリを追加するためのコマンドです。git remote add コマンドを使用することで、現在のリポジトリに対して、リモートリポジトリの参照名とURLを登録することができます。

git remote add コマンドには、リモートリポジトリに対して参照する名前を指定する必要があります。通常、この名前は origin と呼ばれますが、任意の名前を使用することができます。次に、リモートリポジトリのURLを指定する必要があります。たとえば、GitHub上のリポジトリを追加する場合は、次のようにコマンドを実行します。origin は、リモートリポジトリの参照名であり、URLはGitHub上のリポジトリのURLです。このコマンドを実行することで、リモートリポジトリに対して参照名が origin で、URLが指定されたリポジトリのURLになるように登録されます。
~~~
git remote add origin https://github.com/<ユーザー名>/<リポジトリ名>.git
~~~

例えば、GitHub上に作成したリモートリポジトリを、ローカルのGitリポジトリに追加する場合に使用します。以下は、リモートリポジトリを "origin" という名前で追加する例です。

~~~
git remote add origin https://github.com/username/repo.git
~~~
これにより、"origin" という名前のリモートリポジトリが追加され、"https://github.com/username/repo.git" というURLが関連付けられます。以降、"origin" を引数として使用することで、このリモートリポジトリに対してプッシュやプルなどの操作を行うことができます。

git remote add コマンドを使用することで、複数のリモートリポジトリをリポジトリに追加することができます。また、 git remote -v コマンドを使用して、リポジトリに登録されているリモートリポジトリの一覧を確認することができます。

git remote -v コマンドの例
~~~
git remote -v
~~~
このコマンドを実行すると、現在のGitリポジトリに設定されているリモートリポジトリの一覧が表示されます。

出力例
~~~
origin  https://github.com/username/repo.git (fetch)
origin  https://github.com/username/repo.git (push)
~~~
この例では、"origin" という名前で "https://github.com/username/repo.git" というURLのリモートリポジトリが設定されていることがわかります。また、"fetch" と "push" というキーワードが表示されていますが、これらはリモートリポジトリの取得と送信に使用されるプロトコルを表しています。

git push 
--
git push コマンドは、ローカルのコミットをリモートリポジトリに反映するためのコマンドです。つまり、ローカルで行った変更をリモートリポジトリにアップロードすることができます。git push コマンドを実行するには、次のようにコマンドを入力します。
~~~
git push origin main:main
~~~
このコマンドを実行することで、ローカルの main ブランチの変更内容がリモートの main ブランチに反映されます。

git push コマンドは、変更内容をリモートリポジトリにアップロードすることで、他の開発者と変更内容を共有することができます。また、複数の開発者が同じリモートリポジトリにプッシュする場合、競合する可能性があるため、マージやプルリクエストなどの手順を行う必要があります。

git pull
--
git pull コマンドは、リモートリポジトリから最新のコミットを取得して、ローカルリポジトリに反映するためのコマンドです。つまり、リモートリポジトリに存在する最新の変更をローカルリポジトリに取り込むことができます。

git pull コマンドを実行するには、次のようにコマンドを入力します。
~~~
git pull <リモート名> <リモートブランチ>
~~~
ここで、 <リモート名> は、リモートリポジトリの名前を指定します。通常、リモートリポジトリの名前は origin と呼ばれます。 <リモートブランチ> は、取得したいリモートブランチの名前を指定します。

たとえば、リモートの main ブランチから最新の変更を取得する場合、次のようにコマンドを入力します。
~~~
git pull origin main
~~~
このコマンドを実行することで、リモートリポジトリの main ブランチの最新の変更内容がローカルリポジトリに反映されます。

git pull コマンドは、git fetch コマンドと git merge コマンドを実行することに相当します。git fetch コマンドは、リモートリポジトリから最新の情報を取得し、ローカルリポジトリに反映します。そして、 git merge コマンドは、ローカルブランチとリモートブランチの変更内容をマージします。つまり、 git pull コマンドは、リモートリポジトリから最新の変更内容を取得して、自動的にマージすることができます。

git clone 
--
git clone コマンドは、リモートリポジトリをローカルマシンに複製するためのコマンドです。つまり、リモートリポジトリのすべてのファイルと履歴をローカルマシンにコピーすることができます。

git clone コマンドを実行するには、次のようにコマンドを入力します。
~~~
git clone <リモートリポジトリURL>
~~~
ここで、 <リモートリポジトリURL> は、複製したいリモートリポジトリのURLを指定します。

たとえば、GitHub上のリポジトリをクローンする場合、次のようにコマンドを入力します。
~~~
git clone https://github.com/<ユーザー名>/<リポジトリ名>.git
~~~
このコマンドを実行することで、リモートリポジトリのすべてのファイルと履歴がローカルマシンにコピーされます。また、ローカルマシンには、リモートリポジトリの名前が origin として登録されます。

git clone コマンドを使用することで、他の開発者が作成したリポジトリを自分のローカルマシンで操作することができます。また、複数の開発者が同じリポジトリにアクセスする場合、 git clone コマンドを使用して、すべての開発者が同じリモートリポジトリを操作することができます。

git branch 
=
git branch コマンドは、ブランチを作成、表示、削除するためのコマンドです。Gitでは、複数のブランチを使用して、異なる開発タスクやバージョンの開発を同時に進めることができます。

git branch コマンドを実行するには、次のようにコマンドを入力します。
~~~
git branch <ブランチ名>
~~~
ここで、 <ブランチ名> は、新しいブランチの名前を指定します。新しいブランチが作成された後、そのブランチにチェックアウトする必要があります。

git branch コマンドを使用することで、異なるバージョンの開発を別々のブランチで行い、独立して開発を進めることができます。また、新しい機能を実装する場合やバグ修正を行う場合など、開発タスクに応じて、新しいブランチを作成することができます。

git branchコマンドの例
~~~
git branch
~~~
このコマンドを実行することで、現在のブランチのリストが表示されます。
出力例
~~~
  main
* feature-branch
  bugfix-branch
~~~
この例では、"main"、"feature-branch"、"bugfix-branch" という3つのローカルブランチが存在していることがわかります。また、"feature-branch" の前に "*" が付いていますが、これは現在アクティブなブランチ(現在のブランチ)であることを示しています。また、このコマンドを "git branch -a" と実行することで、リモートブランチも含めたすべてのブランチを表示することができます。

git merge 
--
git merge コマンドは、2つの異なるブランチを統合するためのコマンドです。ブランチを切り替えて別のバージョンの開発を進めている場合や、チームメンバーと別々に作業を進めている場合など、複数のブランチを統合する必要がある場合に使用されます。

git merge コマンドを使用するには、統合先のブランチにチェックアウトしてから、次のようにコマンドを入力します。
~~~
git merge <統合元のブランチ>
~~~
ここで、 <統合元のブランチ> は、統合元となるブランチの名前を指定します。このコマンドを実行すると、統合元ブランチの変更内容が統合先ブランチに反映されます。

また、 --no-ff オプションを使用することで、ブランチの履歴を残すことができます。このオプションを指定しない場合、Fast-forwardマージが行われ、履歴が残らなくなります。

git merge コマンドを使用することで、異なるブランチの変更内容を統合することができます。ただし、複数の人が同時に作業を進めている場合など、競合が発生する可能性があるため、統合作業には注意が必要です。

git rebase
--
git rebase コマンドは、2つのブランチの歴史を再構築するためのコマンドです。git merge コマンドと同様に、異なるブランチを統合することができますが、git rebase コマンドは、統合元ブランチの変更内容を、統合先ブランチの先頭に移動させることができます。

具体的には、次のような手順で git rebase コマンドを使用します。

__git checkout__ 
git checkout コマンドを使用して、統合先のブランチに移動します。
~~~
git checkout feature/my-feature-branch
~~~

__git rebase__
コマンドを使用して、統合元のブランチの変更内容を移動させます。
~~~
git rebase 「main<統合元のブランチ>」
~~~
競合がある場合は、競合を解消します。

__git add__
競合が解消されたファイルをステージングします。

__git rebase --continue__
リベースを続行します。

__git branch -d <統合元のブランチ>__
統合元のブランチを削除します。

git rebase コマンドを使用することで、ブランチの歴史を整理することができます。ただし、統合元ブランチにコミットが多数ある場合は、リベースに時間がかかる可能性があるため、注意が必要です。また、競合が発生する可能性があるため、統合作業には注意が必要です。

git checkout 
--
git checkout コマンドは、ブランチの切り替えやコミットの復元、ファイルの復元など、リポジトリの状態を切り替えるためのコマンドです。

例えば、別のブランチに移動する場合、 git checkout コマンドを使用します。次のようにコマンドを入力します。
~~~
git checkout <ブランチ名>
~~~
ここで、 <ブランチ名> は、移動したいブランチの名前を指定します。また、コミットを復元する場合、コミットのハッシュ値を指定します。

また、 git checkout コマンドを使用して、特定のファイルやディレクトリを復元することができます。次のようにコマンドを入力します。
~~~
git checkout <ファイル名>
~~~
ここで、 <ファイル名> は、復元したいファイルの名前を指定します。また、ディレクトリを復元する場合は、 -f オプションを使用して、ディレクトリを強制的に復元する必要があります。

git checkout コマンドを使用することで、ブランチの切り替えやコミットの復元、ファイルの復元など、リポジトリの状態を簡単に切り替えることができます。ただし、このコマンドは、リポジトリの状態を変更するため、注意して使用する必要があります。

git reset --hard 
--
git reset --hard コマンドは、指定したコミットまでの履歴を取り消し、作業ツリーとインデックスを指定したコミットの状態に戻すコマンドです。このコマンドは、作業中の変更を完全に破棄するため、注意して使用する必要があります。

--hard オプションを使用することで、作業ツリーとインデックスも指定したコミットの状態に戻します。つまり、指定したコミット以降の変更がすべて破棄されます。このため、実行する前に注意深く確認する必要があります。

git reset --soft
--
git reset --soft は、git reset コマンドのオプションの一つで、リセットしたいコミットを指定することで、そのコミットまでの履歴を取り消し、作業ツリーとインデックスを変更せずに、コミット履歴だけを変更することができます。

具体的には、git reset --soft <コミットID> を実行すると、指定したコミットIDの直前の状態に戻しますが、作業ツリーやインデックスの状態はそのまま保持されます。これにより、リセット後に必要な変更を再度ステージングしてコミットすることができます。

git reset --soft は、過去のコミットメッセージを修正するために使用することができます。例えば、最新のコミットメッセージに誤りがあった場合、git reset --soft HEAD~1 コマンドで直前のコミットに戻し、git commit --amend コマンドで新しいメッセージに修正することができます。

rebase -i 
--
rebase -i は、Gitのコマンドで、対話的なリベースを行うためのオプションです。

通常のリベースでは、ブランチの履歴を取り込むために、現在のブランチからリベース先のブランチにチェックアウトしてから、リベースを実行します。しかし、rebase -i を使用すると、リベースの実行前に、編集可能なテキストエディタで変更履歴を見ることができます。

具体的には、git rebase -i <リベース先のブランチ> コマンドを実行することで、編集可能なテキストエディタが開きます。ここで、変更履歴を見ながら、各コミットに対して変更を加えたり、スキップしたり、コミットの順序を変えたりすることができます。

rebase -i は、複数のコミットをまとめたり、コミットメッセージを変更したりする際に便利です。また、コミットの履歴を整理したい場合にも使用することができます。ただし、コミット履歴を変更するため、注意が必要です。