Git,GitHubの操作(ブランチとマージ,stashによる退避とcherry-pickによる反映)について

##はじめに
この記事では
ブランチとマージの操作について
お話ししていきたいと思います。(忘却録)

Gitの基本的な操作についてはこちらの記事を参考にしてみてください。

https://qiita.com/ryutake459/items/51472647460a7ffe0c8c

##用語についての解説
####ブランチ(branch)
ブランチ(branch)
:枝という意味を持つ。その名の通り、枝分かれしたそれぞれの履歴の道筋のことをいう。
またgit add,git commitによりGitリポジトリを作成した際に自動的に作成されるブランチを**masterブランチ**と言い、プロジェクトの本流を表すメインのブランチとして使用される。

####ブランチを使用する目的
開発の際、複数人での作業や並行しての作業(新しい機能開発と並行してバグの修正を行うなど)をすることが多い
→複数のコミットに枝分かれすることで、それらを可能にすることができる

####マージ(merge)
マージ(merge)
：統合という意味を持つ。ブランチの内容を別のブランチに統合することを言う。
→わかりやすく言うと枝分かれさせたものをくっつける操作を行う。


##ブランチの操作について

###ブランチの作成と作成先への移動
git checkout -b コマンド
①新しい枝(ブランチ)を作成し、②そこに移動する
という二つの動作を行う

```
$ git checkout -b  <ブランチ名>
```

またこの操作は
①git branch <ブランチ名>：ブランチの新規作成
②git checkout <ブランチ名>：指定したブランチへの移動
で実行することもできる

つまり

```
$ git checkout -b  <ブランチ名>
```

は

```
$ git branch <ブランチ名>
$ git checkout <ブランチ名>
```

ともなる。

##git branch

###現在のブランチの確認と移動
自分が現在どのブランチにいるのかを確認する場合

```
$ git branch  
```

```
  c1
  c2
  c3
  c5
* master
(END)
```
で確認できる

ブランチの移動をする際は

```
$ git checkout (移動したいブランチ名)
```
で移動する

##git checkoutの現在の問題とgit switchへの移行
これまでgit checkoutについて説明してきましたが、このコマンドには様々な機能が内蔵されており、シンプルで使いやすいと言う面からgit 2.23 で新しく導入されたgit switchに置き換わるようになりました。

そのため
現在のブランチから新しくブランチを作成して、
そのブランチに移動する（枝分かれさせ、新しい枝に移動）

```
$ git checkout -b  <ブランチ名>
```

は

```
$ git switch -c 〈ブランチ名〉
```

ブランチの移動

```
$ git checkout　〈移動先のブランチ名〉
```
は

```
$ git switch 〈移動先のブランチ名〉
```

となります。

みなさんもぜひgit switchを使用するようにしてみてください。


###ブランチの削除
作成したブランチ(マージ済み)を削除する場合には
git branch -dコマンドを使用する

```
$ git branch -d <削除したいブランチ名>
```

またマージをしていないがブランチを削除したい場合は-Dで削除を行える

```
$ git branch -D <削除したいブランチ名>
```

###コミットをせずに別のブランチに移動する
例えば「現在developブランチで作業中だがmasterブランチで作業したいことがある」という際に
コミットはせずにその場を退避したい時は変更内容を保存後

```
$ git stash
```

####現在何が退避してあるのかを確認したい際は

```
$　git stash list
```

####変更の復元を行う

```
$　git stash apply (スタッシュ名)
```

####退避した作業をstash listから削除する
またこのコマンドは単体だと変更の復元をせずに削除してしまう可能性があるので
注意が必要である

```
$　git stash drop (スタッシュ名)
```
####変更の復元+stash listから削除する
またgit stash applyとgit stash dropの作業をgit stash dropでまとめることができる
(変更の復元+stash listから削除する)

```
$　git stash pop 
```
##マージの操作について
###マージのコマンド
マージを行う際には

```
$ git fetch
$ git merge
```
という２つのコマンドを使用します

####git fetch
リモートリポジトリ→ローカルリポジトリに変更内容の情報を取り込む

####git merge
git fetchで取得した変更内容を現在のブランチに取り込む(マージする)
(ローカルリポジトリ→ワークツリーに反映)

###git pull
また先ほどの２つの動作はgit pullで実行されることが多いです

git pullコマンド:リモートリポジトリの変更内容をローカルリポジトリに取り込み、
ワークツリー(作業場)に反映する

```
$ git pull
```







####マージをする際の注意点
マージをする際にはマージ先(結合先)に移動してからマージを行う

例)c1ブランチで作成したリポジトリをmasterブランチへマージしたい
→masterブランチへ移動

```
$ git checkout master
```

git pullでマージする

```
$ git pull
```


##cherry-pickを使用して同じ修正を他のブランチに反映させる
マージ(統合)はせずに他のブランチの内容を反映させたいとき

```
$ git cherry-pick (ハッシュ値)
```

を入力する

またハッシュ値については

```
$ git log
commit 40文字　←ここの頭文字8文字
```

で確認することができる

###具体的な手順
d2ブランチにd1ブランチの内容を反映させたいとき

```
#git logでd1のハッシュ値(反映したいリポジトリの内容)の確認
$ git log
```

```
#d2ブランチに移動
$ git checkout d2
```

```
d1ブランチの修正をd2ブランチに反映させる
$ git cherry-pick (先ほど入手したハッシュ値)
```


こうすると競合が起きる可能性があるので対処しなければならない
競合と対処方法についてはこちらを参考にしてみて下さい。

https://qiita.com/ryutake459/items/514c4b17dde49b85eae0

そして修正後

```
#ステージングエリアに移動
$ git add
```

```
# ステージングエリアの内容をコミット
$ git commit -m '変更内容についてコメント'
```

```
#リモートリポジトリへ変更内容の反映
$ git push
```

で完了