備忘録Git

↓わからなかったら、まずはこれ！
[再入門のためのGitまとめ](http://qiita.com/maccotsan/items/650b5bdefae5be135bbe)

# etc 
* git add filename filenameをステージングする
* git add . 全部ステージング(コミット候補にする)
* git rm --cache filename filenameをステージングから解除
* git commit -m "comment" コメント付きでコミットする
* git push origin develop developにプッシュする
* git status 現在のコミットやステージングやブランチ等の状態を確認
* git pull --rebase マージ分を前に持ってきて、自分の更新を後ろに回す
* git checkout branchname ブランチをbranchnameに切り替える
* [ローカルとリモートのブランチ名を変更する](http://www.d-wood.com/blog/2014/04/01_5945.html)
    * ローカルの場合、1コマンドでブランチ名を変更できる
    * リモートの場合、1コマンドでブランチ名の変更はできない
        * 別の名前でブランチを複製し、複製元ブランチを消すことで実現している
* [ローカルとリモートのブランチ削除方法](http://dackdive.hateblo.jp/entry/2014/05/07/094740)
    * ローカルとリモートでコマンドの書き方が異なる
* [ブランチ間でファイルの差分を見る方法](http://dackdive.hateblo.jp/entry/2014/04/25/111851)
* [図で分かるgit-mergeの--ff, --no-ff, --squashの違い](http://d.hatena.ne.jp/sinsoku/20111025/1319497900)
* [gitのtagをリモートにpushする](http://milligramme.cc/wp/archives/4374)


# Gitのインストール

自分は主に Cygwin + Git を使い、
補助的に TortoiseGit を使っている。

* Cygwin + Git
    * コマンドラインなので、導入と学習のハードルは高い
    * Windows 上で使うなら、これが一番動作が軽い
    * git-flow が使える
* TortoiseGit
    * TortoiseSVN を使っていた人には、一番使いやすい
    * アイコンオーバーレイで、ファイルの現状がリアルタイムにわかる
        * オーバーレイが見えなくなった時は→ [WindowsのGit環境構築手順 ](http://itmemo.net-luck.com/windows-git/)
    * 右クリックが充実
        * 差分確認ツールが右クリックで起動できるので楽
        * ログも右クリックで起動できて便利
    * git-flow が使えない
        * プラグインのようなものがあるかも
* SourceTree
    * GUI なので、なんとなくわかりやすくなっている
    * git-flow が使える
    * Windows だと動作のひとつひつが遅い
        * 自分の環境だけかもしれない
        * Mac は速いらしい


# コミットの取り消し、打ち消し、上書き

* http://qiita.com/shuntaro_tamura/items/06281261d893acf049ed
* git reset --hard 最新のコミットに全部戻す。戻した履歴を残さない
* git checkout HEAD^ ひとつ前のコミットに戻す
  * 3つ前だとHEAD^^^かHEAD^3と書ける
  * http://qiita.com/takoba/items/bcda4c796778ecabe3b1


# リモートリポジトリから更新する

* git fetch
    * リモートリポジトリの更新情報を、ローカルリポジトリに持ってくる
    * ローカルのファイルには何もしない
* git merge
    * fetch で手に入れた更新情報を、ローカルのファイルを適用する
* git pull
    * fetch → merge を続けて行う
    * 厳密には少し意味合いが異なる。
        * [git fetchの理解からgit mergeとpullの役割](http://qiita.com/osamu1203/items/cb94ef9da02e1ec3e921)
* git pull --rebase
    * ローカルで commit した後に push したいのに、リモートリポジトリで他の commit がある時に用いる
    * 「私の変更作業は皆が変更を完了したものをベースとして行いたい」という意志で用いる
    * 変更履歴に Merge commit が付かず、変更履歴が綺麗に保たれる
    * https://www.atlassian.com/ja/git/tutorial/remote-repositories#!pull


# 自分以外の人が作ったブランチに移る

http://www.backlog.jp/git-guide/reference/remote.html

リモートリポジトリにあるブランチは、
ローカルリポジトリで `origin/` を付けて取り扱います。
この `origin/` が付いたブランチは **追跡ブランチ** と呼ばれています(これが自分以外の人が作ったブランチ)。

リモートリポジトリにあるブランチを表示するには…

* `git branch -r` : 追跡ブランチを一覧表示
* `git branch -a` : ローカルのブランチと追跡ブランチを一覧表示

追跡ブランチをチェックアウトしてプルすることで、
追跡ブランチの状態になります。

1. git checkout origin/branch_name
2. git pull origin branch_name

↑のそれぞれのコマンドで文句を言われたら、内容に従った対処を行います。


# addしたのを取り消す
* git rm --cached ファイル名
* http://d.hatena.ne.jp/mrgoofy33/20100910/1284068244

# 管理対象から無視する
.gitignore を用いる。
リポジトリごとに設定する方法と、自分のみ全リポジトリで管理対象から無視する方法がある。

* [gitで管理しないファイルを無視させる .gitignore](http://www.omakase.org/misc/gitignore.html)
    * 一般的な .gitignore の書き方
* [.gitignoreの存在を我々は見過ごしてはならない。](http://qiita.com/asonas/items/abdbf1208e832b5dd0eb)
    * とても参考になる！
    * 項目「毎回、同じファイルを ignore するのは面倒、でも戦争も起こしたくはない」に、自分のみ全リポジトリで管理対象から無視する方法が書いてある。


# gitの管理対象から特定のファイル、ディレクトリを削除する

* http://qiita.com/ytkt/items/a2afd6be8e4f06c1ea25    
* git rm filename filenameをリポジトリから消す。ファイルそのものも消す
* git rm -r dirname ディレクトリをリポジトリから消す。ディレクトリそのものも消す


# viでコメント書き

* マージした時にviが立ち上がったら、:wqで「上書き」「終了」
* [viエディタの使い方](http://net-newbie.com/linux/commands)/vi.html


# pushのデフォルト設定

* [git push時に表示されるwarning: `push.default is unset...`の意味と解決方法](http://qiita.com/yaotti/items/a8e9f5de8dcca81d3214)
* [git の push.default 設定を理解する](http://qiita.com/misopeso/items/ede49b661cc7ad30528a)
* [gitのpush.defaultに関するノウハウ](http://qiita.com/awakia/items/6aaea1ffecba725be601)


# ログの表示手法色々
* [コミット履歴の閲覧](http://git-scm.com/book/ja/v1/Git-%E3%81%AE%E5%9F%BA%E6%9C%AC-%E3%82%B3%E3%83%9F%E3%83%83%E3%83%88%E5%B1%A5%E6%AD%B4%E3%81%AE%E9%96%B2%E8%A6%A7)
    * [ログ出力の制限](http://git-scm.com/book/ja/v1/Git-%E3%81%AE%E5%9F%BA%E6%9C%AC-%E3%82%B3%E3%83%9F%E3%83%83%E3%83%88%E5%B1%A5%E6%AD%B4%E3%81%AE%E9%96%B2%E8%A6%A7#%E3%83%AD%E3%82%B0%E5%87%BA%E5%8A%9B%E3%81%AE%E5%88%B6%E9%99%90)が便利


# GitHub

## etc

* [サポート GitHubの始め方(Cygwin編)](https://github.com/NIFTYCloud-C4SA/support/wiki/%E3%82%B5%E3%83%9D%E3%83%BC%E3%83%88-GitHub%E3%81%AE%E5%A7%8B%E3%82%81%E6%96%B9%28Cygwin%E7%B7%A8%29)
* [githubでタグを作成する方法](http://kakakikikeke.blogspot.jp/2013/06/github.html)

## GitHubにあるリポジトリをローカルにcloneする方法

* http://qiita.com/masamitsu-konya/items/abb572337156e4d003cf
* [git-flow cheatsheet](http://danielkummer.github.io/git-flow-cheatsheet/index.ja_JP.html)

1. `git clone URL`
    * URL は GitHub の SSH Clone URL を参照
    * SSH ではなく HTTPS で通信する場合は HTTPS の URL を参照
        * GitHub のページ上で HTTPS と SSH のリンクをクリックすると URL を切り替えられます
2. git-flow を導入するなら `git flow init`
    * 質問には、基本的に初期値のまま(何も書かずにEnter)で構わない
    * 環境によってはきちんと入力する必要がある。わからない場合は、リポジトリの管理者に問い合わせること


## GitHubで毎回UsernameとPasswordを訊いてくるのを抑える方法
http://null.ly/post/15822446389/github-for-mac-clone-repository-username?ref=nf

.git/config の repository の URL が https 経由になっているのが原因。

1. それぞれの環境の.gitフォルダにあるconfigファイルをテキストエディタで開く
2. [remote "origin"] の url の https://github.com/ を git@github.com: に変更する


# git-flow

* [git-flow cheatsheet](http://danielkummer.github.io/git-flow-cheatsheet/index.ja_JP.html)
* [Git-flowって何？](http://qiita.com/KosukeSone/items/514dd24828b485c69a05)
* [いまさら聞けない、成功するブランチモデルとgit-flowの基礎知識](http://www.atmarkit.co.jp/ait/articles/1311/18/news017.html)
* [A successful Git branching model の和訳](http://keijinsonyaban.blogspot.jp/2010/10/successful-git-branching-model.html)


# マージ競合時の対応

競合箇所をテキストエディタで修正するのが常道かもしれないが、
変更箇所がたくさんあると大変。
そこで git の mergetool を用いる。


## mergetool を起動

1. コマンドプロンプト上でリポジトリがあるディレクトリまで移動
2. `git mergetool` を実行
    * .gitconfig で mergetool の設定が書かれていない場合、警告を受ける。
      後述で解決するとして、ここでは無視して構わない
3. 競合しているファイルごとに、どのツールを使って競合を解消するかを聞いてくる。
基本はデフォルトに設定してあるものを使うので、そのままEnter
4. ツール上で編集が終わったら、ツールを終了させる
    * 何も変更していない場合は「競合は解決したのか？」と訊いてくる。yかnで答える
5. 全部のファイルの対応が終わるか、途中で Ctrl-c でやめると、mergetool が終了

参考
[Gitコンフリクト解消ガイド（git mergetoolの使い方）](http://qiita.com/yuya_presto/items/5d99499cf96c0ebb09f8)


## 競合解決ツールに vimdiff を用いる

vim をインストールしている環境であれば、vimdiff が使える。
vimdiff は3+1画面。
vimdiff2 は3画面。


### .gitconfig に vimdiff を設定

コマンドプロンプト上で
`git config --global merge.tool vimdiff`
を実行すると、
.gitconfig に mergetool の競合解決ツールのデフォルト設定が書き込まれる。

これで、mergetool 起動時に毎回警告を受けなくて済むし、
競合解決時にいちいちツールを指定しなくてもよくなり、便利。

参考
[Mac で使える git mergetool をいろいろ試してみる - Vimdiff2](http://blog.eiel.info/blog/2013/07/03/git-mergetool-vimdiff2/)


### vindiff のコマンド

最低限覚えておきたいコマンド↓

* [ c :: vimdiff時前の変更箇所へ
* ] c :: vimdiff時次の変更箇所へ
* :diffget LOCAL :: カーソルがある競合箇所をLOCALウィンドウのものを適用
* :diffget BASE :: カーソルがある競合箇所をBASEウィンドウのものを適用
* :diffget REMOTE :: カーソルがある競合箇所をREMOTEウィンドウのものを適用

参考
[【IT支援部】viの分割時およびvimdiffのショートカットキー](http://ogatism.jp/vi_split_vimdiff/)


### vim のキーバインドを変更

いちいち `:diff REMOTE` のようにコマンドを書くのは面倒。
そこで vim の設定ファイル .vimrc に、キーバインドを書いておく。

```
if &diff
map <leader>1 :diffget LOCAL<CR>
map <leader>2 :diffget BASE<CR>
map <leader>3 :diffget REMOTE<CR>
endif
```

leader はバックスラッシュのこと。
バックスラッシュ→3 を入力すると、競合箇所が REMOTE ウィンドウのものに置き換わる。

参考
[Vimの設定ファイルを作る](http://qiita.com/tetsuya/items/75987487ffac42250d3b)
[git mergeをvimdiffで](http://suzuken.hatenablog.jp/entry/2012/01/09/231118)