Gitコマンドメモ

Gitコマンドや動作のメモです。

# 使用ツール
- Git
 - https://git-scm.com/book/ja/v1
- SourceTree
 - https://www.atlassian.com/ja/software/sourcetree/overview
- Github Desktop
 - https://desktop.github.com/

# git init
git リポジトリが作成されます。

```bash:使い方
git init
```

git initで `.git` ディレクトリが作成されます。

```bash:init
git init
Initialized empty Git repository in フルパス/.git/
```


# git status 状態確認
git の状態を確認したい場合は`git status`を使用します。

```bash:gitの状態を確認
git status
```

# git add ファイル名
指定したファイルをステージに移動します。

```bash:ファイルをステージへ移動
git add ファイル名
```
パス付きでファイル名を指定します。

# git reset HEAD^ ファイル名
`git add`の取り消しです。

```bash:ファイルをステージへ移動
git reset HEAD^ ファイル名
```

SourceTreeを使うようになり、チェックを外すとステージから戻せるので、大幅に使用頻度が減りました。

# git commit -m "メッセージ"

```bash:メッセージをつけてコミット
git commit -m "メッセージ" 
```

SourceTreeを使うようになり、GUIからコメント付きでコミットできるようになったので、コマンドの使用頻度が減りました。

## 変更のない空コミット
ファイルを変更せず、コミットだけをしたい場合は、`--allow-empty` を付けます。

```bash:ファイル変更なしでコミット
git commit --allow-empty -m "メッセージ"
```
変更のない空コミットで、プルリクエストの作成が楽になります。まずはプルリクエストを作ってから作業しようみたいな不フローに便利です。

# commit のメッセージを変更
コミットメッセージを間違えてしまい、コミットメッセージのみ変更したい場合は、`--amend`
を付けます。

```bash:commitの取り消し
git commit --amend -m "変更するメッセージ"
```
すると最新コミットのメッセージのみが変更されます。

# git commit を取り消し
`git commit`したものの取り消したい場合です。 commitの取り消しはいくつかパターンがあるのでどれが良いかは最初迷いました。


## git reset --hard でコミットの取り消し

```bash:commitの取り消し
git reset --hard HEAD~1
```
コミットを1回取り消します。1の部分をたとえば3にすると3回分とりけすことができます。
**注意点 :** `reset --hard`をするとコミットしていない変更中ファイルなどが全て消えてしまいます。


## git reset --soft でコミットの取り消し
コミットを取り消してステージされた状態に戻したい場合です。

```bash:commitの取り消し
git reset --soft HEAD^
```
最新コミットが取り消され、ステージされた状態に戻ります。ローカルの変更中ファイルも消えません。

## git reset --hard ハッシュ でハッシュへ移動
ハッシュを指定すると、commitを何個でもすっ飛ばしてハッシュへ移動できます。

```bash:ハッシュへ移動
git reset --hard ハッシュ名
```

```bash:ハッシュへ移動
git reset --hard ac9f9b71dd20c59d76c5e684530572e322f12640
```

## git revert でコミットの取り消し
`git reset`でコミットを取り消しではログが残りません。コミットの取り消しをログに残すにはrevertを使用します。

```bash:commitの取り消し
git revert ハッシュ値
```
revertにハッシュ値を指定するとコミットを取り消したコミットが作成されます。


# git rm ファイル名
gitで管理していたファイルを削除したい場合です。

```bash:ファイルを削除
git rm hoge.php 
```
`git rm`で消すことができます。


# git rm -r ディレクトリ名
gitで管理していたディレクトリを削除したい場合です。

```bash:ディレクトリを削除
git rm -r hoge 
```
`git rm -r`で消すことができます。


# rm を取り消し
`rm` してしまっても、Git で管理していれば取り消すことができます。

```bash:hoge.phpを削除
rm hoge.php 
```
あ、これ消しちゃだめなやつだった:(；ﾞﾟ'ωﾟ'):

```bash:hoge.phpを復活
git checkout -f hoge.php 
```
`checkout -f` で削除を取り消しできます。
`checkout` に `-f` オプションをつけるのがポイントです。
 
# git rm を取り消し
`git rm`したものの取り消したい場合です。 

```bash:hoge.phpを削除
git rm hoge.php 
```
あ、これ消しちゃだめなやつだった:(；ﾞﾟ'ωﾟ'):

```bash:hoge.phpを復活
git reset HEAD hoge.php 
git checkout hoge.php 
```
`reset HEAD`した後に、`checkout`するのがポイントです。

# git rm --cached でgit管理から削除
`git rm`してgitの管理からは外したいがファイルは削除したくない場合は`--cached`をつけます。

```bash:Vagrantfileをgit管理から削除
git rm --cached Vagrantfile 
```
gitからは削除されますがファイルが残っていることを確認してください。

# git log ログ確認
git のログを確認したい場合は`git log`を使用します。

```bash:gitのログを確認
git log
```
ログが一覧で表示されます。ログモードから抜けたい場合は`q`を押します。

## git checkout -b で新規ブランチの作成

