はじめに
僕は今年の夏からエンジニアインターンをしています。
ちなみに僕は文系なのでインターンをするまではずっと独学でした。
この機会にインターンを通して得たものを共有していければと思います。
また、Qiitanのぬいぐるみがどうしても欲しいので25記事を必ず完走します!!
まずはGitについてです。
独学でプログラミングをしていると、チーム開発をする機会はほとんどないのでGitを触るにしても何となくの理解で終わってしまうことが多いと思います。
実際に僕はそうだったので最初の1ヶ月とかはかなり苦労しました。
大原則
調べてみて、それが本当に正しいかわからないときは先輩のエンジニアに聞きましょう。
概念理解があっていたとしてもチームのリポジトリ管理規則とは違うなんてこともあると思います。
git add
gitではcommitする前にaddしますが、僕はこれをずっとただの呪文だと思っていました。
実際にはファイルごとのblobハッシュが作成されてindexに登録(ステージング)されています。
index
indexはcommit予備軍でindexに登録されていない変更分やファイルはコミットすることができません。
どのファイルがステージングされているかは、下記のコマンドでみることができます。
git ls-files --stage
blobハッシュ
blobとはbinary large object
の略称です。
git add
することによってファイルの中身が圧縮されてblobハッシュが作成されます。
blobハッシュの中身は下記のコマンドでみることができます。
git cat-file -p blob_hash
ステージングを取り消したいとき
多分、vscodeだと左上のところをぽちぽちするのが1番早いです。
git restore --stage file_name
ファイル削除時
ファイル削除しただけではgitの追跡は終了していないので、indexに登録する必要があります。
git rm file_name
これでステージングまで一発でしてくれます。そうでない場合は下記のようになります。
rm file_name
git add file_name
ファイル名変更時
普通にファイル名を変更すると、gitは1つファイルを削除して新しく1つファイルを作成したと認識します。
gitにリネームしたと認識させるためには、下記のコマンドを使います。
git mv old_file_name new_file_name
git commit
commitすることによってローカルのリポジトリに変更分が登録されますが、ここでは主に3つのことが行われています。
- indexからtreeオブジェクトの作成
- commitオブジェクトの作成
- HEADを新しいcommitオブジェクトに書き換える
treeオブジェクト
blobハッシュは1つのファイルの情報を持つものでしたが、treeオブジェクトはディレクトリの情報をもつものです。
blobハッシュの時と同様にgit cat-file -p tree_object
で中身を確認することができます。
100644 blob e23d3c182b4717ed8c4af71caaf711ccb6f8402c README.md
100644 blob eb6bfd5aae58ede909be100cfadedf01ce4a3b70 docker.txt
100644 blob 41e2cdea70dfb1603d1d0abf891a4d1522cc6671 feature.txt
100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 for-stash.txt
040000 tree 40e61af83f1c6bd75e41fa5643a480824d61dd32 fuga
100644 blob 93034466dfd7dce785e1a5398f8cb80b8fdc343f hoge.txt
それぞれのファイルのblobハッシュやディレクトリのtreeオブジェクトを管理していることがわかります。
commitした際にはまず、上の例のようなtreeオブジェクトが作成されます。
commitオブジェクト
commitオブジェクトはtreeオブジェクトとcommitに関する情報(コミットメッセージや親コミットや作成者など)を持つオブジェクトです。
commitオブジェクトは1番最初以外は常に親コミットを持っているためブロックチェーンのようになっています。
これも同様にgit cat-file -p commit_object
で確認することができます。
HEAD
HEADについては別記事で書きます!
fixup
git commit --fixup commit_object
上記のようにfixupを使うと、指定したcommit_objectのコミットメッセージに「!」が追加されたコミットメッセージを持つ新しいコミットが作成されます。
レビューをもらうごとに新しいコミットメッセージを付けるのはナンセンスなので、レビュー修正の際には基本的にfixupを使っています。
参考にしたサイト