日々淡々と進む日常に一つ足跡を

現役東大生がプログラミングに関して備忘録として記事を残していきます。

Git 勉強その②

Git勉強その②

programming-it.hatenablog.com

の続きです。

レポジトリの取得

レポジトリとは

その①で簡単に説明しましたが、Gitによるバージョン管理をしているもののまとまりです(ファイル・ディレクトリなどのデータを含む)。

さて、レポジトリの取得ではすでにあるレポジトリ(サーバー・GitHubなど外部サイト)から取得する場合と自分でレポジトリを作る場合があります。

自分でレポジトリを作りGitの管理下に置く

Git Bashなどの端末で

git init

とコマンドを打つとそのディレクトリがGitの管理下に置かれます。

ただこれではまだそのディレクトリの中にあるファイルがコミットされていないので(修正済みの状態)

ステージ済み→コミット済み

この流れをコマンドで打つ必要があります。

git add .    // .は全ファイル・フォルダを指す。git addによってステージ済みになる
git commit -m "commtent" // ステージ済みのものをコミット済みにしている

git commitのところのmがオプションとしてつけられているのが疑問に思った方もいると思います。これはコミットメッセージを次の"“の中の文字列で表す、という意味です。 コミットメッセージは重要です。コミットメッセージによってほかの人がどういったコミットをしたのか把握するからです。

すでにあるレポジトリからローカルにレポジトリをコピーしてGitの管理下に置く

サーバー・Git Hubですでにあるレポジトリを自分のパソコンの中にコピー(クーロン)していきます。

git clone URL

ここでいうURLとはhttp://hogehoge.com/といった見慣れたものよりもID@ドメイン名://パスといったSSHでサーバーを扱うときに使っていく形式が多い気がします。

レポジトリに新規ファイルの追加

上の2つの方法のいづれかでレポジトリができているとします。このレポジトリに新しくファイルを生成する(又は移動して持ってくる)とします。

vim hogehoge.html  // index.htmlを生成する
mv ~/Downloads/hogehoge.css ./  // hogehoge.cssを新しくレポジトリに持ってくる

そのファイルはまだレポジトリに保存されているわけではありません。修正済み・ステージ済み・コミット済みのいづれでもなくて、追跡されていない(untracked)ファイルとして存在しています。なのでこれを追跡されているようにする必要があります。

vim index.html 
mv ~/Downloads/hogehoge.css ./
git add index.html hogehoge.css
git commit -m "new file index.html hogehoge.css"

ファイルの状態確認

git statusでできます。パターンとしては以下のようになっています。((git diffgit diff --cachedも使えますが省略しました。))

通常時

通常時とはレポジトリに全ファイル・フォルダ保存されていて、コミット済みであることを指しています。

$ git status
On branch master
nothing to commit, working tree clean
コミット済みファイルを変更した時
$ vim index.html

hoge@hoge hoge ~/hoge (master)
$ git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   index.html

no changes added to commit (use "git add" and/or "git commit -a")

index.htmlが変更された(modified)ということが書かれていますね。

変更済みファイルをステージ済みにした時
$ git add index.html

hoge@hoge hoge ~/hoge (master)
$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        modified:   index.html

コミットされて(committed)はいないけれどステージ済みになっていることを示しています。

ステージ済みファイルをコミットした時
$ git commit -m "index.html modified meta changes"
[master 8eab8c1] index.html modified meta changes
 1 file changed, 1 deletion(-)

hoge@hoge hoge ~/hoge (master)
$ git status
On branch master
nothing to commit, working tree clean

最初のパターンと同じになりましたね。

新しいファイルを追加した時

追跡されていない状態が生まれるってやりましたね。

$ vim hoge.txt

hoge@hoge hoge ~/hoge (master)
$ git status
On branch master
Untracked files:
  (use "git add <file>..." to include in what will be committed)

        hoge.txt

nothing added to commit but untracked files present (use "git add" to track)

追跡されていない(Untracked)ファイルがhoge.txtであることが書かれています。 この後git addgit commitしてあげればコミット済み(しかも追跡されている)ファイルとなります。

Gitの管理下に置きたくないファイル・フォルダがあった時

ディレクトリの中でもGitの管理に置きたくないファイルがあると思います。

例えばlogファイルやGulpなどによって自動的に生成される静的ファイルなどやモジュールなどです。これらを除く方法として.gitignoreというファイルを生成すればいいです。そしてそのファイルの中身に以下のように書くとします。

*.log 

これによってlogという拡張子を持つファイルが管理下になるのを防げます。ただし、コミットされているlogファイルに対して.gitignoreでファイル*.logと書いてもすでに 管理下にあるためGitの管理下から外すことはできません。

コミットメッセージ

今まではgit commit -m "comment"とすることでステージ済みのデータをコミットしていました。ここでmオプションをとってみましょう。 すると、エディタが立ち上がります。これはその①でも書いたようにvimがデフォルトですね。ただmオプションつけてやれば基本的にいいと思います。

ステージ済みとかメンドクサイ

git addが面倒だという人もいると思います。その時はgit commitにaオプションを付ければいいです。個人的には好きじゃないです。

ファイル削除

git rmを使いましょう。ただ単にrmだとそのファイルがステージ済みでなくて変更済みとして扱われます。

git rm hoge.txt // これでhoge.txtが削除されたファイルとしてステージ済みになる
git commit -m "hoge.txt deleted"

Git管理下に置きたくないけどファイルは取っておきたい!

.gitignoreを使いましょう。ただ、git initした後ですでにコミット済みであった場合は下のようにします。

git rm --cached hoge.txt
git commit -m "hoge.txt deleted in repo"

ファイル名の変更・ファイルの移動

レポジトリの中でmvコマンドを使いたいときはgit mvを使いましょう。

git mv hoge.txt hogege.txt
git commit -m "hoge.txt renamed"

さて、今回はこれで以上です。公式ドキュメントはやりごたえありますねー。とても面白いです。