gitまとめ

全然分かっていないけどひとまずメモしておく。
サーバー側にリポジトリを作成して、クライアント側でそれをclone&pushさせたい場合。

まずサーバー側でtest.gitという名前のリポジトリを作成

cd /home/user/git_test
mkdir test.git
cd test.git
cat > sample1
sample1
Ctrl-D
git init // .gitが作成される
git add *
git commit -m "initial import test"
git log

これをクライアント側でcloneする

git clone ssh://<ユーザー名>@<ホスト名>:<ポート>/home/user/git_test/test.git

sample1を適当に変更し、コミットする

cd test
cat > sample1
sample2
Ctrl-D
git diff // 差分が表示される
git status // 変更したファイル一覧が表示される
git add sample1 // addは追加するコマンドではなく、commitするファイルを指定する役割
git commit -m "change sample1"
git log

この時点ではまだ、サーバー側のリポジトリには反映されない。
サーバー側に反映させるには、pushを実行する。

git push ssh://<ユーザー名>@<ホスト名>:<ポート>/home/user/git_test/test.git master

しかしこれを実行すると以下のエラーが発生する

remote: error: refusing to update checked out branch: refs/heads/master
以下略

対処法としては、サーバー側で以下のコマンド実行するらしい

cd /home/user/git_test/test.git
git config --get-all core.bare // falseになっているはず
git config --bool core.bare true // trueに変更する
git config --get-all core.bare // trueになること

そうすると、先ほどのpushが成功する。
その後、サーバー側でgit logを実行して、"change sample1"が反映されていればOK(のはず。。)

ここで分からなかったのが、リポジトリ側でsample1の中身がsample2に更新されないこと。
そういうものなんだろうか?

サーバー側がマスターだと思うから、pushと同時にサーバー側のファイルも更新されると思うんだけど、されないらしい。
また、core.bare trueの状態で、git statusとかを実行すると以下のエラーが起きる。

fatal: This operation must be run in a work tree

これを出さないようにするためには、再度core.bare falseに戻す必要がある。
falseに戻した後、git statusを実行するとsample1が変更されたこと(中身がsample1のままであるため)になっている。

# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       modified:   sample1
#

本来は、sample1の中身をsample2に変更しているので、変更を反映させたい(ローカルの修正を取り消したい)場合

git reset HEAD sample1
git checkout -- sample1

これでsample1の中身はsample2となる。

とりあえず現時点で分からないのが、pushした後、リモートリポジトリにファイルが反映されない件。
いや、正確には反映はされるんだけど、それがサーバー側のローカルのファイルに反映されない件。

参考サイト
Git超入門:"git push origin master"の"push"と"origin"と"master"の意味がわからないあなたへ · DQNEO起業日記
git - 簡単ガイド