generated at
Git
プログラムのソースコードなどの変更履歴を管理するためのシステム(バージョン管理システム)。
複数人の作業者でプログラムを編集する場合、作業者同士で同じプログラムを確認できたほうがよいし、変更履歴を管理できたほうがよい。これらの目的を達成するためにバージョン管理システムが使われる。

複数人の作業者でプログラムを編集する場合、リポジトリ(一連のソースコードの集まり)の複製を、各作業者のコンピュータ上で保管し、同期をとることになる。
インターネットの接続がなくても、プログラムの編集や変更履歴の管理を行うことができるように設計されている。
複数人の作業者が異なる作業を並行して進められるように設計されている。

ダウンロード・インストールする

Gitでは、リポジトリの変更履歴を記録する際に、誰がその変更を加えたのかを記録する。この際に使用する情報をGitに登録しておく。
ユーザー名の登録
$ git config --global user.name "<ユーザー名>"
Gitの変更履歴の記録時に名乗るユーザー名を設定する。
$ git config --global user.name "mgn901"
例: Gitの変更履歴の記録時に名乗るユーザー名を mgn901 にする。
メールアドレスの登録
$ git config --global user.email <メールアドレス>
Gitの変更履歴の記録時に名乗るユーザーのメールアドレスを設定する。
$ git config --global user.email mgn901+dev@gmail.com
例: Gitの変更履歴の記録時に名乗るユーザーのメールアドレスを mgn901+dev@gmail.com にする。
GitHubを使用する場合は、GitHubに登録したメールアドレスか、GitHubの設定で確認できるnoreplyメールアドレス(@users.noreply.github.comで終わるメールアドレス)を使うことをお勧めします。

リポジトリを作成する
リポジトリにしたいディレクトリに移動してから次のコマンドを実行する。
$ git init

変更履歴を記録する(コミット)
リポジトリ内のソースコードの変更は「コミット」という形で記録する。
コミットを作成する際は、次の2つの情報が必要である。
1. 直近のコミットに対して変更した部分
直近のコミットに対して変更があったファイルは「作業ツリー」に入っている。
$ git status
作業ツリーに含まれるファイルを一覧表示する。
作業ツリーの中から、コミットに含めたいファイルまたはディレクトリを選び、 git add コマンドを使って「ステージングエリア」に追加する。
$ git add <ステージングエリアに追加するファイルまたはディレクトリ>
$ git add ./README.md
例: ステージングエリアに ./README.md を追加する。
ステージングエリアに含まれるファイルも git status コマンドで確認できる。
2. コミットメッセージ(変更内容の説明)
git commit コマンドを使ってコミットメッセージを入力し、コミットを作成する。
$ git commit -m "<コミットメッセージ>"
$ git commit -m "README.mdを追加"
例: コミットメッセージを README.mdを追加 として、コミットを作成する。
ステージングエリアに追加された変更内容とコミットメッセージは、作成されたコミットとともに記録される。
リポジトリは過去に作成されたコミットの履歴をすべて記録している。
リポジトリを、過去のコミットが作成された時点に、巻き戻したり進めたりすること(チェックアウト)もできる。チェックアウトすると、Gitがファイルシステムを書き換えて、過去のコミットが作成された時点のリポジトリの中身を再現してくれる。

