gitメモ

恥ずかしくも今までgitの基本をちゃんと勉強しないできたので夏休みの一日を使ってgitを叩き込んでおこうと思います。__disclaimer__: 自分で分かればいいと思って殴り書きでまとめてあるのでしっかりと学習したい方は一番下に貼っておいた参考にしたサイトを見てもらったほうが早いと思います。

#目次
- [Gitとは]()
- [どうやって]()
- [基本的な操作一覧]()
- [簡単なチュートリアル]()
- [ちょっとした実践]()
- [Githubを使ってみる]()

#Gitとは
不特定多数の人と共同でファイルをいじる際にいじった内容や履歴などを一括管理してくれるバージョン管理システムの一つ。

![Scannable Document on Aug 5, 2016, 10_30_43 PM.png](https://qiita-image-store.s3.amazonaws.com/0/87666/25a853ff-b5b2-8ebb-c893-e43ca64e99b2.png)


#どうやって
ディレクトリ毎にレポジトリを作って内容の変更履歴を保存、管理する。

#基本的な操作一覧
- `ls`自分が今いるディレクトリにあるファイル一覧を表示
- `cd [（下層）ディレクトリの先]`
- `cd ~`ホーム画面へ戻る
- `pwd`自分が今いるディレクトリがわからない時に
- `cd ..`自分が今いるディレクトリのひとつ前（上層）のディレクトリへ
- `ls -la`文字通り全てのファイルを表示（ファイル表示でも見れないようなファイル、そういうファイルは基本いじらないほうがよし！）

#簡単なチュートリアル

##新しく作ったファイル/ファイルの変更をコミット
`mkdir ex`でプロジェクトを作り`cd ex`でそのディレクトリに行き`git init`でgitを起動。適当なテキストファイルを作り保存。`git add .`（gitに変更箇所があることを教えるコマンド）

`git log --author="username"`で特定のユーザーからのコミットのみを表示

`git status`でレポジトリと今いるディレクトリを比べて何か変化があったかどうかを確認できる。たとえばディレクトリにex.pyとex2.pyがあったとして二つに変更を加えて`git status`を行ってみたところ...
![Screen Shot 2016-08-05 at 10.41.53 PM.png](https://qiita-image-store.s3.amazonaws.com/0/87666/f11dcb48-af63-9421-3abc-3e3b9bed5127.png)

untracked filesというのはつまりコミットされていないファイル。つまりコミットしてないから変更履歴を管理できてないよと教えてくれている。

そこでコミットするためには`git add [file]`で一度ローカルレポジトリに入れてから`git commit`で変更を追加する。

working copy > staging area > repositoryの順番。詳しくは上の（下手な）画像を参照。。。

![Screen Shot 2016-08-05 at 10.46.13 PM.png](https://qiita-image-store.s3.amazonaws.com/0/87666/4da04625-e9d6-f754-e5e7-f4cfe50bd606.png)

`git commit -m "[comment goes in here]"`でコミット完了。
`git commit -m "adding all the files to the repository"`

![Screen Shot 2016-08-05 at 10.47.20 PM.png](https://qiita-image-store.s3.amazonaws.com/0/87666/87c9ea83-99ec-6332-7814-220111cfe986.png)

`git log`で確認可能。

##変更したファイルの違いを確認
ファイルを変更すると勿論`git status`でレポジトリのファイルを違うよ！と警告が出る。具体的にどんな違いがあるのかを一括で確認したい時に使えるのが`git diff`

![Screen Shot 2016-08-05 at 10.57.41 PM.png](https://qiita-image-store.s3.amazonaws.com/0/87666/766d59ec-21c9-9f8a-7a9b-4dfc3ce7fd24.png)

ここではex.pyのファイル内にある`def bar(): return 2`から`def bar(): return 345`に変わってるぞと教えてくれている。赤字が現在レポジトリに入っているデータで緑色が作業ディレクトリに入っているデータの内容。`git diff`は__作業ディレクトリとレポジトリ__を比較しているのであってその中間に位置しているステージングエリアにあるファイルではないことに注意。言い換えると一度`git add [file]`をしたらそのファイルは`git diff`上では表示されないことを覚えておく。もしstaging areaと比較したい場合は`git diff --staged`で確認可能。

##ファイルの削除
`git rm [file name]`でレポジトリと作業ディレクトリにあるファイルを削除してくれる。削除した後もコミットするのを忘れずに！

![Screen Shot 2016-08-05 at 11.13.09 PM.png](https://qiita-image-store.s3.amazonaws.com/0/87666/b007506b-a56c-2a3e-2d0c-0c8e216e2a96.png)

##ファイルの移動/名前の変更
`git mv [file name] [new file name]`で名前の変更。`git mv [file name] [directory name]`でファイルの移動。`git mv ex.py test/ex.py`もしくは`git mv ex.py test/ex2.py`で名前変更とファイルへの移動を同時に行える。

#ちょっとした実践
youtubeのチュートリアルにあったファイルを使って実際にgitを使ってみるよ！ダウンロードは[ここ](https://docs.google.com/file/d/0B5G__UQ97Ry5WENGNlhKeEduQ2M/edit?pli=1)から（all credits goes to Bucky) 。

`Dogs_Site`ディレクトリまで行き`git init`と`git add .`からの`git commit -m "comment"`でレポジトリに全てのファイルを追加。
![Screen Shot 2016-08-05 at 11.36.11 PM.png](https://qiita-image-store.s3.amazonaws.com/0/87666/73cbb046-8a35-65a0-b12f-936e245a34a4.png)

こんな感じでぐわーーって出てくれば大丈夫。

##git commit -amでstagingを通さずにレポジトリへ
任意でファイルを選んで（自分はindex.htmlを）コメントアウトの行数でも何でも適当に変える。`git status`で変更を確認して`git commit -am "Cleaned up the HTML comments`するとステージングエリアにいちいち送ることなく一気に変更したファイルをレポジトリに送ることが出来る。`git status`で確認してみると綺麗に反映されていることが分かる。

ただこのコマンドを使うと全ての作業ファイルをレポジトリに送ってしまうことを頭に入れておく。またファイルをシンプルに編集している時以外は使わないこと方が良い。

##変更を取り消す

`git status`で変更点を確認し`git checkout -- [file name]`

##ステージングしたファイルの取り消し
変更したファイルを`git add [file]`でステージングへと送ったはいいがやっぱりコミットはしたくない。取り下げたい！なんてときには`git reset HEAD`で最新のファイルをステージングから取り下げて作業ディレクトリへと持ってこれる。

##（コミットした後の）変更を取り消して古い方のファイルをレポジトリに持ってくる
`git log`でどのコミットに戻りたいかを確認。

```
commit 739cc67b99beecfbae4271028065263db4251818
Author: xxxxxxxxxxxxx
Date:   Fri Aug 5 23:40:15 2016 -0700

    cleaned up the HTML comments a bit

commit c71d29002ade2e0806f5aab96e7262d61bed2a5e
Author: xxxxxxxxxxxxx
Date:   Fri Aug 5 23:36:07 2016 -0700

    our first commit

```
行きたい先のcommitの横にあるidをコピーして（もしくは最初の何個かの文字を入力）`git checkout [id] -- [file name]`で指定したファイルを持ってくる。git statusで確認した後commit。

#Githubを使ってみる
githubとgitの違いは下記の参考リンクを見ると分かりやすいが、簡単にいえばオンラインネットワークを介してパブリックに共有できるgitと考えてもらえれば良いと思う。

<a href="https://github.com/" target="">github</a>の右上にあるドロップダウンバーにあるcreate a new repositoryをクリック。

![creen Shot 2016-08-06 at 12.16.32 AM.png](https://qiita-image-store.s3.amazonaws.com/0/87666/34953b5e-c013-f6f9-62ed-9ca3c16cf69e.png)


適当な作業ディレクトリを作りいつもの手順で`git commit`まで行う。ここからgithubへpush（オンライン上に持ってくことをpushと呼ぶ。pullの代わりにfetch）する。先ほどのウェブページに戻って上にあるリンクをコピー。`git remote add [リンクの名前を任意で（わざわざリンクを毎回打つのが大変なので] [リンク]`具体的には`git remote add github_test https://github.com/xxxxxxxxxxxx/test.git`。`git push -u [オンラインレポジトリ]`でオンラインレポジトリへと持っていく。

![Screen Shot 2016-08-06 at 12.29.00 AM.png](https://qiita-image-store.s3.amazonaws.com/0/87666/9f6bf32e-abdb-3663-26f7-60e14b41b6fa.png)


#参考にしたサイト
- [サルでも分かるgit入門](http://www.backlog.jp/git-guide/intro/intro1_1.html)
- [「そもそもGitって何？」、「GitとGitHubは何が違うの？」にシンプルに答えるよ](https://blog.sixapart.jp/2014-03/mttips-02-what-is-git.html)
- [SubversionからのGit入門(Gitのメリット、Subversionとの違い)](http://qiita.com/kitfactory/items/693580ca3f51f5833874)
- [イラストでわかる！git入門の入門](http://blog.asial.co.jp/894)
- [Git Tutorials Playlist](https://www.youtube.com/playlist?list=PL6gx4Cwl9DGAKWClAD_iKpNC0bGHxGhcx)