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

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

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

SourceTreeは、Gitのクライアントツール。視覚的に操作するGUI形式でGitの操作が容易になります。MacやWindowsなどのOSに依存しておらず、PC環境に合わせてインストールすることが可能です。

Git

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

GitHub

GitHubは、Gitバージョン管理システムを利用したソフトウェア開発向けの共有ウェブサービスです。GitHub商用プランおよびオープンソースプロジェクト向けの無料アカウントを提供しています。

BitBucket

BitBucketは無料のリポジトリ管理ホスティングサービスです。 MercurialとGitのVCSに対応しています。プライベートリポジトリを、制限なく作成することが可能です。

Q&A

解決済

4回答

12351閲覧

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

monokuro

総合スコア33

SourceTree

SourceTreeは、Gitのクライアントツール。視覚的に操作するGUI形式でGitの操作が容易になります。MacやWindowsなどのOSに依存しておらず、PC環境に合わせてインストールすることが可能です。

Git

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

GitHub

GitHubは、Gitバージョン管理システムを利用したソフトウェア開発向けの共有ウェブサービスです。GitHub商用プランおよびオープンソースプロジェクト向けの無料アカウントを提供しています。

BitBucket

BitBucketは無料のリポジトリ管理ホスティングサービスです。 MercurialとGitのVCSに対応しています。プライベートリポジトリを、制限なく作成することが可能です。

1グッド

3クリップ

投稿2017/05/15 13:34

編集2017/05/15 13:36

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

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

sinono10👍を押しています

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

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

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

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

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

guest

回答4

0

ベストアンサー

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

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

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

投稿2017/05/15 14:04

編集2017/05/15 14:10
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

monokuro

2017/05/15 14:51

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

2017/05/15 14:51

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

退会済みユーザー

2017/05/15 19:09 編集

そういった場合は本来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で残すなど、で調整できます。
monokuro

2017/05/16 14:55

revertが便利な一方で、使いすぎもよくないのですね。勉強になりました。 プッシュ後のロールバックにも気をつけます。 みなさん無知な私に教えていただくのには、骨が折れたと思います。ありがとうございました!
guest

0

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

投稿2017/05/15 15:06

koko_u

総合スコア936

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

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

monokuro

2017/05/15 15:19

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

2017/05/15 15:46

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

2017/05/16 14:48

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

0

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

投稿2017/05/15 13:54

編集2017/05/15 14:27
aquaS

総合スコア191

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

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

monokuro

2017/05/15 15:15

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

0

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

投稿2017/05/15 13:44

yoorwm

総合スコア1305

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

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

monokuro

2017/05/15 14:55

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

2017/05/15 15:17

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

2017/05/16 14:49

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問