memorandums

日々の生活で問題解決したこと、知ってよかったことなどを自分が思い出すために記録しています。

git練習環境

git使っていますか〜?

最初、必要性が理解できなかったですが、使えば使うほど、これがないと安心して確実に開発を進めるのは難しいなぁ。。。と思えてきます。不思議なツールです。

gitのとっつき難さって、git自体もそうですが、githubやbitbucketも一緒に勉強しなければならないところが大変ですよね。REPLみたいな環境があればコマンドをいろいろ試して勉強が捗るんですけどね。

最近、知ったローカルだけで練習する方法をご紹介します。教わったサイトは以下です。知っている人からすると、こいつ何をいまさら。。。って思われるかもしれませんけど。。。

gitのベアリポジトリとノンベアリポジトリ - Qiita

PC環境はMacを想定しています。Desktop上で遊ぶ感じにします。

まず、リモートリポジトリを作成します(git init --bareのbareが重要みたいですね)

cd ~/Desktop
mkdir remote.git
cd remote.git
git init --bare

で、複数人で開発する状況を想定して、クライアント側をとりあえず2つ作ります。~/Desktop配下にc1とc2というディレクトリができます。

cd ~/Desktop
git clone remote.git c1
git clone remote.git c2

c1でtestを作り、中にc1と入力し、add & commit & push します。

cd ~/Desktop/c1
echo "c1" > test
git add .
git commit -m "c1"
git push

c2で、c1の変更を受け取るため、pullして、test内にc2と記入して、add & commit & push します。

cd ~/Desktop/c2
git pull
echo "c2" >> test
git add .
git commit -m "c2"
git push

c1で、c2の変更分をpullすれば。。。c1とc2のリポジトリの内容が同一になります。c1とc2がtestをいじっていますが、順を追って作業しているので、編集内容について干渉はおきません。平和ですね。。。

cd ~/Desktop/c1
git pull

さて、次。再び、c1でtestに追記します。

cd ~/Desktop/c1
echo "c1" >> test
git add .
git commit -m "c1"
git push

c2で、testにc2と追記します。pushすると。。。エラーが起きますね。当然ですね。c1がremote.gitにpushしたtestの内容をc2に取り込んでないから。。。です。この差分をしっかり検知してくれるところ(人間が変更分を記憶とか認識しておく必要がないこと)がgitというかバージョン管理ソフトの偉いところです。

cd ~/Desktop/c2
echo "c2" >> test
git add .
git commit -m "c2"
git push

To /Users/******/Desktop/remote.git
! [rejected] master -> master (fetch first)
error: failed to push some refs to '/Users/******/Desktop/remote.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

上記のエラーメッセージにちゃんとヒントが書かれていますから(赤字)、仰せの通りにします。

testを開くと以下のように、差分がわかりやすく表示されているので、

c1
c2
<<<<<<< HEAD
c2
=======
c1
>>>>>>> 4740b16c5b9c05cd7c5487043a46e515665b6966

例えば、以下のようにして。

c1
c2
c1
c2

add & commit & push します。

git add .
git commit -m "c2"
git push

さらに、c1でpullすれば、再び、c1とc2が同じイメージになります。

git pull


しょうもない記事ですが。。。本当のgit初心者の方には有用な情報と思います。

ちなみに、上記はmasterブランチのみで作業しましたが、本来はブランチを切って。。。という作業になると思います。ただ、初学者はその前にこうした経験があったほうが理解しやすいのではないか。。。と想像しています。

情報系の学科を卒業したけどgit触らずに卒業する人って。。。結構いるんじゃないかなぁ。。。と思ったりしています。うちだと、たぶん、僕の科目を受けた学生さん(全体の3割くらい?)くらいかな。。。と思ったり。

学校で教わらない場合は、自分で勉強しましょうね。

でわ!