言いたいこと
⭕
$ git init hoge
$ cd hoge
❌
$ mkdir hoge
$ cd hoge
$ git init
どんな方に見て欲しいか
$ ls -a ~ | grep .git
.git <- これ
.gitconfig
.gitignore-boilerplates
- (ターミナル操作と git の初心者の方。)
背景
後輩に「この git 教材を最初から最後までやってみて💪」と伝えたら、多くの後輩がホームディレクトリで git init
を実行していたということが後々発覚しました。これは危険な状態です。また、それを引き起こし得る git
の慣習にも多少の原因があるのではないかと思い記事化することにしました。
.git
の位置の重要性
(誤解を恐れずに言うと、)git は commit されていない変更やファイルをいらないモノだと思っています。(具体的には git status
で赤い文字で表示される Untracked files などのこと。)なので、git はお掃除や巻き戻しのために Untracked files を全削除するコマンドがいくつか用意されています。
ホームディレクトリには卒論や思い出の写真などがあるかもしれません。しかし、git はいつでもそれらを不可逆に削除することができてしまいます。
正直、危険性があまり伝わってないかもしれないので、以下のような例を載せておきます。
- 間違えてホームディレクトリで
git init
してしまった。 - 適切なディレクトリ(以後
hoge
)に移動してgit init
し直した。 -
hoge
で作業をする。(この状況が数ヶ月くらい続く。) -
hoge
にいると思って、間違えてホームディレクトリで git の履歴を巻き戻すコマンドを実行する。 - PC の全データが不可逆に削除される。
修正手順
ネットで検索すると r m -rf .git
(コピペ防止)すれば直るというコメントをよく見ますが、
- やり直せない。
- 残るのは作業ディレクトリのみなので、事前に別ブランチのファイルを復旧する必要があるかもしれない。
- ターミナルの実行履歴に残したくない。
などの理由から私は以下の手順が良いと思っています。
- この記事を含め、ネットの情報の正確性を判断できる人を呼び出す。
-
git branch
でブランチが複数あるかを確認する。 - ブランチが複数ある場合:
- 作業ディレクトリに含まれていない差分が他のブランチに存在しないかを
log, diff
などで確認する。 - 無ければ次へ進む。存在していて、もし必要なものだったら
merge
やcheckout
などで作業ディレクトリに取り込む。
- 作業ディレクトリに含まれていない差分が他のブランチに存在しないかを
-
.git
を.git-username
など分かりやすい名前に変更する。(後でゴミ箱を漁るかもしれないため。) -
.git-username
をゴミ箱に入れる。(rm
は使わない。)
より良い git init
の使い方
カレントディレクトリという概念を理解していないことが全ての原因であることが多いです。よく見られる以下の手順は、
$ mkdir hoge
$ cd hoge # <- 超重要
$ git init
カレントディレクトリの移動というとても重要なことをした上でリポジトリを作成します。ただ、ここで偶然見逃したりタイポしたりしてそのまま続けてしまうと、誤って上位ディレクトリをリポジトリ化させてしまうのです。
ここで私が提案したいのはこれです。
$ git init hoge
$ cd hoge
git init
は引数を持つことができます。(正直、git を使い始めてから3年間このことを知りませんでした。)この引数に指定するディレクトリはまだ存在してなくてもいいし hoge/fuga
のようにネストされたディレクトリでも OK です。これなら、必要な場所だけを安全にリポジトリ化できます。
何なら VSCode などのソフトを使って、ボタンをクリックしてリポジトリを作成するのもアリだと思います。
余談
git をやる前に
PC のデータは階層構造に配置されていて、Finder やエクスプローラなどのソフトと同じくターミナル操作する際も「今開いているフォルダ」に相当するカレントディレクトリという位置がある。といったような一定の座学を実際に手を動かす前にした方が良いと思います。これは10分で修了する人もいれば理解するまでに数日かかる人もいるかもしれません。
git は良いやつ
git はリポジトリ内しか管理できないので、適切なディレクトリをリポジトリ化することさえできれば、git がリポジトリの外にある無関係なファイルに影響を与えることはありません。なので、最初の壁さえ乗り越えられれば安心して git life を楽しめます。
プログラミングで一番大変なことはプログラミングを始めることですが、それ以降は「こんなモノ作ってみたい→できた」という楽しい世界があります。始める人は頑張って最初の壁を乗り越えてほしいし周りの経験者は壁の上から引っ張り上げてほしいな〜と思います。〜完〜