masterブランチ一本槍で攻めていたプロジェクトを、過去に遡って整理した 「初期状態（git init 時）に開発用ブランチを切っておけばよかった....」という時の事業仕分け

## TL;DR ( = "Too Long; Didn't Read")
- プロジェクトのgit 管理が雑だったためやり直しました。
  - master の一本槍だった　（一人で管理していたため、まあいいや、の精神でした）
  - 受託案件にて、複数の細かな仕様変更が来た
    - 問題点１・・・それぞれの更新タイミングが未定
      - クライアント：「今週は仕様Aを適用してね。」「来週は仕様Bを適用してね。」
    - 問題点２・・・ころころ仕様が変わる
      - クライアント：「やっぱり仕様Aはなしね。」「今週は仕様Cを適用して、仕様Bはとりあえず保留ね。」
    - **初期状態（git init 時）に開発用ブランチを切っておけばよかった....**


- 慌てて以下の手順で整理
  1. `git init`を行った際の初期状態のcommit 遡り、新たに`master_new`ブランチを作る
  2. 現在のブランチ （`master`）を、開発用ブランチとする (`feature-A`)
  3. １で作った`master_new`ブランチをリネームし`master`ブランチとする

 

git 整理前

```
master -------------------- いろんな修正-A --------------------> current
```


  git 整理後

```
master-------------------------------------------------> current
 |                                                          ^                 
 +--- feature-A -------------- いろんな修正-A ---------------|                
```

- 以下の流れで git 管理を修正しました。


### 1.  `git init`を行った際の初期状態のcommit 遡り、新たに`master`ブランチを作る
初期状態（git init 時）に開発用ブランチを切っておけばよかった....
ということなので、まず initial commitに戻り、ブランチを切ります。
[gitで過去のcommitに対してbranchをきる](http://blog.justoneplanet.info/2011/08/25/git%E3%81%A7%E9%81%8E%E5%8E%BB%E3%81%AEcommit%E3%81%AB%E5%AF%BE%E3%81%97%E3%81%A6branch%E3%82%92%E3%81%8D%E3%82%8B/)


この時点ではまだ `master`ブランチが存在するため、新たに作るブランチは仮に`master_new`とします。
```
git checkout <hash> // 過去のcommitへcheckout. 一時的に detached head になるが怖がらずに
git checkout -b master_new // 新規ブランチを作成とともにcheckout.
```
この作業により、以下のような形になりました。

```
master-------------------------------------------------> current
 |                                                                          
 +--- master_new (こいつをいずれmaster とします）               
```

### 2. 現在のブランチ （`master`）を、開発用ブランチとする (`feature-A`)
いままで `master`として進めてきたブランチですが、実質作業は仕様変更Aを行っていたため、
`feature-A` へと名前を変更します。（`master`は直接編集しない）

[githubでブランチ名を変更する（ローカル/リモート）](https://qiita.com/amidara/items/e47dfb0cf88270ef2802)

#### 2.1. ローカルの`master` ブランチの名前を `feature-A` へ変更

```
git branch -m master feature-A
```

#### 2.2. リモートの `master` ブランチの名前を `feature-A` へ変更
リモートブランチの名前変更は不可（？）ググっても情報見つからず
→　一度削除して、新規名前でもう一度作る、という手順を経る


##### 2.2.1. リモート master ブランチを削除

```
git push origin :master
```

エラー。削除に失敗。下記を参考にさせていただく。
[[git] リモートのmasterブランチを削除する](https://410gone.click/blog/2018/04/05/git-%E3%83%AA%E3%83%A2%E3%83%BC%E3%83%88%E3%81%AEmaster%E3%83%96%E3%83%A9%E3%83%B3%E3%83%81%E3%82%92%E5%89%8A%E9%99%A4%E3%81%99%E3%82%8B/)

>
リモートのmasterブランチはデフォルトだから、消したら次にgit cloneしたときに困るということみたいです。
すぐにmasterを作り直す予定なので、エラーメッセージに従い一時的にカレントブランチの削除を許可させました。リモートリポジトリのconfigファイルに、以下を追加すれば削除ができるようになります。

##### 2.2.2. vim を使用して　.git/config ファイルに以下を追加
※ bare リポジトリに共有としていたため、そちらを変更（ローカルの .git/config ではない）

```
vim xxxxx/.git/config

// 下記を追加
_________________________________________
[receive]
        denyDeleteCurrent = false
_________________________________________
```

##### 2.2.3. リモート master ブランチを削除 (再)

```
git push origin :master
```
→　削除に成功。

##### 2.2.4. `feature-A` としてリモートリポジトリを作成

```
git push -u origin feature-A
```
この作業により以下のような形になりました。


```
feature-A-------------------------------------------------> current
 |                                                                          
 +--- master_new (こいつをいずれmaster とします）               
```

### 3. １で作った`master_new`ブランチをリネームし`master`ブランチとする

```
git branch -m origin master_new master
```

以上の作業で、以下のような構造になりました。

```
master (もとはmaseter_new)
 |                                                                          
 +--- feature-A -------------------------------------------------> current       
```

上記の手順でmaster ブランチよりマージを行えば、下記のような状態へ持っていけます。

```
master-------------------------------------------------> current
 |                                                          ^                 
 +--- feature-A -------------- いろんな修正-A ---------------|                
```