よく使うGitコマンドを目的別に

毎回調べてそういえばそうだとなっていたので、
よく使うGitコマンドを目的別にまとめることにしました。

## バグチケットなど、修正を行う場合
featureブランチをローカルに持ってきたうえで、
push,プルリクの流れで実施します。


**1.Githubからブランチを切る（ブランチ名feature/tix●●_●●_●●）**
  ※tixのあとはチケット番号、それ以降は適切なPJT名や修正概要

![2019-08-09_182215.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/474743/7c6160fc-8e30-49ca-aa8e-205bd6f342d4.png)


**2.最新のリモートブランチ情報を取得**

```
git fetch
```

**3.作成したブランチにチェックアウト**

```
git checkout -b ローカルブランチ名 リモートブランチ名（origin/feature/tix●●_●●_●●）
```


**4.実装完了後、修正前後で違いをDiff**

```
git diff
```

**5.修正内容が問題なければcommit**

```
git add ファイル名
git commit
```

**6.pushする**

```
git push origin ローカルブランチ名:リモートブランチ名（feature/tix●●_●●_●●）
```

**7.github上から該当ブランチへ行き、pullrequest**



**8.redmineチケットレビューにして戻す**



## ブランチを切り替える前に修正してしまった場合（、もしくは修正中に緊急で別ブランチで作業が必要になった場合）
修正を一度stashし、ブランチを正しいものに切り替えてから戻します。
※commit済みの場合は次の項目「誤ってコミットしたことをPush前に気がついた場合」を参照してください。

**1.修正内容を念の為確認**

```
git status
```

**2.退避！！**

```
git stash save
```
**3.退避された確認※何もないはず**

```
git status
```

**4.本来作業したかったブランチへ切り替え**

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

**5.退避していた修正を戻す**

**5.1.1回しか退避していない場合**

```
git stash apply stash@{0}
```

**5.2.何回か退避してる場合**
**5.2.1.退避したリストを確認**

```
git stash list 

<stash名>: WIP on <stashを行ったブランチ名>: <ハッシュ> <コミットコメント>
```
**5.2.2.このstashが戻したいのであってるかな？**

```
git stash show stash名
```
　
**5.2.3.合っていれば修正を戻す**

```
git stash apply stash名
```

**6.1の状態に戻っているか確認**

```
git status
```

## 誤ってコミットしたことをPush前に気がついた場合
Pushしてからは知らないので出会ったときに調べる。。
すでにマージ済みなど他の人に影響がある場合は実施NG

**1.1.直前のCommitをなかったことにする**

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

**1.2.特定のファイルを指定して取り消し**

```
git reset HEAD ファイル名
```

## プルリク出したらコンフリクトしていた場合
コンフリクトが起きると、
Githubのプルリク画面に以下のような表示がでます。

![https___qiita-image-store.s3.amazonaws.com_0_329556_03c2eed9-c934-5bad-b4c2-c2db7568ba4a.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/474743/87f2b9eb-c215-d74e-4036-0961c3617705.jpeg)

特に色などないので気が付きにくいのですが、
都度確認するようにする。

解消方法としてはローカルブランチを最新に変更の上、修正ブランチをrebaseする。
コンフリクト要因で中断されるので、該当のファイルへ行き修正を実施後、
rebaseの再開、pushを実施する。


**1. ローカルのブランチをdevelopに切り替え、最新の状態にする**

```
git checkout develop
git pull origin develop
```
**2.developからPullする**

```
git pull
```
**3.修正ブランチにチェックアウトする**

```
git checkout feature/tix●●_●●_●●
```

**4.修正ブランチに対していdevelopをrebaseする**

```
git pull --rebase origin develop
```
**5.コンフリクトの修正**

**6.修正後ファイルをaddする**

```
git add 該当ファイル
```

**7.rebaseの続きを行う**

```
git rebase --continue
```

**8.コンフリクト解消後、pushする。（-fがないとpushできない）**

```
push -f origin feature/tix●●_●●_●●:feature/tix●●_●●_●●
```

# マージ済みのCommitを取り下げる
※実施前にマージしてもらった人など管理者に確認すること（どっちにしろプルリク出しますが、、）

### 前提
既存のCommitを打ち消すコマンドはgit revert。
取り消したいコマンドを打ち消すコミットを新規作成するため、
Commitログには打ち消されるcommitも残る。

※resetはlogも消えるのでpush済みの公開されているコミットに対しての実施はNG。
　なお、特定のCommitを取り消すコマンドのため、
　指定したコミットまで戻るわけではないので注意。

### 実施手順
**1.git logで指定したいcommitのIDをメモする**

```git
git log
```
**2.指定Commitを取り消すCommitを作成**
　※merge commitを指定する場合は、オプションとして-m 1 をつける

```
git revert commitID 
```

**3.commitメッセージが表示されるのでそのまま終了（:q）させる**

**4.git logでrevertされていることを確認する**

```git
git log
```

上記でcommitを消すプルリクが可能になるが、
やっぱりそのcommit消したくないとmerge後になった場合は、
Revert commit をrevertすることで可能。
のでCommitの一時退避的な使い方ができる。

# 2回Commitしたけどまとめたいとき

### 前提
git rebase -i
Commitをまとめるコマンド。

### 実施手順
**1.git logで指定したいcommitの場所を確認**

```git
git log
```
**2.該当のCommitの場所を指定してRebase**

```
git rebase -i head~2
```
※head~のあとの数字はheadからの数。Gitlogを見て確認
  Rebase -i したい対象のcommitの前までする。
  例えば、commit logが以下の場合
  CommitC
  CommitB
  CommitA

  CommitB.Cをひとつにまとめたいとすると、
  Head~2を指定する。

**3. Rebase対象のCommitを指定（Vim）**
Commit位置欄が表示されるので、
rebase対象のcommitのPickをsに変更

```vim

pick d326d1956 修正1
s 0d5eb6ff6 修正2

# Rebase 76e52b7a2..0d5eb6ff6 onto 76e52b7a2 (2 commands)
#
# Commands:
# p, pick <commit> = use commit
# r, reword <commit> = use commit, but edit the commit message
# e, edit <commit> = use commit, but stop for amending
# s, squash <commit> = use commit, but meld into previous commit
# f, fixup <commit> = like "squash", but discard this commit's log message
# x, exec <command> = run command (the rest of the line) using shell
# b, break = stop here (continue rebase later with 'git rebase --continue')
# d, drop <commit> = remove commit
# l, label <label> = label current HEAD with a name
# t, reset <label> = reset HEAD to a label
# m, merge [-C <commit> | -c <commit>] <label> [# <oneline>]
# .       create a merge commit using the original merge commit's
# .       message (or the oneline, if no original merge commit was
# .       specified). Use -c <commit> to reword the commit message.
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
#
# Note that empty commits are commented out
~

```

**4.commitメッセージを入れる**
**5.gitlogからcommitが1つになっていることを確認**

```git
git log
```