📚

gitと仲良くなるために

に公開1

はじめに

本格的に勉強始めて1ヶ月経って、「これやるのめんどくさいな〜」「いちいち書くのだるいな〜」とか思うことはあっても、怖い、嫌だなって感情が湧くのはgitだけだった。gitと仲良くできる気がしないのはこの先まずいのでは、と思ったことが事の始まり。

先日、先輩エンジニアの人と雑談する機会があり、

わい🐹「実はgitをあんまり意味わかっていない状態で、雰囲気で使ってます、、」
先輩👨‍💻「gitでつまづく方多いのでそれで充分です。安心してください!」
わい🐹「...」

...いやいやなんで分かりにくいと分かっているものを使わないといけないのか、世の中の課題を解決しようとする前にそっち解決しようやって思ったぐらい。初学者のつまづきNo.1って言われたり、ここまで苦手意識持たせるgitはある意味すごいのでは?どうしてこんなに分かりにくいのか褒めたい。

結構なアンチ具合の私が結果としてこの記事書き終わる頃には、理解度80%ぐらいにまで持って来れて、チーム開発で足引っ張ることなくで何とかgithub使えてます。

今日はその覚え書きです。

最初に覚えたgitコマンド

ソロで開発する時はこれぐらいしか使わなかった気がする

git init ディレクトリ名
git add -A
git commit -m "first commit"
git push origin main

お決まりの流れですね。initは初回しか打たないけど。

git add .
#今いるディレクトリの変更点全てをaddする
git add -A
#git管理下のディレクトリの変更点全てをaddする

どっちも同じかと思ってたら違った。-Aの方が広範囲なのね。

git init ディレクトリ名
#ローカルリポジトリにディレクトリを新規作成する

ローカルリポジトリとリモートリポジトリの作成順序とかあるのだろうか。
追々調べます。ディレクトリ名はどちらのリポジトリも同じ名前にする。

前職で写真フォルダやPDFを「YYMMDD_名前」と作るルールがあったせいで何かしらファイルを作るとき先頭を数字にしてしまう癖がある。
...この業界に入るなら治さないといけないまずい癖ですね。

git push origin main
#ローカルリポジトリの作業ブランチの変更をmainに反映させる

どこからオリジンなんて出てきた??となりました。でもこれは調べれば簡単。リモートリポジトリの別の表現。つまり、今まで何気なく使っていたこのコマンドは「ローカルリポジトリのmainブランチの変更を、リモートリポジトリのmainブランチにアップロードするよ」ってこと。

共同開発で使うようになったやつ

git checkout ホテルGithubへようこそ

git checkout -b ブランチ名
#ローカルにブランチ作成、その新しいブランチに移動
git checkout ブランチ名
#(既にローカルにある)ブランチに切り替え

ホテルの退出とかで使うチェックアウトって言葉のイメージが先行してなかなか意味を飲み込めない。
なんでこの動作でcheckoutという単語を使っているのだろうと改めて言葉の意味をググってみたところ、
https://e-words.jp/w/バージョン管理システム.html

https://zenn.dev/kaishuu0123/articles/563ac171df1f1ea7e230
こんな記事を見つけた。

リポジトリから何かしら取り出したり引っ張って来る動作をIT業界用語でcheckoutというらしい。
「切り替える」って簡単に意訳してるけれども、実際は最初からこっちの手元にあるものではなく、リモートリポジトリ(ホテルGit hub)からブランチがチェックアウトして、こっちに来ている。そんな感じだろうか。

git branch ブランチとは

git branch
#ローカルブランチを確認する。
git branch -r 
#-r はリモートの略。リモートリポジトリにあるブランチを確認する。

もしgit branch -r で作ったブランチがなかったら
git push origin (作ったブランチ) をすればいいってことね。

git merge マージとは

mergeがまーじでわからん。
直訳するとmergeとは合併するとか合流する、結合する。ふむ。

ブランチA、ブランチBがあったとして、
自分がいるのはブランチBだとする。

 git merge branchA
#ブランチBがブランチAを取り込む
#ブランチAをブランチBに合流させる
#ブランチAが(は)ブランチBに合流する

この主語と述語の関係が省略されている感じと、日本語に訳すとなぜ受動態になるのかなどと混乱を極める。先人の知恵を借ります。

https://qiita.com/pon_maeda/items/6578422d491e78728c19
おんなじこと思っている方いてよかった。

git merge (取り込みたいブランチ) だから、
git mergeする前にgit checkoutで自分のブランチに移動するのね。

git fetch フェッチとは

git fetch (リモートブランチ)
#リモートブランチのコピーをローカルにコピーする
#リモートリポジトリから最新情報をローカルリポジトリに持ってくる。

けどこれだけだと今いるブランチに最新情報が取り込まれているわけではない。Wordとかでいう上書き保存がされていない状態だろうか。

取り込むと出てきたらmergeですね。
git merge (取り込ませるブランチ名) で反映させます。

git pull プルとは

fetch+mergeのこと。pushの逆だから押す引くってことでしょ〜〜って思い、気軽に使えそうかと思ったら違った。

git fetch (リモートブランチ)
#リモートブランチのコピーをローカルにコピーする
git merge origin (取り込ませるブランチ名)

この2つのコマンドが

git pull origin (コピーして取り込むブランチ)

これになるってことね。

git clone クローンとは

git clone リポジトリURL(SSH)
#リポジトリのクローンを作成する
git clone ブランチ名 リポジトリURL(SSH)

自分の環境にディレクトリが生まれる最初のやつ。全てはここから始まった。
ブランチを指定する場合もついでに見つけたので置いておく。

私なりに考えたGitがわかりにくい理由

最後に私がつまづいたポイントを整理して締める。
もし今後教える立場になった時に初学者の気持ちに寄り添えるようになりたい。

  • ローカルブランチ名とリモートブランチ名とが同じだから、パッと見てどっちを指しているのかが分かりにくいから。
  • 主語と述語の関係とか省略されているから。
  • 単純に英語の意味をわかっていないから。

git hubのnetworkとプルリクエストについても書きたいな。
少しでもgitアレルギーの症状を和らげることができるよう精進します。

Discussion