LoginSignup
2
0

More than 5 years have passed since last update.

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

Last updated at Posted at 2019-02-26

TL;DR ( = "Too Long; Didn't Read")

  • プロジェクトのgit 管理が雑だったためやり直しました。

    • master の一本槍だった (一人で管理していたため、まあいいや、の精神でした)
    • 受託案件にて、複数の細かな仕様変更が来た
    • 問題点1・・・それぞれの更新タイミングが未定
      • クライアント:「今週は仕様Aを適用してね。」「来週は仕様Bを適用してね。」
    • 問題点2・・・ころころ仕様が変わる
      • クライアント:「やっぱり仕様Aはなしね。」「今週は仕様Cを適用して、仕様Bはとりあえず保留ね。」
    • 初期状態(git init 時)に開発用ブランチを切っておけばよかった....
  • 慌てて以下の手順で整理

    1. git initを行った際の初期状態のcommit 遡り、新たにmaster_newブランチを作る
    2. 現在のブランチ (master)を、開発用ブランチとする (feature-A)
    3. 1で作った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をきる

この時点ではまだ 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でブランチ名を変更する(ローカル/リモート)

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ブランチを削除する

リモートの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. 1で作ったmaster_newブランチをリネームしmasterブランチとする

git branch -m origin master_new master

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

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

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

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0