Git チートシート

以下の記事を参考に翻訳しました。

>[Getting-Cheat-Sheet.md](https://gist.github.com/akras14/3d242d80af8388ebca60)

____

## コマンド

### 始め方

`git init`

or 

`git clone url`

### 基本設定

```bash
git config --global color.ui true
git config --global push.default current
git config --global core.editor 'vim -c "set fenc=utf-8"'
git config --global user.name "hogehoge"
git config --global user.email hoge@guga.com
git config --global diff.tool meld
```
### ローカルブランチでの作業

#### ブランチ

```bash
# すべてのローカルブランチのリストを見る。
git branch

# 既存のローカルブランチに切り替える。
git checkout branchname

# 現在のブランチを新しいブランチにチェックアウトします。名前はnew-branch-nameになります。
git checkout -b new-branch-name

# ブランチ名を現在のブランチにマージする。
git merge branchname

# fast-forwardを行わないでブランチをマージする。これはプルリクエストで行うものです。
#　ブランチに依存する変更の履歴を保存するのに役立ちます。
# 高度な機能ですが,違いを見るためにGUIで試してみてください。
# 通常のマージとマージの違いを見るには--no-ffを付けます。
git merge --no-ff branchname

# ブランチを削除、ブランチがマージされていない場合に警告をいいます。
git branch -d branchname

# ブランチを強制的に削除します。何も警告がでません。 bashのrm -rfと似ています。
git branch -D branchname
```

#### ブランチのアップデート

**標準**

```bash
# すべてのコミットを見る
git log

# 素晴らしいコミットビューです！望むだけカスタマイズすることができます。
# 気になったらググッテね :)
git log --pretty=format:"%h %s" --graph

# 過去1週間のコミットを見る事ができます。
git log --author='hoge' --after={1.week.ago} --pretty=oneline --abbrev-commit

# ブランチで行われた変更のみを表示する（ブランチ・フォームのマスター・ブランチであると仮定）
git log --no-merges master..

# 現在のgitブランチの状態を見れます。
# 多くの場合、実行する必要があるコマンドに関するアドバイスがあります
git status

# ステータスを短くみれます。物事を一目で見るのに役立つ。
git status -s

# コミットされた変更済みファイルを追加する（別名ステージング）
git add filename

#コミットされたすべての変更済みファイルを追加する（別名ステージングのすべてのファイル）。
git add .

# テキストファイルのみを追加する。
git add '*.txt'

# gitにファイルを追跡しないように指示する。
git rm filename

# gitへの変更を記録します。コミットメッセージのデフォルトエディタが開きます。
# (git log で表示)
# ファイルがコミットされ、履歴を付ける事ができます。
git commit 

# ファイルをコミットし、1つのコマンドでコミットメッセージを書く事ができます
git commit -m 'Some commit message'

# 履歴を変更する:) 以前のコミットを変更したい場合、
# リモートリポジトリにまだプッシュしていなければ
# git addで追加して、次のコマンドを実行する事で新しい変更を加える事が出来て
# 過去のコミットを修正する事ができます。
git commit --amend

```

**応用**

```bash
# reset は HEAD の位置を変更します。従ってreset はステージ上からファイルを降ろすので、add の取り消しになる
git reset

# reset --hard はワーキングツリーへの変更も削除してしまう。コミットしていない作業は消えます。
git reset --hard HEAD

# ブランチの履歴の、ある時点まで戻る。
git reset tag
git reset <commit-hash>

# リポジトリにコミットすることなく現在の変更を保存する = スタッシュ。
git stash

# スタッシュを適用し、適用したスタッシュを削除する
git stash pop

# まだステージングされていない場合は、そのファイルを元のバージョンに戻せます。
# それ以外の場合は、git reset filenameまたはgit reset --hard filenameを使用します。
git checkout filename 
```

**変更の比較**

``` bash
# 現在の変更は、まだステージングされていないものを参照してください。
# git addを実行する前にチェックする事をお勧めします。
git diff

# まだコミットされていない現在の変更を確認する。 (段階的な変更を含む)
git diff HEAD

# 現在のブランチと他のブランチを比較する。
git diff branch-name

# diffと同じですが、設定したdifftool経由で変更を開きます。
# オプション-dは、ディレクトリモードで開くように指示します。
# 各ファイルは一度に1つずつです。
git difftool -d

# 現在のブランチで行われた変更のみを表示する (マスターブランチと比較します。)
# スタンドアロンブランチでしばらく作業しているときに役立ちます
git difftool -d master..

# 現在のブランチで変更されたファイル名のみを表示する
git diff --no-commit-id --name-only --no-merges origin/master...

# 上記と同様ですが、どのファイルが変更されたか、どのように変更されたかを表示します。
git diff --stat #比較条件
```

### リモートブランチでの作業

```bash
# あなたがgitクローンをした場合、利用可能なリモートリポジトリのリストを参照して
# 少なくとも1つの "origin"を持っています。
git remote

# gitのURLを使ってリモートreposの詳細を表示する
git remote -v

#　"origin"が設定されていない場合、新しいリモートを追加します。
git remote add origin <https://some-git-remote-url>

# 現在のブランチをリモートブランチにプッシュする（通常は同じ名前）
# 上流ブランチと呼ばれています。
git push

# リモートブランチが上流ブランチとして設定されていない場合は、そのようにすることができます。
# オプション -uはGitにパラメータを記憶させる.
git push -u origin master 

#それ以外の場合は、リモートとブランチを手動で指定して毎回使用することができます
git push origin branchname

# プッシュと同じように、リモートから最新のアップデートを入手することができます。
# defaulによってGitは "origin"と上流ブランチから引き抜こうとします。
git pull

# またはgitに特定のブランチを引き出すように指示することができます。
git pull origin branchname

# git pullは実際には2つのコマンドの短くしたコマンドです。
# リモートブランチからの変更を最初に取得するようgitに伝える:fetch
# そして、それらを現在のブランチにマージする:merge
git fetch && git merge origin/remote-branch-name

#リモートブランチの履歴を更新する場合はオプションに-pを付ける事で、フェッチとパージができます
git fetch -p

#リモートブランチのリストを表示するには
# オプションに-aを付ける事ですべてを表します
git branch -a 
```
## リソース

### 参考資料
- Try Github - https://try.github.io
- lernGitBranching http://pcottle.github.io/learnGitBranching/?NODEMO
- Pro Git - Free Book - http://git-scm.com/book

### 履歴を見る。
- Source Tree - http://www.sourcetreeapp.com/
- tig - `sudo apt-get install tig` or `brew install tig` etc
- gitk - `sudo apt-get install gitk`

### マージ/差分ツール
- Meld - `sudo apt-get install meld` or `brew install meld`
- Open Diff
- p4v Merge - http://git-scm.com/book/en/Customizing-Git-Git-Configuration#External-Merge-and-Diff-Tools
- Webstorm