1つのリポジトリを複数人で編集する
リモート機能とブランチ機能を使いこなすことで、1つのリポジトリを複数人で編集することができる。
各作業者にリポジトリを配布する方法
1. リポジトリをWeb上に配置する。
例えばGitリポジトリのホスティングサービスであるGitHubにリポジトリを配置すると、複数人でのプログラムの編集に供することができる。
2. 各作業者が、Web上のサーバーからリポジトリの複製をダウンロードする。
リポジトリを保存したいディレクトリに移動してから次のコマンドを実行する。
$ git clone <リポジトリのURL>
指定したURLからリポジトリの複製を取得し、作業ディレクトリ配下の新しいディレクトリに保存する。
各作業者が並行して作業を進める方法
前提
GitHub上のリポジトリも含めて、すべてのリポジトリの複製の間で、同じコミット履歴を持っている必要がある。
しかし、各作業者が並行して作業を進めてコミットを作成すると、各リポジトリの間で異なるコミット履歴が生じることになる。
そこで、各作業者が作業する際にコミット履歴を分岐させ、最後に本来のコミット履歴と合流させることにする。
用語説明
「ブランチ」
コミット履歴中の特定のコミットを指す目印のこと。
リポジトリには必ず1つ以上のブランチが存在している( master main という名前であることが多い)。
「ブランチにチェックアウトする」
そのブランチに対応しているコミットにチェックアウトすること。
リポジトリの作成後や複製後は、必ず何かしらのブランチにチェックアウトしている。
このようなブランチを「デフォルトブランチ」と呼ぶ。
デフォルトブランチは master ブランチや main ブランチであることが多い。
ブランチにチェックアウトしている状態でコミットを作成すると、ブランチ(目印)は、作成されたコミットを指すように付け替えれる。
コミット履歴を分岐させる方法
1. ブランチを作成する。
$ git branch <ブランチ名> <分岐元のブランチ名>
分岐元のブランチが指すコミットと同じコミットを指す新しいブランチを作成する。
$ git branch <ブランチ名>
分岐元のブランチ名を省略すると、現在チェックアウトしているブランチを分岐元のブランチとする。
$ git branch branch-a master
例: master ブランチが指すコミットと同じコミットを指す branch-a ブランチを作成する。
mmd
%%{init: {'gitGraph': {'showBranches': false}} }%% gitGraph TB: commit id:"0" commit id:"1" tag:"master, branch-a"
2. 作成したブランチにチェックアウトする。
$ git checkout <ブランチ名>
$ git checkout branch-a
例: branch-a にチェックアウトする。
3. ソースコードに変更を加え、コミットを作成する。
branch-a にチェックアウトした状態でコミットを作成すると、
branch-a は作成されたコミットを指すように付け替えれる。
master は前のコミットを指し続けたままである。
mmd
%%{init: {'gitGraph': {'showBranches': false}} }%% gitGraph TB: commit id:"0" commit id:"1" tag:"master" branch branch-a commit id:"2" tag:"branch-a"
GitHub上で、分岐させたコミット履歴を本来のコミット履歴に合流させる方法
1. ブランチのコミット履歴を複製元のリポジトリに反映する(プッシュ)。
$ git push <リモート名> <ブランチ名>
$ git push origin branch-a
例: リモート origin branch-a ブランチをプッシュする。
リポジトリの複製後は、複製元のリポジトリのURLが origin という名前のリモートリポジトリとして登録されている。
図: プッシュ後のリモートリポジトリ
mmd
%%{init: {'gitGraph': {'showBranches': false}} }%% gitGraph TB: commit id:"0" commit id:"1" tag:"origin/master" branch branch-a commit id:"2" tag:"origin/branch-a"
2. GitHub上でプルリクエストを作成・マージする。
branch-a master にマージするプルリクエストを作成し、実際にマージされると、 master が指すコミット時点での状態と、 branch-a が指すコミット時点での状態とを合わせた状態を記録する、新しいコミットが作成され、 master ブランチは新しいコミットを指すように付け替えられる。
mmd
%%{init: {'gitGraph': {'showBranches': false}} }%% gitGraph TB: commit id:"0" commit id:"1" branch branch-a commit id:"2" tag:"origin/branch-a" checkout main merge branch-a tag:"origin/master"
3. 各作業者のリポジトリに最新のコミット履歴を取り込んでもらう。
デフォルトブランチにチェックアウトしてから、複製元のリポジトリのコミット履歴を取り込む。
$ git fetch
例: 複製元のリポジトリのコミット履歴を取得する。
$ git pull
例: 複製元のコミット履歴を現在のブランチに取り込む。このコマンドを実行した時に master ブランチにチェックアウトしているのであれば、手元のリポジトリの master ブランチを、複製元の master ブランチが指すコミットと同じコミットを指すように付け直す。

コンフリクト
branch-b main ブランチにマージして、次の図のような状態にしたい。
mmd
%%{init: {'gitGraph': {'showBranches': false}} }%% gitGraph TB: commit id:"0" commit id:"1" branch branch-a branch branch-b checkout branch-a commit id:"2" tag:"origin/branch-a" checkout main merge branch-a checkout branch-b commit id:"3" tag:"origin/branch-b" checkout main merge branch-b tag:"origin/master"
コミット 2 README.md を変更していて、コミット 3 でも README.md を変更していたとする。さらに、コミット 2 で変更を加えた箇所に、コミット 3 でも変更を加えていて、しかも内容が異なっていたとする。この場合、 branch-b のマージコミット時点の README.md の内容は一意に定まらない。このような状態を、コンフリクトが発生していると言う。

参考にした資料
Scott Chacon, Ben Straub「Git - Book」(日本語版