質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
Git

Gitはオープンソースの分散バージョン管理システム(DVCS)です。

Q&A

解決済

1回答

783閲覧

Gitの過去ブランチに関すること

sakura.k

総合スコア50

Git

Gitはオープンソースの分散バージョン管理システム(DVCS)です。

1グッド

3クリップ

投稿2022/04/04 10:12

例えばAというブランチがあり、それをmasterにマージした。その後、本番環境へデプロイし、本番環境でそのWebアプリを実行してみると、上手く動いた。

そしてその後、Bというブランチを作成し、それをmasterにマージした。その後、本番環境へデプロイし、本番環境でそのWebアプリを実行してみると、上手く動かなくなってしまった。

エラー箇所を特定しようとしたが、困難だった。その過程で、いくつかのブランチを作成し、それをmasterにマージした。しかし、それでもそのWebアプリを実行してみると、上手く動かなかった。

そのため、ブランチAの状態に戻し、それを再度masterにマージし、本番環境へデプロイしようと思った。そうするにはどのようにすれば良いのでしょうか?

git checkout master
git merge A
git push
git push heroku

などの手順でやってみましたが、上手くいきませんでした。解説よろしくお願いします。

Taste_Bitter👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

Gitの理解に於いて重要なのは「上書きセーブではない」ということです。

「このファイルのこの行に修正したんだよ」という情報(コミット履歴)を
何もファイルが存在しないところに、上にどんどん積み上げていくよということです。

質問文の状況がどう遷移していったかに着目すると、

  1. スタート時点のmaster
  2. Aブランチの修正を上に積み上げたmaster
  3. 2にBブランチの修正を上に積み上げたmaster
  4. 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 10:36

編集2022/04/04 10:55
miyabi-sun

総合スコア21158

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yumetodo

2022/04/04 15:28

reset + checkoutする代わりにreset --hardする手もあります
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問