```bash:新規ブランチの作成
git checkout -b ブランチ名
```
 

## 特定ファイルの git log を表示


```bash:特定ファイルのgitのログを確認
git log ファイル名
```

例えばhoge.phpファイルの `git log` を表示したい場合は以下のようにファイル名を指定します。

```bash:ファイルのgitのログを確認
git log hoge.php
```

## git log を1行ずつ表示
`git log`で表示されるログは情報が多いため、情報を絞り1行だけで表示することもできます。

```bash:gitのログを確認
git log --oneline
```
`--oneline`をつけると1行だけで表示されます。

# git branch ブランチの確認
ブランチ周りの操作は`git branch`を利用します。

```bash:ブランチ一覧を表示
git branch
```
ブランチ一覧が表示されます。

## branch名を変更
ブランチ名を修正する場合は`-m`を使用します。

```bash:ブランチ名を変更
git branch -m 古いブランチ名 新しいブランチ名
```

## branchを削除
ブランチを削除します。

```bash:ブランチを削除
git branch -d ブランチ名
```
`-d`オプションをつけるとブランチを削除することができます。


## branchを一括削除
gitだけではgrepとxargsを組み合わせます。

```bash:ブランチを削除
git branch | grep ブランチ名 | xargs git branch -d
```

以下は、 `issue1００/fix-name` や `issue180/improve-action` など、 `issue1` が含まれるブランチ名のブランチを一括削除する例です。

```bash:issue10番台のブランチを削除
git branch | grep issue1 | xargs git branch -d
```
`issue1`で始まるブランチが全て消えました。

# git merge ブランチを merge
ブランチをmergeするには`git merge`を利用します。

```bash:ブランチをマージ
git merge ブランチ名
```

以下はmasterという名前のブランチをマージする例です。

```bash:masterブランチをマージする例
git merge master
```

# git diffでファイルの差分を表示
ファイルの差分を表示するときは`git diff`を利用します。

```bash:差分を表示
git diff ファイル名
```

## git diff ブランチ名 でブランチの比較
`git diff`はブランチそのものを比較できます。

```bash:差分を表示
git diff ブランチ名
```

例えば現在開発中のブランチと`dev`という名前のブランチと、カレントブランチの差分を確認したい場合は、以下のようにします。

```bash:devブランチとの差分を表示
git diff dev
```
`dev`ブランチとカレントブランチとの差分が表示されます。

# git stash で一時退避
commitしていないファイルをなかったコトにします。

```bash:変更を一時退避
git stash
```
とりあえずブランチを切り替えたい時などに便利です。

# git stash pop
`git stash` した内容を戻したいときは `pop` を使います。

```bash:stashの一時退避最新を戻す
git stash pop
```

# git stash list
`git stash` した一覧を表示したい場合には`list`をくっつけます。

```bash:stashで一時退避したリストを表示
git stash list
```

# git cherry-pick で コミットを取得
あるブランチのあるコミットのみを、別のブランチに反映したい場合です。
`cherry-pick` の前にgit logで取れるコミットのハッシュを取得しておきます。

そして、cherry-pickで該当するハッシュを指定します。

```
git cherry-pick 2ed95cb0ab61efd1cc51335257c0226585456e0c
```
こちらにより、特定のコミットのみを反映出来ました。

# git blame で犯人探し
`git blame`を使うとファイルを編集した人を行単位で調べることができます。

```bash:編集した人を探す
git blame ファイル名
```
以下のようにファイル名を指定します。

```bash:編集した人を探す
git blame hoge.php
```
ただ、これではファイル全行が表示されてしまって膨大になります。

## Lオプションで範囲を指定
`git blame` で特定の範囲だけ、hoge.phpの119行目から123行目の変更履歴を見たい場合です。

```bash:編集した人を探す
git blame -L 119,123 hoge.php
```
`,`区切りで行数を指定します。スペースが空いては失敗します。

## ハッシュを指定で過去のblame
ハッシュを指定すると過去の状態で`git blame`を実行できます。

```bash:編集した人を探す
git blame ハッシュ名 -- ファイル名
```

```bash:編集した人を探す
git blame 25b82cf75d31d0rf7bd9f6010ef68fbb90dc0b32 -- hoge.php
```
25b82cfというハッシュのコミットのhoge.phpファイルの編集者を探すことができます。

## tig blame で git blame を便利に
`tig blame`を使うと`git blame`よりも探しやすいです。

```bash:編集した人を探す
tig blame hoge.php
```

# git tag
`git tag`を使うとタグ一覧を表示できます。

```bash:タグを表示
git tag
1.0.0
1.0.2
```
タグが表示されます。

## git tag -a タグ名　-m メッセージ
`-a`を使うとメッセージをいれてタグを追加できます。

```bash:タグを追加
git tag -a 1.0.2 -m '１．０．２バージョンです(☝ ՞ਊ ՞)'
```
タグを追加できます。

## git push origin タグ名
GitHub にタグを push する場合です。
タグは `git push` だけでは push できません。

