2023年12月28日こんにちは!この記事ではgitの操作についてまとめます。エンジニアとして働き始めた方のほとんどがgitで壁にぶつかります。今現在、困ってる方も多いのではないでしょうか。僕も壁にぶち当たりました。そんな経験をもとにこの記事を執筆しました。gitの操作についてこの記事を読めば大丈夫!というものを目指すので記事が長くなります。前提知識gitでのソースコードの管理gitを扱う上で知っておくべき前提知識をここで説明します。前提知識とは言いましたが、そんなに難しい話ではないのであまり怖がらず読んでみてください。(gitには詳しいから大丈夫という方は飛ばしていただいて構いません。)まずは下の図をみてください!gitでのソースコードの管理を簡単に説明すると以下の通りです。変更内容をステージに上げる(add)ステージの内容をリポジトリ(ローカル)に上げる(commit)ローカルリポジトリの内容をリモートリポジトリに反映する(push)詳しい内容は後で説明しますが、概要は上記の通りです。リモートリポジトリって?リモートリポジトリはみんなで共有しているリポジトリです。ここでいうみんなとは開発チームのメンバーなどです。このリモートリポジトリを個人の環境(ローカル)に持ってきます。この作業をcloneと言います。それぞれが自分の環境でソースコードを修正し、ステージにあげ、そしてリポジトリにあげます。このリポジトリをリモートリポジトリに反映させると、各々が書いたコードを一つにまとめられます。無知猫じゃあ最初からみんなでリモートリポジトリをいじればいいじゃん!しかしこれをしてしまうと不都合があるのです。AさんとBさんが同時にリモートリポジトリ内のコードを編集したとします。Aさんは早めにコードの編集を終えて実際に動くかテストしようとしました。Bさんはコードの編集が終わっていないためプログラム全体としては不完全となり、Aさんはテストを行うことができません。結果として効率が落ちて不便になってしまいます。言ったことを防ぐために、一旦リモートリポジトリを個人の環境にクローンして編集をします。することで自分がいじった部分以外に変更がなく、自分の作業が終わった段階で実際に動くか試せます。長くなりましたが、前提知識については以上です。なんとなくイメージできたでしょうか。ここから先は実際にgitのコマンドについて解説していきます。最初にも言いましたが、数が多いので長くなります。addここからはgitのコマンドを一つずつ見ていきます。addの役割はワークツリーでの変更点をステージに記録することです。ステージはリポジトリに上げる前に一旦記録しておく場所です。このステージに記録するためのコマンドがaddです。ソースコードを編集したらまずはaddすることになります。見ているのは最初の状態との差分なので、何回かに分けてaddしても問題ありません。基本的には一通りの作業(機能を一つ開発する、不具合を一つ修正する)が終わったらaddすることが多いです。addの使い方を見てみましょう。変更を記録したいファイル名やディレクトリ名を指定して使います。最後の例のピリオドは、現在のディレクトリの中身を全て対象として、変更を記録できます。commitはステージに記録された変更をリポジトリに記録するためのコマンドです。リポジトリではcommitされた時の状態をスナップショットとして保存しています。無知猫スナップショットとして保存すると何がいいんだろうここでは詳細に理解する必要はありませんが、「あの時の状態に戻したい」と言った場合に、スナップショットを利用して戻すことができます。これに関しては後でまた紹介します。commitの使い方を見てみましょう。commitと実行するだけでもステージ上の変更をリポジトリに記録することはできます。オプションをつけてメッセージを添付する方法です。(ローカルリポジトリの内容をリモートリポジトリに反映)に関わってきます。pushするとcommitの履歴も反映されます。リモートリポジトリは開発チームのメンバー全員で共有しているため、commitの履歴にメッセージが書かれていないと、この変更はどういう意図でどんな修正をしたのかが分かりません。そのためcommitするときは-mオプションをつけてメッセージを添付しましょう。変更(新規作成したファイル名)変更理由(新規関数の追加、不具合の修正)などを書くことが多いです。statusは現在の変更状況を確認するコマンドです。具体的にはワークツリーとステージ間の差分、ステージとリポジトリの差分を確認することができます。イメージがしにくいと思うので具体例を見てみましょう。青い長方形はそれぞれソースコードが書かれたファイルだと思ってください。以前aaaaaと記述してステージにaddした状態からコードを修正して、今回bbbbbと新たに追記した状態です。statusを実行すると「ステージにaddしてない変更があります」と教えてくれます。ステージ上に変更が記録されているということは、commitもされていない状態なので「commitされてない変更がステージ上にあります」とも教えてくれます。statusコマンドは具体的な差分(今回だとbbbbbの部分)は教えてくれません。わかるのはステージにaddされてない変更があるのか、リポジトリにcommitされてない変更があるのかです。diffコマンドは実際の変更内容を確認するコマンドです。diffは具体的な変更内容を見ることができます。–stagedとするとステージとリポジトリ間の変更差分を確認することができます。先ほどと同じく、青い長方形がテキストファイルだと思ってください。diffを実行すると、ワークツリー上のオレンジ色の部分が変更差分として確認できます。addによりステージに追加するとどうなるでしょうか。addでステージに追加するとファイルの状況は↑のようになりますね。diffコマンドを実行すると、「差分は何もないよ」と教えてくれます。logは今までのcommitの履歴を確認するコマンドです。ここでは特に解説することはありませんが、よく使うオプションがいくつかあるのでそれらをまとめておきます。pushはローカルのリポジトリの内容をローカルのリポジトリ(githubなど)に反映させるコマンドです。実行のコマンドを確認してみましょう。ブランチ名)これだけみてもよくわからないですよね。originについてです。出てきたoriginってなんだよと思いますが、これはリモート名です。pushは先ほど解説したように、ローカルリポジトリの内容をリモートリポジトリに反映させるものです。どのリモートリポジトリかを指定しなければなりません。そこで初回のpushの時に以下のコマンドを実行します。リモートリポジトリのURLこれはリモとリポジトリをoriginという名前で登録しています。リモートリポジトリのURLはgithubなどのページに行くと確認することができます。指定する名前はoriginである必要はないのですが、慣習的にoriginが使われます。(origin以外は見たことない)なので特別な理由がなければoriginにしておきましょう。コマンドにエイリアスをつけるここではよく使うコマンドにエイリアス(別名)をつける方法を紹介します。別名をつけるのかは、多分想像できるかと思いますが作業を楽にするためです。commitコマンドひとつとっても、”commit”と何回も入力するのは少し手間ですよね。ここで紹介するコマンドでエイリアスをつけてみましょう。commitここではcommitに”ci”というエイリアスをつけています。configコマンドは、設定を変更するコマンドです。–globalを指定することでPC全体の設定を変更することができます。(複数のプロジェクトに参加している場合、PC全体の設定を変更しておけば全てのプロジェクトでこのエイリアスを使用することができます)このようによく使うコマンドにはエイリアスをつけておくことをおすすめします。commit以外にもstatusコマンドなどにもエイリアスをつけておくと良いかもです!.gitignoreについて.gitignoreファイルはバージョン管理したくないファイルを指定するためのテキストファイルです。バージョン管理したくないファイルは、パスワードなどの知られたくない情報が含まれるファイルです。このようなファイルがgitでバージョン管理されてしまうと、パスワードの流失などに繋がってしまいます。このようなファイル以外にも自動生成されるファイルなど、チームでの開発には不要なものも.gitignoreに指定してバージョン管理から外しましょう。.gitignoreの書き方は、バージョン管理から外したいファイル名を指定するだけです。他にもワイルドカードを使用する方法などたくさんありますが、ここでは省略させていただくので、ぜひ一度調べてみてください。(ワークツリーで加えた変更の取り消し)これはワークツリーで加えた変更を取り消すためのコマンドです。checkoutはブランチ変更にも使うコマンドです。–とすることで、後ろに来るのはブランチ名ではなく、ファイル名やディレクトリ名だよと教えてあげているのです。–について解説します。全ての変更を取り消す使い方は↑の通りです。参考までにですが、このコマンドはワークツリーの状況をステージと一緒にしているだけです。このコマンドを実行すると指定したファイルについて、ワークツリーとステージで比較して、差があればステージ上のものに合わせています。ディレクトリを指定した場合も同じです。HEADコマンドを使用することで、ステージに追加した変更を取り消すことができます。使い方は以下の通りです。.このコマンドを実行することで、ステージに追加された変更を取り消すことができます。このコマンドでは最新のコミットを参照してステージとリポジトリの内容を同じにすることでステージに追加された変更を取り消しています。このコマンドで出てきているHEADは今いるブランチの最新のcommitを表しています。HEADではステージに追加された変更を取り消すことはできますが、ワークツリーでの作業はそのままになります。HEADの後に実行する必要があります。–amendを使用することで、直前のコミットを取り消すことができます。図を使って説明します。これが今の状態だと思ってください。テキストファイルにaaaaaとbbbbbと書いてリポジトリにコミットした状態です。コミットした後に、cccccも書くべきだったことに気づいたためこのコミットを取り消したいです。次の図をみてください。直前のコミットを取り消すために、まず正しい変更(この例だとcccccを書き込む)を加えて正しい状態にしてステージにaddします。--amendを実行します。このコマンドは現在のステージの状態でのコミットで、直前のコミットを上書きしています。することで直前のコミットを取り消して正しいコミットに変えることができます。ここでとても大事な注意点があります!それはpushしてしまったコミットには、このコマンドを実行しないでください!!絶対に!!理由がわかるでしょうか。pushとはリモートリポジトリにローカルリポジトリの内容を反映させることでしたね。リモートリポジトリはチームメンバーなど自分以外の人も使うことのできるリポジトリです。pushしたコミットの内容は自分以外の他の人がるようすることができるのです。自分がpushして他の人が利用しているコミットを勝手に取り消してしまうと、それを使っている人がとても困ります。そもそもプログラムが動かなくなってしまうことすらあります。(リモートリポジトリから情報を取得)ここではリモートリポジトリから情報を取得するコマンドについて紹介します。リモートから取得するコマンドはpullとfetchの二つがあります。この二つの挙動の違いはわかっていない人も結構いるので、しっかり理解しておきましょう。fetchまずはfetchです。fetchを実行するとリモートリポジトリの内容をローカルリポジトリに反映します。ここで注意しなければいけないのは、ワークツリーにはリモートリポジトリの内容は反映されないということです。ワークツリーにもリモートリポジトリの内容を反映させたい場合は、fetchした後にmerge(マージ)をする必要があります。マージについては後ほど紹介します。fetchの使い方は以下の通りです。pullを実行すると、リモートリポジトリの内容をローカルリポジトリとワークツリーどちらにも反映させることができます。mergeと覚えておきましょう。pullとfetchは似ていますが、実行結果が全く異なるのでしっかりと理解しておいてくださいね。pullの使い方を下に示します。(ブランチの作成、一覧表示)ここではブランチの新規作成と一覧表示のコマンドを紹介します。使い方を最初に紹介します。homeと実行すると、hogeという名前のブランチが作成されます。作成されるだけで、hogeブランチに移動はしません。(ブランチの移動方法は後ほど紹介します)次に一覧表示です。使い方は以下の通りです。リモートのブランチも含めて教えてくれる開発を進めていく中で、ブランチは一個や二個では収まらないことがほとんどです。なってくると今自分はどのブランチで開発しているのかがわからなくなることがあります。そんな時に上記のコマンドを実行することで、どのブランチにいるのかがわかります。(ブランチの切り替え)ここではブランチの切り替えのコマンドについて解説します。checkoutコマンドを使用することでブランチの切り替えができます。checkoutでは作成済みのブランチしか指定することができません。branchコマンドで現在あるブランチを一覧で表示して、そこに書いてあるブランチ名を指定してブランチの切り替えを行います。-bオプションをつけることもできます。このオプションをつけることで、ブランチの新規作成と切り替えを同時に行うことができます。新機能開発を行うとき、最初にこのコマンドを実行することが多いです。(マージ)ここではマージのコマンドを紹介します。マージとは何かを簡単に説明します。マージとは、他のブランチの作業内容を自分のブランチに取り込むことです。アプリを作成しているとき、今完成している機能はmasterブランチで管理します。(基本的にmasterブランチを完成品です。実際に世に出すのはこのmasterブランチの内容であることが多いです。mainブランチという名前のこともあります。)そこにブランチAで新機能を開発しました。このブランチAの内容をmasterブランチに取り込むことをマージと言います。使い方を見てみましょう。ブランチ名mergeはローカルブランチからだけでなく、リモートブランチから取り込むこともできます。実際はリモートブランチに他のブランチからマージすることが多いです。ブランチの変更、削除ブランチの名前を変えたり、ブランチ自体を削除する方法を紹介します。新しいブランチ名このコマンドを実行することで、今作業中のブランチ名を変更することができます。-bコマンドでブランチを新規作成した際に、スペルが間違ってしまうことなどはあり得ます。そんな時にこのコマンドで名前を修正しましょう。次に、ブランチの削除についてです。強制削除-dコマンドではマスターにマージされてないブランチは削除しません。先ほどの例で言うと、ブランチAで新機能を開発したのに本番環境(masterブランチ)にマージしていない場合、-dオプションではブランチAを削除することはできません。-Dオプションを利用するとどんなブランチでも削除できます。オプションを利用することが安全で良いと思います。stashコマンドについて紹介します。変更を一時退避させる必要があるかを説明します。退避なんてしなくてもcommitすればいいと思うかもしれませんが、コミットは保存のように何回もしすぎると分かりにくくなってしまいます。stashを使う場面として一つ例を挙げます。ブランチAで機能Aの開発をしている時、緊急で機能Bのバグの修正を行う必要が出てきました。機能Aの開発は途中なのでcommitするわけにはいきません。機能Bの修正をするためにはブランチBに移動する必要があります。コミットしていない変更があるとブランチの切り替えは行うことができません。このような場合にstashを使って変更を一時避難させます。使い方を見てみましょう。stashとてもシンプルですね。stashを実行することで、今加えた変更分を一時避難させます。することでブランチBに切り替えることができます。stashはいくつも同時に実行することができます。いうことかと言うと、ブランチAでstashした後にブランチBで作業をしていました。そこでも同様にstashする必要が出てくると、ブランチBでもstashを実行することができます。なってくると、自分がしたstashがわからなくなってしまいそうですよね。実際わからなくなります。その時のために自分がstashした内容を確認するコマンドを紹介します。listこのコマンドを実行することで、どのブランチでstashしているかを見ることができます。stashした内容は元に戻すことができます。それが次のコマンドです。上記コマンドによりstashした内容を元に戻すことができます。最新のstashとは一番最後にstashした内容のことです。listコマンドで確認することができます。おすすめの参考書gitについてのおすすめの参考書を一応紹介します。私は何冊か持っていますが正直この一冊で十分!!というものがあります。