ポイント
git branch -d <branchname>
はブランチを削除するが、コミットを指しているブランチポインタが消えるだけでコミットしてきた歴史は消えない- master は特別なブランチではなく、他のブランチと同列に扱うことができる。
問題のある現状ログ
$ git log --all --decorate --graph --oneline * C8 (HEAD -> add_second) second機能完成 * C7 CCCの追加 * C6 second機能の追加開始 | * C5 (master, add_first) first機能完成 | * C4 BBBを追加 |/ * C3 コードを整理 * C2 AAAを追加 * C1 最初のコミット
なぜ問題なのかと、最終的に望む状態
master ブランチのポインタは C5 を指しています。
そして C5 には、master ブランチに加えて add_first ブランチのポインタも存在しております。
しかし本当は、masters ブランチは C3 コミットに紐付いてほしいのです。
なぜなら最終的な目的として、C5 はそのままずっと放置して、C8 の完成した add_second ブランチの変更を master に取り込みたいからですの。
その後、master を起点として、次の開発へと進みたい。。。
現在の状態で add_second を master にマージしようとすると、add_first の状態へマージすることになってしまいますわ><。
解決方法
良い解決策が思いつかない><ため、C5 にある master ブランチを削除し、add_second ブランチを master ブランチへと改名することにしました。
手順とコマンド解説
手順
- add_first へチェックアウトする。
- master ブランチを add_first ブランチへマージする。
- master ブランチを削除する。
- add_second ブランチをリ master へとリネームする。
なお、マージしないで master を削除しようとした結果、
$ git branch -d master error: The branch 'master' is not fully merged. If you are sure you want to delete it, run 'git branch -D master'.
とエラーになったため、マージを行うことにいたしました。
使用するコマンド解説
# チェックアウト (指定したブランチへ移動) git checkout <branchname> # マージ (指定したブランチを今のブランチへ取り込む) git merge <branchname> # ブランチを削除 (コミットを指しているブランチポインタが消えるだけ) git branch -d <branchname> # ブランチ名を変更 git branch -m <oldbranch> <newbranch>
実施結果
無事、思った通りに変更することができましたの♪
$ git checkout add_first Switched to branch 'add_first' $ git merge master Already up-to-date $ git branch -d master Deleted branch master (was C5). $ git checkout add_second Switched to branch 'add_second' $ git branch -m add_second master $ git log --all --decorate --graph --oneline * C8 (HEAD -> master) second機能完成 * C7 CCCの追加 * C6 second機能の追加開始 | * C5 (add_first) first機能完成 | * C4 BBBを追加 |/ * C3 コードを整理 * C2 AAAを追加 * C1 最初のコミット $
他に気がついたこと
git reflog
には表示されないこと- マージしたこと
- ブランチを削除したこと
- ブランチをリネームしたこと
- ブランチのリネームは
git reflog --all
とオプションをつければ確認できた。
おわりに
参考ページです!ありがとう存じます♪
- Git – ブランチとマージの基本
マージについてと、ブランチの削除方法の理解が進んだ。 - Git – ブランチとは
Note に次のようにあったので、master ブランチの削除とリネームをしようと思いつくことができた。Git の “master” ブランチは、特別なブランチというわけではありません。 その他のブランチと、何ら変わるところのないものです。
また、後日見つけた次のページが印象的でした。
今回の件が発生した原因ともっとスマートな解決方法は、
の内容が当てはまるように思えます。本件を解決したときは、merge 怖いと思っておりましたので、このような手順となったのだと思います。
このページの次の言葉は Git を今後扱う上で役に立ちそうです!
gitでブランチを作るのは単にリファレンスを張るだけ
… 略 …
ブランチを消すっていっても、ブランチはリファレンスなんだから言ってみれば「貼ってあった付箋をはがして捨てる」って感じ。重要な変更が破棄されたりしないので安心して消せる。
以上です。