はじめに
Git Advent Calendar 2023 1日目の投稿です。よろしくおねがいします。
新入社員のころGitを使うプロジェクトに配属された際に、わけもわからず黒い画面でadd
してcommit
だけしていました。また、みんなのソースコードをぶっ壊したらどうしようとおびえながらマージをしていました。
そんな過去の自分に向けてGitが怖くなくなるように、何日かにかけてGitについてハンズオン形式で使ってみたいと思います。
この記事と次の記事で目指すところは、Gitを知らない新入社員が入ってきたプロジェクトで「Gitについてはとりあえずこの記事よんで触っといて」と渡せるような説明を書くことです。
あとは、年末年始の暇つぶしとして読んでいただければうれしいです
(まあ、公式でドキュメントがそろってるしネットにもこういう記事はありふれてるんですけど、アウトプットすると身につくっていうし、自分の頭の整理でもあります。)
環境
Windowsを使用して、Gitのバージョンは下記を使います。
$ git --version
git version 2.22.0.windows.1
また、Git Bashを使っています。
そもそもGitって?
GitはLinuxカーネルの開発をサポートする目的で、Linus Torvaldsによって作成された分散バージョン管理システムです。
バージョン管理システムには他にもSubversionとかMercurialとかいろいろあるのですが、Linusはもともと使っていたバージョン管理システムBitKeeperの代わりを探した果てに自分で作ることを選んだようです。
よく、「大規模プロジェクトを効率的に取り扱いできること」や「分散開発を容易にすること」などがGitのメリットとして言われますが、新入社員のころの私にいってもピンとこないので割愛します。ここでは、便利なんだな~程度の理解で十分です。とりあえずGitの使い方に慣れましょう。
ちなみに「git」とはイギリス語のスラングで「あほ、まぬけ」を意味します。これは、Linusの命名の付け方が自分自身にちなんだ名前を付けるから…という意図があるとかないとか。
Gitを使ってみる
さっそくGitを使っていきます。
インストーラをここから入手して自身の端末にインストールしておきます。
git init
まず、フォルダをGitのリポジトリとして認識させるために打つコマンドがgit init
です。
「リポジトリ」とはファイルやディレクトリの状態を記録していく場所のことです。
リポジトリに記録していくことで、「あの時のファイルの中身ってどうなってるんだろな~」って思った時に過去のある時点に戻れたり、「いま何を修正したんだっけ」となった時に過去と今のファイル間の差分を取れたりするようになります。
ではでは、さっそくリポジトリを作ってみましょう。
まずデスクトップに「git/sample」フォルダを用意します(初心者向けなので具体的な場所を指定していますが、別にどこでもいいです)。
次にGit Bashを開いて「git/sample」フォルダまで移動します。
ここでgit init
します。
~/Desktop/git/sample
$ git init
すると、、
~/Desktop/git/sample
$ git init
Initialized empty Git repository in 『フォルダ名』
~/Desktop/git/sample (master)
$
メッセージを訳すと「空のGitリポジトリとして初期化」のコメントが表示されて、ディレクトリの後ろに(master)
と付いたことがわかります。いったん(master)
は気にしなくて大丈夫です。
これで、このフォルダはGitのリポジトリとして認識されて、ファイルやディレクトリの状態を記録していくことができるようになりました。
ここで、「git/sample」フォルダを見てみましょう。
「.git」フォルダが生成されていることがわかります。このフォルダはGitが管理するフォルダなので、中身をいじらないでください。
Gitのファイルやディレクトリの状態や設定などすべての情報をここで管理しています。Gitのコマンドを打つとこの「.git」フォルダの中身が更新されてGit君は状況を管理しています。
アドベントカレンダー 3日目で「.git」に触れますので、そこでコマンドによって中身がどう変わるか見てみてください。
git config
実はリポジトリに作業していくためには、名前とメールアドレスの登録が必要です(細かく言うとコミットするためにコミット作成者の設定が必須です。だれがファイルを修正したかGitが把握できないからですね)。
設定にはgit config
コマンドを使います。
~/Desktop/git/sample (master)
$ git config user.name "hogehoge"
~/Desktop/git/sample (master)
$ git config user.email "fugafuga"
上のコマンドを打つことで、「hogehoge」という名前で「fugafuga」というメールアドレスをもつ作業者であることをGitが認識します。
また、設定内容を確認したい場合はgit config --list
でいけます。
~/Desktop/git/sample (master)
$ git config --list
core.symlinks=false
…
user.name=hogehoge
user.email=fugafuga
ちなみに同一の設定内容がある場合は下のものが有効になります。
git addとgit commit
では、次にファイルをリポジトリに管理させてみましょう。
ファイルをリポジトリに登録して管理させるにはgit add
とgit commit
コマンドを使います。
Gitでファイルを管理する場合、リポジトリに変更を登録する前にインデックスという作業内容を一時的に登録する領域へリポジトリに登録する内容を集めます。そして、インデックスに集まった作業内容をひとまとまりの変更としてコミットします(インデックスのことをステージング領域という人もいます)。
インデックスに登録するにはgit add
を、インデックスに登録した内容をリポジトリに登録するにはgit commit
を使います。
また、ここでは「ステージする」と言ったらインデックスにファイルを登録すること、「コミットする」と言ったらインデックスに登録されてる修正内容をリポジトリに登録することを指します。
要は、Gitは段階を踏んでリポジトリに登録して管理させることを行います。
最初使っているころは、add
なんていらないだろと億劫さを感じますが、add
には以下の意味があると思ってます。
- コミットせずに複数の作業をした場合に1つのコミットに1つの作業内容をまとめられる。
- コミットの前に冷静に修正内容を確認できる。
この辺は使っているうちに感じるようになると思いますし、賢い人が考えたシステムなので他にもいろいろなメリットがあるんだと思います。初心者の内はコミットにまとめたい内容をadd
してコミットする内容を確認してからcommit
する、と覚えておけば十分かなと思ってます。
ってことで、やっていきましょう。
まず、Gitのリポジトリで空ファイル「sample.txt」を作ります。
ここでGitに戻り、git status
を打ちます。
git status
コマンドでは、作業フォルダとインデックスの状況を確認できます。
~/Desktop/git/sample (master)
$ git status
On branch master
No commits yet
Untracked files:
(use "git add <file>..." to include in what will be committed)
sample.txt
nothing added to commit but untracked files present (use "git add" to track)
日本語に訳してみると、「コミットするためにadd
されているものはなく、未追跡ファイルがあるよ(追跡するにはgit add
を用いよ)」とのことから、未追跡ファイル(Untracked files)に「sample.txt」があるとGitが認識してることがわかります。
ここで未追跡ファイルとは何なのか説明しておきます。
Gitではファイルを3つのグループに分けて管理します。
-
追跡(tracked)
- 既にリポジトリかインデックスに登録されたファイルのこと。履歴が管理されてる。
- 1度コミットもしくはステージしたファイルはこの状態になっています。
-
無視(ignored)
- リポジトリで管理しないことが明示的に宣言されているファイルのこと。
- 各々の環境に依存する設定ファイルなんかはこの状態にします。
-
未追跡(untracked)
- 上の2つのグループに属さないファイルのこと。履歴を管理していない。
- 初めて作成されたファイルはこの状態です。
未追跡ファイルはgit commit
で一度リポジトリに登録するとファイルを追跡するようになります。
では、git add
とgit commit
を通じて、リポジトリに作業内容(今回で言ったら空ファイルの作成)を登録しましょう。
まずは、git add
です。git add ファイル名
で登録できます。
特に何もコンソールには表示されないと思いますが、続けてgit status
をしてインデックスの状態を確認しましょう。変化がわかると思います。
~/Desktop/git/sample (master)
$ git add sample.txt
~/Desktop/git/sample (master)
$ git status
On branch master
No commits yet
Changes to be committed:
(use "git rm --cached <file>..." to unstage)
new file: sample.txt
「コミットされる変更」として、新しく「sample.txt」がインデックスに登録されました。
ちなみに、ここで作業フォルダのファイルを変更するとどうなるでしょうか(git add
した後にソースコードの誤りに気付いてファイルを編集することは往々にしてありそうです)。
「sample.txt」を開いて適当に文字を打ちましょう。
ここでgit status
をしてインデックスと作業フォルダの状態を確認してみます。
~/Desktop/git/sample (master)
$ git status
On branch master
No commits yet
Changes to be committed:
(use "git rm --cached <file>..." to unstage)
new file: sample.txt
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: sample.txt
コミットされる変更(Changes to be committed)として「sample.txt」が、ステージされていない変更(Changes not staged for commit)として「sample.txt」があります。
このまま続けてgit commit
をすると、コミットされるのはあくまでもインデックスに登録した変更内容になります。先ほどの修正内容をリポジトリに登録したい場合は、再度git add
をする必要があります。
今は適当にとりあえずgit add
しちゃいましょう(実務でしたら、再度修正した内容をコミットに含むべきかどうか(git add
すべきかどうか)考えましょう)。
最後にインデックスに登録した作業内容をgit commit
してリポジトリに登録します。
~/Desktop/git/sample (master)
$ git commit
これを打つとデフォルトの設定では黒い画面が出てきます。これはviと呼ばれるエディタでここでコミットメッセージを入力して作業内容がなんなのか後で見返せるようになります。
初心者向けにviで覚えておくべきは以下の4つかなと思います(Gitを使う上でとりあえずの4つ)。
- i:コマンドモードから入力モードに移動
- Escキー:入力モードからコマンドモードに移動
- :q!⇒Enterキー:保存せず終了(コマンドモード)
- :wq⇒Enterキー:保存して終了(コマンドモード)
まずはi
を押して入力モードにして1行目にコミットメッセージ、必要に応じて詳細なコメントを3行目以降に書いてEsc
キーでコマンドモードへ、:wq
でEnter
キーを押して登録できます。
また、まれによくコミットしたくなくなる時があります。そんな時に使うのが:q!
コマンドです。
今回はコミットメッセージに「はじめてのコミット」と入力して、リポジトリに作業内容を登録しましょう。
「コミットメッセージを間違えた、、」なんて方はgit commit --amend
を使いましょう。このコマンドは直前のコミットを修正するために使います。git commit --amend
をすると再度エディタが表示されますのでここでメッセージを変更しましょう。
以上でリポジトリに登録する作業が完了です。作業フォルダの内容がリポジトリに登録されましたね。
今回のまとめ
今回はgit init
をしてリポジトリの作成をして、git add
とgit commit
を通じてリポジトリにファイルを管理させるところまで行いました。まだまだGitの何がうれしいのか伝わらないかもしれませんがとりあえず使ってみることが出来れば幸いです。
間違いがあればコメントでご指摘いただけるとうれしいです