```
git push origin 1.0.2
Counting objects: 1, done.
Writing objects: 100% (1/1), 257 bytes | 0 bytes/s, done.
Total 1 (delta 0), reused 0 (delta 0)
To git@github.com:pugiemonn/pugiemonn.com.git
 * [new tag]         1.0.2 -> 1.0.2
```

## git push origin --tags でタグを一気に push
`--tags` を使うとタグを一気に push できます。

```
git push origin --tags
```

# git show タグ名 でタグについてみる
`git show` を使うとタグのメッセージを確認できます。

```
git show タグ名
```

使用例

```
git show 0.1
tag 0.1
Tagger: Pugiemonn <pugiemonn@gmail.com>
Date:   Tue Aug 27 12:10:51 2019 +0900

初回リリースバージョン
```


# git reflogで状態を確認する
[git log](http://qiita.com/pugiemonn/items/a838eb7c402b276f0063#git-log-%E3%83%AD%E3%82%B0%E7%A2%BA%E8%AA%8D)でログが見つからない場合はreflogが助けになります。

```
git reflog
f4d1483 HEAD@{0}: checkout: moving from 55898aa648a5e7d702a42b7cdff1e9d4119fdef to f4d148336fa045b155083448b77dce4353461cb
55898aa HEAD@{1}: checkout: moving from f4d148336fa045b155083448b77dce4353461cb to 55898aa648a5e7d702a42b7cdff1e9d4119fdef
f4d1483 HEAD@{2}: checkout: moving from pugiemonn to f4d148336fa045b155083448b77dce4353461cb
55898aa HEAD@{3}: checkout: moving from master to pugiemonn
55898aa HEAD@{4}: commit: 予約のキャンセル機能を追加しました。
f4d1483 HEAD@{5}: commit: authのbefore_actionを追加しました。

略 ・・・
```
git logはheadの最新ログが表示されますので、ソレ以外を見たい場合はreflogを使用しています。

# git rev-parse HEAD で最新Headを取得
いまいるブランチの最新ヘッドが表示されます。

```bash:HEADを表示
git rev-parse HEAD

f4d148336fa045b155083448b77dce43534651cb
```

# git name-rev ハッシュでどのブランチのものか調べる
どのブランチでコミットが行われたか調べたい場合には`name-rev`を使用します。

```bash:
git name-rev f4d148336fa045b155083448b77dce4353465cb

f4d148336fa045b155083448b77dce4353465cb pubiemonn-branch
```
上記の例ではpubiemonn-branchのコミットだとわかりました。

# git remote で GitHub などリモートのリポジトリを操作 
リモートリポジトリを操作する場合のコマンドが、`git remote` です。

## git remote -v で確認
リポジトリの状況を確認できます。

```
git remove -v
```

## git remote add でリモートリポジトリを追加
GitHub リポジトリを作るときに毎度表示されるコマンドがこちらので、`git remote add` です。

```
git remote add 名前 リポジトリURL
```
GitHub での最初のコードでは名前のところに origin が入っています。

```bash:originにURLを指定した例
git remote add origin https://github.com/pugiemonn/pugiemonn.com
```


## git remote rm でリモートリポジトリを削除

```
git remote rm 名前
```

```bash:originを削除する例
git remote rm origin
```

## origin を指定済みの場合のエラー
origin を指定していてさらに add しようとするとエラーが出ます。

```
fatal: remote origin already exists.
```
rm してから add すればエラーは消えます。

# GitHubの最新コミットを取り消し
GitHubにpushしても消すことができます。

```bash:GitHubへpushしたコミットの取り消し
git push -f origin HEAD^:ブランチ名
```
ただ、上記はちょっと検証範囲に自信がないかもしれません。

以下はGithubのmasterブランチを消した例です。

```bash:Githubのmasterブランチへpushしたコミットの取り消し
git push -f origin HEAD^:master
```
Githubへpushしちゃったあああ:(；ﾞﾟ'ωﾟ'):みたいなときに。
ただしローカルの変更は残るので、ローカルは別途修正が必要です。

# GithubやBitbucketのブランチをローカルブランチで上書き
Githubのリモートブランチのmasterへプルリク間違えてマージしちゃったあああ:(；ﾞﾟ'ωﾟ'):みたいなときに。Githubのブランチがローカルブランチで上書きをしたりします。

```bash:Githubのブランチを上書き
git push -f origin ブランチ名
```

```bash:Githubのmasterブランチを上書き
git push -f origin master
```
`-f`オプションで上書きします。

# git config で gitの設定
gitの設定を確認したり切り替えるには `git config` を利用します。

## 設定の確認

```bash:設定一覧を確認
git config -l
```

`git config` から名前をgrepすれば名前を表示できます。

```bash:gitのユーザー名を確認
git config -l | grep user.name
user.name=Pugiemonn
```

## gitに色を設定
gitに色を付ける場合は、`color.ui`を有効にします。

```bash:色を設定
git config color.ui true
```

# git --version でバージョン確認
バージョンの確認したい場合です。

```bash:バージョン確認
git --version
git version 2.3.5
```

# 参考
- https://git-scm.com/book/ja/v2
- https://www.atlassian.com/ja/git/tutorial