git,githubのコマンド　チートシート

git使った開発で使うコマンド色々。最初はadd,commit,pushさえ覚えておけばOK！

## 基本
### commit, push関連

#### ブランチ情報チェック(自分のいるブランチ、変更したファイル)

```
$ git status
```

#### ワークツリーからインデックスに追加 
```
$ git add -p 追加するものを選択
$ git add -A すべて追加
```

#### 差分チェック

```
$ git diff インデックスとワークツリーの差分(addする前の差分)
$ git diff --cached　インデックスと最新コミット(addしてからの差分)
$ git diff HEAD　ワークツリーと最新コミット
```

#### commit

```
$ git commit -a  インデックスへadd,commit(git add -u -> git commitと同等)
$ git commit -v   verbose
$ git commit --amend 直前のコミットをやり直す
```

#### push (githubのへのpush)

**githubにブランチも作って、そこにpush**

```
# git push origin <ローカルでのブランチ名>:<githubでのブランチ名>
```
ローカルとgithubのブランチ名はだいたい同じにするので、

```
$ git push origin change_hoge:change_hoge
```

とか。

**すでにgithubにブランチ作っている場合**

```
$ git push
```

#### merge
今のブランチにmasterブランチをマージしたい場合

```
$ git merge master
```


#### addの取り消し
個別にaddしてしまったファイルを取り消す場合

```
$ git rm --cached hoge.txt
```

まとめてaddしたものを取り消したい場合

```
$ git reset HEAD
```

#### commitの取り消し

ワークディレクトリ(ローカルの作業)ごと取り消す場合

```
$ git reset --hard HEAD^
```

ワークディレクトリは残しつつ、コミットのみ取り消す場合

```
$ git reset --soft HEAD^
```

* ポイント：HEADは直前のコミット。HEAD^は一つ前のコミット。
HEAD^とすることで、１つ前のコミットまでリセットする、という意味。

#### gitignoreの反映

一旦 ignoreしたいfileを削除する  

```
$ git rm -r --cached filename or directory  例 log/*.log
$ vi .gitignore      //ignore対象ファイルを加える
$ git add .gitignore
$ git commit -m ".gitignore is now working"
$ git push origin master
```

### ブランチ切替関連

#### ブランチ情報など取得(fetch,mergeを両方やる)
```
$ git pull
```


#### 現在のブランチを表示
```
$ git branch 
```

#### ブランチの切り替え

```
$ git checkout ブランチ名
 
```

#### rename
ブランチのrename

```
$ git branch -m <oldname> <newname>
```

### リモート(github)のブランチ切り替え方法

```
$ git fetch  (リモートからレポジトリ取得)
$ git status ステータスを確認
$ git checkout -b hoge -t  origin/hoge  (githubにあるorigin/hogeと同じ内容のブランチhogeを作る)  
$git branch  (ブランチがhogeになっているか確認)
```


###　新しいブランチをgithubに空コミットする

```
$ git checkout -b new_branch   (ブランチ作成)
$ git commit --allow-empty -m "make pull request" (空コミットを許可してコミット)
$ git push origin new_branch:new_branch (githubへpush)
```

## ちょっと応用
###  git, githubからブランチを削除
例としてsearchというブランチを削除する

#### git からの削除

```
$ git branch -d search
```

#### githubからも削除する
git push プッシュ先リポジトリ ローカルのブランチ名:リモートのブランチ名
ここでは  
プッシュ先リポジトリ　origin  
ローカルのブランチ名　(削除済み)  
リモートのブランチ名　search  
なので

```
$ git push origin :search
```

#### git, githubから履歴も含めファイルを削除(パスワードファイルとか誤っていれてしまって削除する場合)

```
$ git filter-branch -f --index-filter 'git update-index --remove "filename"' HEAD
$ git push --force
```

### レポジトリの取得プロトコル方法を変更する
githubの二段階認証を有効にすると、httpsプロトコルでは毎回アクセストークンを入力しなくてはならなくなるので、sshに変更する

```
$ git remote -v
origin	https://github.com/***/***.git (fetch)
origin	https://github.com/***/***.git (push)
$ git remote set-url origin git@github.com:***/***.git
$ git remote -v
origin	git@github.com:***/***.git (fetch)
origin	git@github.com:***/***.git (push)
```

###gitのリポジトリ作成

```
$ git init
```

### gitの空レポジトリをコミットする

```
$ git commit --allow-empty -m "make pull request"
```

### backup リポジトリ作成
 
* 空のレポジトリ作る

```
$ mkdir /pub/repository/backup.git
$ cd /pub/repository/backup.git  
$ git --bare init  
```

* 履歴をコピー

```
$ cd {workdir}/  
$ git push /pub/repository/backup.git master  
```

（もとのディレクトリは捨てる rm -rf {workdir}   


* 作業時はバックアップリポジトリからcloneする

```
$ git clone /pub/repository/backup.git {workdir}  
```

* 作業が終わったらバックアップリポジトリに書き戻す

```
$ git push origin master  
origin -> もとのリポジトリ（ローカルブランチ）　master->マスタブランチ  
```

## エラー関連

#### fatal: remote origin already exists.が出るとき

```
$ git remote add origin git@github.com:example/test.git  
fatal: remote origin already exists.  
```
原因は既に同じ名前でリモートリポジトリが登録されている事。異なる名前でリモートリポジトリを作成する

```
$ git remote -v
origin  git@github.com:example/test.git
$ git remote add origin2 git@github.com:example/test.git
$ git remote -v
origin  git@github.com:example/test.git
origin2 git@github.com:example/test.git
```