Gitは、最も使われているバージョン管理ソフトウェアです。2018年の調査では、開発者の87%がGitを使っているそうです。https://insights.stackoverflow.com/survey/2018#work-_-version-control
バージョン管理ソフトウェアとは、ソフトウェア開発のソースファイルの変更履歴を管理するソフトウェアです。ソースファイルだけでなく、画像ファイルなどのバイナリーファイルも扱います。
ところで、Gitは、開発者でも使い方に慣れるまで時間がかかったり、開発者以外の人には敬遠されがちのようです。
Gitはローカルリポジトリだけで使うことは少ないです。いきなり、github.comなどのリモートリポジトリからcloneしてくださいと言われる人も多いと思います。
そのため、あまりGitを理解していないのに、ローカルリポジトリの操作だけでなくリモートリポジトリの操作もしなくてはならないことが、慣れにくかったり、敬遠されがちな原因かもしれません。
そこで、ローカルリポジトリ操作、ブランチ操作、リモートリポジトリ操作に分けて説明します。
ローカルリポジトリ操作
新規作成
空のディレクトリ myproj 1を作り、gitリポジトリを新規作成したとします。
$ mkdir myproj1
$ cd myproj1
$ git init
Code language: Bash (bash)
すると、myproj1の下に、隠しディレクトリ .git が作られます。この .git がローカルリポジトリです。これからコミットしていく全ての履歴、ブランチ、タグが格納されます。
作成直後は、masterブランチです。
.gitを除くmyproj1の下をworkspcaeを言います。まだworkspaceはカラです。
addとcommit
まだ、.gitのmasterブランチには何もありません。
myproj1の下でa.txtを新規作成しました。
すると、masterブランチとworkspaceが違うので、a.txtは「変更あり」とGitに認識されます。
次に、a.txtをコミットしたいのですが、コミットする前に、ステージという状態にします。この操作が git add です。
なぜ、ステージが必要なのでしょうか。コミット前の確認という意味があります。
例えば、webの申し込みフォームが、確認、送信の2段階になっているように、
ステージ:コミット内容の確認
コミット:コミットの実行
のように考えてもいいと思います。
ステージ状態にしたら、コミットします。
restore
a.txtを編集した後、コミット前なら、restore操作することで、編集前の状態に戻すことができます。
git restore -staged で、ステージ状態から、ただの変更あり、に戻します。
git restore で、編集前の状態に戻します。
ブランチ操作
よくあるシナリオは、ます、masterブランチから、作業用のdevelopブランチを新規作成します。
developブランチをチェックアウトします。workspaceがdevelopブランチの内容になります。
編集作業をして、developブランチにコミットします。
masterブランチをチェックアウトします。
masterブランチで、developブランチからマージします。
新規作成
.git下のローカルリポジトリに、ブランチを新規作成します。
チェックアウト
.git下のローカルリポジトリのブランチからファイル群をとりだしてきて、workspaceに展開します。
マージ
別のブランチのコミットをチェックアウト中のブランチに取り込みます。
リモートリポジトリ操作
github.comなどにリポジトリを作成して、これを中央リポジトリ的に運用します。これがリモートリポジトリです。
開発メンバーは、それぞれのPCにローカルリポジトリを持っています。リモートリポジトリをハブとして、それぞれのメンバーのローカルリポジトリが同期されます。githubは、まさにそのことを表しています。
よくあるシナリオは、
Aさんがmasterブランチで作業してコミットしました。
次に、Aさんがmasterブランチをリモートリポジトリのmasterブランチへpushしました。
Bさんが、リモートリポジトリからfetchします。すると、リモートリポジトリのmasterブランチに新しいコミットがあることがわかりました。
Bさんは、リモートリポジトリmasterブランチからpullします。すると、Aさんのコミット内容が、Bさんのローカルリポジトリのmasterへマージされました。
push
ローカルリポジトリのコミットを、リモートリポジトリへ送信します。
リモートリポジトリ側は、受信したコミットをブランチへマージします。
fetch
リモートリポジトリから、最新のコミットをダウンロードします。
ダウンロードするだけで、ローカルリポジトリのブランチへのマージはされません。
pull
fetchと同時にmergeします。
つまり、リモートリポジトリから、最新のコミットをダウンロードして、ローカルリポジトリのチェックアウト中のブランチへ取り込みます。