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にする。
リポジトリを作成する
リポジトリにしたいディレクトリに移動してから次のコマンドを実行する。
$ 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ブランチを作成する。
code: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は前のコミットを指し続けたままである。
code: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という名前のリモートリポジトリとして登録されている。
図: プッシュ後のリモートリポジトリ
code: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ブランチは新しいコミットを指すように付け替えられる。
code: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ブランチにマージして、次の図のような状態にしたい。
code: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の内容は一意に定まらない。このような状態を、コンフリクトが発生していると言う。
参考にした資料