TL;DR ( = "Too Long; Didn't Read")
-
プロジェクトのgit 管理が雑だったためやり直しました。
- master の一本槍だった (一人で管理していたため、まあいいや、の精神でした)
- 受託案件にて、複数の細かな仕様変更が来た
- 問題点1・・・それぞれの更新タイミングが未定
- クライアント:「今週は仕様Aを適用してね。」「来週は仕様Bを適用してね。」
- 問題点2・・・ころころ仕様が変わる
- クライアント:「やっぱり仕様Aはなしね。」「今週は仕様Cを適用して、仕様Bはとりあえず保留ね。」
- 初期状態(git init 時)に開発用ブランチを切っておけばよかった....
-
慌てて以下の手順で整理
-
git init
を行った際の初期状態のcommit 遡り、新たにmaster_new
ブランチを作る - 現在のブランチ (
master
)を、開発用ブランチとする (feature-A
) - 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
は直接編集しない)
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 ---------------|