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

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

ただいまの
回答率

87.95%

作業内容を過去の状態に戻す一般的な方法は?

解決済

回答 4

投稿 編集

  • 評価
  • クリップ 2
  • VIEW 10K+

score 36

masterブランチで作業をしていて、過去の作業からやり直したいとします。そのために、過去のコミットにチェックアウトし新たなブランチ(rollbackAとする)で作業を再開します。そしてrollbackAで作業を進めてくうえで、しばらくはmasterブランチは念のため残しておきます。しかし、rollbackAでの作業が進んでいくうちに、いずれmasterブランチは必要なくなると思います。その場合masterブランチは削除して、rollbackAをメインブランチとして作業を進めていくというのは一般的なのでしょうか?名前だけとはいえmasterと付いているブランチを削除して他の名前のブランチをメインブランチにするのに若干違和感があります。

git初心者(SourceTreeを使っています)で周りの方が、過去のコミットから作業をやり直すときの一般的に取る方法がわかりません。私が今あげた方法は一般的なのでしょうか?また他の方法が一般的なのであればご教授いただけると嬉しいです。よろしくお願いします。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

checkベストアンサー

+1

別名つけてもいいですが一般的ではないです。gitに慣れていて自分1人で開発を進める分にはやっても良いですが、基本的にmasterはマージ、複数人で開発するならプルリク専用のブランチとして保持しておくのがいいです。

ちなみに今回のパターンはロールバック前のmasterのコミットはrollbackAの地点で分岐してるだけなので、rollbackAをmasterにマージして競合解決すれば済みます。

また今回のようにmasterで直コミットしてしまったコードを完全に破棄してもいいのであれば、masterの直コミットをreset --hardなどで、rollbackAの時点までもどし、masterにrollbackAをマージすれば、不要なコミットが消された状態で再度masterから開発を継続できます。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/05/15 23:51

    回答ありがとうございます。
    2段落目で提案していただいた方法は、rollbackAの地点以降のmasterのコミット内容が、mergeしたときに戻ってきてしまいますよね?
    3段落目の方法は、rollbackAの地点以降のmasterのコミット内容が破棄されてしまいますが、マージした際に現在のファイルの状態は私の臨んだ結果になります。
    なんといえばいいのかわからいのですが、2段落目と3段落目の中間のような方法はないでしょうか?rollbackAの地点以降のmasterのコミット内容は現在のファイルには反映させず、rollbackAの地点以降のmasterのコミットは残しておくというような方法はないでしょうか?わかりにくくて申し訳ありません。

    キャンセル

  • 2017/05/15 23:51

    また3段落目の方法をとった場合、それまでのコミットをしっかりプッシュしていた場合、ローカルがリモートに比べbehindな状態になってしまい、プッシュできなくなってしまいます。このような場合はどうすればいいのでしょうか?

    キャンセル

  • 2017/05/16 03:42 編集

    そういった場合は本来revertを使った上で、rollbackAをマージするのがいいと思います。、が、revertは分岐点が解らなくなってしまった場合カオスになるので多用しない方が良いです。
    分岐点から積み重ねたコミットが少なければ使っても良いです。(push済みの場合rebaseからのrevertでまとめると周りにも影響を与えてしまうのでやってはいけなくなります。revertが複数に渡る場合revertのコミットをrebaseしてからpushすると良いです。)

    なので本来masterはマージだけでコミットを進めて問題があったらマージのrevertを行うだけのブランチにした方がいいんですよね。

    すでにマージコミット以外をブランチにプッシュしてしまったけどロールバックしたい場合は本当はやってはいけないのですがpush -fで強制リポジトリ上書きでpushができます。

    ただし何かあった時に自分の責任取れない範囲では絶対にやらないようにしてください。前述のrevertか、後述のmasterにコミットを重ね継続させる方が良いです。

    旧masterのファイルを破棄したい場合は

    checkout (ブランチ名) (masterに上書きしたいファイル)

    で指定したブランチのファイルの状態を現在のブランチのファイルに上書きできるのでマスターブランチの不要なファイルを削除し、rollbackAのファイルをこれで移してコミットすれば、マスターはfowwordになりますがブランチrollbackAとファイルは同じ状態になります。次からはここからブランチ切って開発すると良いと思います。

    master側の一部ファイルを残したければ、rollbackAをマージして全上書きしたいファイルのみをcheckout --theirsで指定して、あとは競合解消したり、--oursで残すなど、で調整できます。

    キャンセル

  • 2017/05/16 23:55

    revertが便利な一方で、使いすぎもよくないのですね。勉強になりました。
    プッシュ後のロールバックにも気をつけます。

    みなさん無知な私に教えていただくのには、骨が折れたと思います。ありがとうございました!

    キャンセル

0

その状態でブランチを切ってコミットしてからrollbackAに切り替えて作業すれば良いかと思います。
rollbackAの方が気に入ったら、一旦masterをrollbackAにリセットしてmasterブランチをそちらに切り替える事ができるかと思います(push前ならですが)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/05/15 23:55

    回答ありがとうございます。
    試してみたところ、tkowさんに回答いただいた3段落目と似たような結果になったのですが、それまでのコミットをプッシュしていた場合、ローカルがbehindになってしまい、プッシュできなくなってしまいます。このような場合はどうすればいいのでしょうか?

    キャンセル

  • 2017/05/16 00:17

    一般的にはその状態になったら、外部に修正が公開されている状態なので戻したりしてはいけません。
    プライベートなレポジトリである場合や、共同作業をしているメンバーとのコンセンサスが取れているのなら、git push -f で上書きする事は出来ます。

    キャンセル

  • 2017/05/16 23:49

    そういう行為はやってはいけないのですね。勉強になりました!

    キャンセル

0

一般的か分かりませんが。例えば、
masterブランチに別のブランチ名(old/masterとか)を付けて、master自身は過去のコミットにリセットする
ようにすれば、masterで作業を進めていくことが出来ます。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/05/16 00:15

    回答ありがとうございます。

    キャンセル

0

単に rollbackA ブランチの内容を master にマージすればよいだけではないのかな?履歴を捨てたいの?どうして?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/05/16 00:19

    回答ありがとうございます。
    例えば、

    コミットC
    コミットB
    コミットA

    とあり、
    コミットCが直近のコミットで、コミットAまで戻りたいとします。コミットAまで戻り、新しいブランチ作り、そのブランチでのコミットをmasterにマージした場合、コミットB、コミットCの内容も戻ってきてしまいますよね?できればコミットB、Cの変更は戻ってきてほしくないのですが、こう思うのはやはりおかしいのでしょうか?
    コミットB、Cのコミットの履歴は残しつつ、マージするときにコミットBCの変更分は反映させたくないと感じです。

    キャンセル

  • 2017/05/16 00:46

    であれば、master側で git revert しておいてからマージするかな?

    キャンセル

  • 2017/05/16 23:48

    なるほど、スッキリしました!

    キャンセル

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

  • ただいまの回答率 87.95%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る