Gitの理解に於いて重要なのは「上書きセーブではない」ということです。
「このファイルのこの行に修正したんだよ」という情報(コミット履歴)を
何もファイルが存在しないところに、上にどんどん積み上げていくよということです。
質問文の状況がどう遷移していったかに着目すると、
- スタート時点のmaster
- Aブランチの修正を上に積み上げたmaster
- 2にBブランチの修正を上に積み上げたmaster
- 3に対していくつかの修正を上に積み上げたmaster
マージ【merge】とは、融合する、併合する、合併する、混合する、結合する、統合する、などの意味を持つ英単語です。
この最終時点の4番には、Aブランチの修正が含まれています。
Aブランチの修正内容をmasterに適用(マージ)しようとしたとしても、
「もうAブランチの修正はもう含まれているんだから何も作業しないよ!」と突っぱねられてしまいます。
そのため、ブランチAの状態に戻し、それを再度masterにマージし、本番環境へデプロイしようと思った。そうするにはどのようにすれば良いのでしょうか?
対応策は2通りです。
- Bブランチが悪いのはまぁわかるので、修正をなかった事にするrevert命令を発射してBブランチを対消滅させる
- バックアップを取った上で、積み上げたコミット履歴をなかった事にしてしまう
今回はBブランチ適用後、色々と他にもコミット履歴を積み上げちゃったみたいなので
後者の方が適切かなぁ?と思います。
【注意】この流れは取り返しがつかないので、必ずバックアップを取得してから行うようにしてください。
bash
1$ git checkout master
2
3# masterに上げるべき状態には達していないので、
4# developみたいな名前を付けて退避させておく
5$ git checkout -b develop
6$ git push origin develop
7
8$ git checkout master
9
10# git logコマンドでコミット履歴を確認
11# 1画面に収まらない程の履歴が積み上がってる場合、
12# less風の画面になるので、JKキーで上下にスクロールして、コミットのハッシュIDを控えてQキーで終了する
13$ git log
14
15# コミット履歴をハッシュID時点の状態に変更する
16$ git reset コミットID
17
18# git statusで見るとさっきまでの修正内容が全て存在しているので
19# git checkout .で消し飛ばす
20$ git checkout .
21
22# -fオプションを指定して、強制上書きモードでリモートリポジトリにpushする
23$ git push -f origin master
質問文を読む限り、Aブランチはローカルに残っているみたいなので、
masterブランチを捨ててAブランチからmasterブランチを複製しても良いかもしれないですね。
bash
1$ git checkout master
2
3# masterに上げるべき状態には達していないので、
4# developみたいな名前を付けて退避させておく
5$ git checkout -b develop
6$ git push origin develop
7
8# ローカルのmasterブランチを消去する
9$ git branch -d master
10
11# Aブランチから新しいmasterブランチを作成
12$ git checkout A
13$ git checkout -b master
14
15# -fオプションで強制プッシュを行う
16$ git push -f origin master
実際の作業の流れとしてはこんな感じになります。
(masterブランチにぶら下がった邪魔なコミット履歴を剥がすだけなので、対応策は色々とあります。)
それ以降の流れとしてはバックアップしておいたdevelopを主軸に開発の続きを行い、
ちゃんとテストした上で本番環境での動作に耐えうる!と判断したら、
develop→masterにマージすると良いでしょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/04/04 15:28