git勉強メモ


##リポジトリ
貯蔵庫の意味で、ディレクトリの変更を記録しておく場所。ローカルとリモートがある。

##コミットしないファイルの設定（全ディレクトリ共通）

```
$ git config --global core.excludesfile ~/.gitignore_global
```
configで設定
--global core.excludesfileでコミットしないファイルは？
~/.gitignore_globalでそれはここにかいてありますよ


```
$ echo ".DS_Store" >> ~/.gitignore_global
```
echo ".DS_Store" でDS_Storeを記載
「>>」でファイルに追記
~/.gitignore_global でそこに

##stageとunstage
stageはコミット（リポジトリに記録）するファイルをまとめている目録てきなもの。stage（目録）が空の状態でコミットしても、コミットするものがないと見なされてエラーになってしまう。

```
$ git add ファイル名
```
でそこにファイルを追加することができる。変更ファイル全てを追加したい場合は

```
$ git add .
```
もし間違えてstage(目録）に追加されてしまったファイルを目録から消したい場合は

```
$ git rm --cached ファイル名
```
で目録から削除できる。これをunstageという。

##コミット
```
$ git commit -m コミットメッセージ
```
「-m」オプションをつけずにコミットすると自動的にviエディタが起動される

##コミットログの確認
```
$ git log
```
親子関係を表示する場合は

```
$ git log --graph
```
logを抜ける場合は「q」ボタン

```
$ git config --global alias.graph "log --graph --date-order --all --pretty=format:'%h %Cred%d %Cgreen%ad %Cblue%cn %Creset%s' --date=short"
```
gitのログを見やすく表示する

##ファイルの削除
```
$ git rm ファイル名
```
ファイルの削除と削除履歴のstageへの追加が同時にできる
手動で削除しそれをstageへあげたいときも同じ操作

##ファイルのリネーム
```
$ git mv 変更前　変更後
```
これで名前の変更と変更履歴のstageへの追加ができる。
手動でファイルをリネームした場合のstageへの追加は
```
$git rm 変更前
$git add 変更後
```
となる

##ファイルの移動
ファイルのリネームと同じくgit mvを使う

```
$git mv ファイル名 変更後の場所
// 例 
// $git mv cat.txt animals/cat.txt
```

##ブランチの操作
####ブランチとは？
今の状態（変更履歴の位置）を示すポインタ。ブランチを作成するということは新たに変更位置を記録したポインタを作成するということ。
####HEADとは？
今のディレクトリの状態はどのブランチに属するのかを表示している。
HEADの記載のあるブランチが今のディレクトリの状態。checkoutはHEADを移動する操作。
####ブランチの確認
```
$ git branch
```
####ブランチの作成
```
$ git branch ブランチ名
```
####ブランチの切り替え
```
$ git checkout ブランチ名
```
ブランチを切り替えることで管理ディレクトリの内容もそのブランチの内容に変更される。

```
$ git checkout -b ブランチ名
```
で新しくブランチを作成してそこに切り替えが可能
さらに

```
$ git checkout -b 作成ブランチ名 分岐元ブランチ名
```
とすると今いるブランチではないブランチよりブランチを分岐させ、さらにそのブランチに移動することが出来る。

####ブランチの削除
```
$ git branch -d ブランチ名
```
マージした後などに行う。ブランチを削除してもブランチを分けて変更した履歴は消えないので大丈夫。（ブランチはあくまでポインタという意識を忘れずに）

##マージの操作
統合後残したいほうにcheckoutした後で

```
$ git merge 結合するブランチ名
```
vimでマージメッセージを入力してくれと出るがそのまま:wqでもおけい
####Fast-forwardマージ
masterブランチから新たにブランチを切りそちらで編集してコミットからマージを行った時、まだmasterブランチに変更がない場合はFast-forwardマージとなる。なぜかというと、としてはmasterの変更は新たなブランチだけなので新しいブランチの位置にポインタのみ移動すればマージしたことと同じになるので。
もしfast-fowrdマージをやりたくない場合は

```
git mearge --no-ff ブランチ名
```
とする「--no-ff」オプションをつけることでfast-forwardをさせないこともできる。その場合は新たなブランチの先にマージされたmasterブランチができるイメージ。同じ場所にブランチがない。

####マージのコンフリクト
マージ作業中にコンフリクトが発生し、gitが自動的に判断できない場合はエラーとなる。
その場合コンフリクトが発生したファイルに

```
<<<<<<< HEAD
競合している文章1
=======
競合している文章2
>>>>>>> マージ先ブランチ名
```
という記載が追加される<<HEADから===までのコードはHEADがある（checkoutした）マージ元（master側）の記載で===から>>>マージ先ブランチ名までのコードがマージ先の文章。どちらかを残し<<< === >>>を消せばgitはコンフリクトを解消したとみなす
その後git add コフクリクトファイル、git commitを行えばマージは解消される。

##前のコミットに戻る
```
$ git reset --hard ＜戻りたいコミットのid＞
```
で前のコミットに戻れる（ブランチ（ポインタ）を移動出来る）

##前のコミットを変更
```
$ git commit --amend
```
前のコミットの内容をやり直すことができる

##リベース
コミットの改変（歴史の改変）

```
$ git rebase リベース先ブランチ
```

##クローン
リポジトリ（変更履歴）のみクローン（作業ファイルはコピーしない）

```
$ git clone --bare クローン元ディレクトリ　クローン先ディレクトリ
```
--bareをつけなければ、クローン元のディレクトリのまるまるコピーとなる。

#リモートリポジトリの設定
###リモートリポジトリの作成
```
$ git clone --bare コピー元のディレクトリ リモートリポジトリ名（末尾に.gitをつけるのが慣習）
```
これで今あるリポジトリのコピーとしてのリポジトリが作成される。（作業ディレクトリはなしのリポジトリ）これをリモートリポジトリとしてつかう
####リモートリポジトリの登録
cloneしたリポジトリをリモートリポジトリとして登録しなくてはならない。それは

```
$ git remort add リポジトリディレクトリ名 場所
```
で行う
####リモートリポジトリのコミット・ブランチの取得（git fetch）
リモートリポジトリのコミット・ブランチを取得するにはfetchを使う

```
$ git fetch リモートブランチ名
```

fetchにより取得されたブランチはあくまでリモートリポジトリのものなのでこちらでチェックアウトすることはできない。あくまで更新情報の反映はpushを使う。


####リモートリポジトリのブランチを追跡するようブランチの設定を行う
git remort、git fetchでリモートリポジトリの登録、リモートブランチ、コミットの取得を行った上で、ブランチの追跡の設定をする。

```
$ git branch --set-upstream-to=追跡するリモートブランチ名 追跡させる手元のブランチ名
```

ローカルから新たにブランチを作成する場合は

```
$ git branch 新しいブランチ名 追跡するリモートブランチ名
```

####ローカルで作ったブランチをリモートへ反映させる

まずローカルのブランチの複製。もし名前が一緒の場合は：以降は省略可能。その後リモートのブランチを追跡するよう設定する。


```
$ git push リモート名　複製する手元のブランチ名 : リモートに作成するブランチ名
or
$ git push リモート名　複製する手元のブランチ名
```

####リモートのブランチを削除する
前述のブランチの追加の形を継承している「：」の前が「空白」となっているのがポイント

```
git push orign : 削除するブランチ名

####ローカルの変更をリモートに反映する
反映したいブランチに移動し、

```
git push
```
前提としてリモートの登録、リモートブランチの追跡の設定を行っておくこと



###ユーザー情報の設定
```
//名前
$ git config user.name 名前
//email
$ git config user.email メールアドレス
```