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

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

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

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Git

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

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

1回答

4678閲覧

gitのブランチの異なるコミットを整理したい。

helo

総合スコア36

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Git

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

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2020/02/13 07:21

前提・実現したいこと

Ruby on Railsチュートリアルを進めているのですが、
git merge が何度となく失敗し、マージできないファイルが数個出てしまいます。
全く前に進めなくて困っています。このような場合はどう対処すれば良いのでしょうか。詳しい方いらっしゃいましたらアドバイス頂けないでしょうか。
よろしくお願いします。

発生している問題・エラーメッセージ

$ git status On branch master Your branch and 'origin/master' have diverged, and have 1 and 1 different commits each, respectively. (use "git pull" to merge the remote branch into yours) nothing to commit, working tree clean

該当のソースコード

試したこと

git reset --hard
等行いましたが、改善にならず、git clean -f でコミットしたものを消したのですが、ブランチマスター上にブランチとオリジン/マスターが分岐しどちらにも違うコミットが残ってしまっているのが問題なのではと思っています。

補足情報(FW/ツールのバージョン

Windows 10

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

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

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

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

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

hoshi-takanori

2020/02/13 07:34

差し支えなければ、git log --graph --oneline の結果を貼り付けていただけませんか?
helo

2020/02/13 11:35

hoshi-takanori様 コメントありがとうございます。以下が掲載いたします。 よろしくお願いします。 $ git log --graph --oneline * b3c1ea4 (HEAD -> master) Add a full_title helper * d7a405c Complete advanced setup * 592d781 (static-pages) Finish static pages * 82cb5b9 (origin/static-pages) Add a Static Pages controller * 81963a7 Add hello * 50f4e2e Improve the README * 293096f Initialize repository
hoshi-takanori

2020/02/13 12:19

ごめんなさい、--all も必要でした。お手数ですが、git log --graph --oneline --all の結果をお願いします。(遠隔で git を教えるのって難しすぎる…。)
hoshi-takanori

2020/02/13 12:29

というか、have 1 and 1 different commits なので origin/master は d7a405c で分岐して 1 回 commit してるだけですね。origin/master 側の修正って何をどうやってしましたか? また、origin は github という理解でよろしいでしょうか?
helo

2020/02/13 12:54

ありがとうございます。以下です。 $ git log --graph --oneline --all * 6b32b95 (filling-in-re-layout) Finish layout and routes * b3c1ea4 (HEAD -> master) Add a full_title helper | * d80cf26 (filling-in-leyout) Finish layout and routes | * f8e15a5 (origin/master, heroku/master, rails-flavored-ruby) Add a full_title helper |/ * d7a405c Complete advanced setup * 592d781 (static-pages) Finish static pages * 82cb5b9 (origin/static-pages) Add a Static Pages controller * 81963a7 Add hello * 50f4e2e Improve the README * 293096f Initialize repository 1回コミットした状態になっているのですが、git add → git commit → chekuout master → git mergeを普通にやったのですが 必ずmergeの際に、mergeされないファイルが出てしまい、これまでは何とかgit clean -fでコンフリクトしてるファイルを消してやっていたのですが 今回は全くダメでして、git resetもしての現状になっています。 いまは、Railsディレクトリは、ひとつ前に戻ってしまい、作成したファイルが全て消えた状態です。mergeには困っています・・。
hoshi-takanori

2020/02/13 13:45

お疲れさまです。なかなか複雑な状況になってますね。コミットメッセージから推測するに、origin/master (f8e15a5) と master (b3c1ea4) および filling-in-leyout (d80cf26) と filling-in-re-layout (6b32b95) は並行して同じような作業をされたのでしょうか。どちらかのブランチを捨ててしまって大丈夫なのであれば、origin/master や heroku/master がある方を選んで master を捨てるという手もあります。
helo

2020/02/13 13:53

ありがとうございます。 仰られるように、mergeが上手く行かなかったもので2回ほどやり直しております。 filling-in-leyout (d80cf26)がmergeできれば、最高なのですがその後解らぬままに色々とgitコマンドをやってしまい、現状となっております・・。Herokuには順次アップしていっているのですが masterを捨てるというのは大丈夫なのでしょうか?
hoshi-takanori

2020/02/13 14:00

捨てると言っても、完全に消すわけではなく、単に不採用にするというだけで、履歴は残りますので、あとで部品取りに使うこともできます。状況がだいぶ見えてきたので回答を書こうと思います。ちなみに、今回の作業の目的は Rails の勉強と git の練習のどちらでしょうか? また、開発環境(IDE またはエディタ、git の GUI ツール、git コマンドの実行環境)はどんな感じで作業されてますか?
helo

2020/02/13 14:15

ありがとうございます。 今回は、gitです。このmergeで失敗することが無いようにしたいのと、失敗した際の対処方法を学びたいと思っております。開発環境は、Windows 10、エディタはatomになります。ターミナルはgit bashです。 これでよろしいでしょうか? よろしくお願い致します。
hoshi-takanori

2020/02/13 14:37

さらにお手数ですが、git branch -avv の結果を貼ってもらってもいいですか?
helo

2020/02/13 14:42

お送りいたします。よろしくお願いします。 $ git branch -avv   * filling-in-layout b3c1ea4 Add a full_title helper filling-in-leyout d80cf26 Finish layout and routes filling-in-re-layout 6b32b95 Finish layout and routes master b3c1ea4 [origin/master: ahead 1, behind 1] Add a full_title helper rails-flavored-ruby f8e15a5 Add a full_title helper static-pages 592d781 [origin/static-pages: ahead 1] Finish static pages remotes/heroku/master f8e15a5 Add a full_title helper remotes/origin/master f8e15a5 Add a full_title helper remotes/origin/static-pages 82cb5b9 Add a Static Pages controller
helo

2020/02/13 14:44

お送りいたします。よろしくお願いします。 $ git branch -avv * filling-in-layout b3c1ea4 Add a full_title helper filling-in-leyout d80cf26 Finish layout and routes filling-in-re-layout 6b32b95 Finish layout and routes master b3c1ea4 [origin/master: ahead 1, behind 1] Add a full_title helper rails-flavored-ruby f8e15a5 Add a full_title helper static-pages 592d781 [origin/static-pages: ahead 1] Finish static pages remotes/heroku/master f8e15a5 Add a full_title helper remotes/origin/master f8e15a5 Add a full_title helper remotes/origin/static-pages 82cb5b9 Add a Static Pages controller
hoshi-takanori

2020/02/13 15:01

あれ、新しいブランチがありますね。のんびり書いてる場合じゃなかった。(あせ)
helo

2020/02/14 14:10

hoshi-takanori様 ありがとうございます。 この新しいブランチは、3回目のコーディングに着手しかかっていたものです。 問題がきちんと把握できてない中、やり直したら上手く行かないか?と思ってやってしまったものです。 情けないです・・・。 回答を確認させていただきました。大変丁寧に記述頂いていてびっくり致しました。もの凄く分かり易すいので大変ありがたいです。自分自身まだgitをきちんと理解できていないのが良く分かりました。 良い勉強をさせていただきました。ありがとうございます。 兎に角、これでやってみます!
guest

回答1

0

ベストアンサー

現在のブランチの状況は

$ git log --graph --oneline --all * 6b32b95 (filling-in-re-layout) Finish layout and routes * b3c1ea4 (HEAD -> master) Add a full_title helper | * d80cf26 (filling-in-leyout) Finish layout and routes | * f8e15a5 (origin/master, heroku/master, rails-flavored-ruby) Add a full_title helper |/ * d7a405c Complete advanced setup * 592d781 (static-pages) Finish static pages * 82cb5b9 (origin/static-pages) Add a Static Pages controller * 81963a7 Add hello * 50f4e2e Improve the README * 293096f Initialize repository

ということで、d7a405c から二つに分かれて同じような作業を行ったと理解しました。

git の merge というのは、二つのブランチで別々の作業(例えば、片方はバグ修正、もう片方は新機能の追加)を行なったような場合に、両方の変更を取り込むために行うものです。別々の作業といっても同じ箇所に変更を加えてしまう場合があり(例えば、バグ修正のために修正した関数に新機能を追加したなど)、merge の際にコンフリクトが発生するのはよくあることなので、世間に出回っているコンフリクト解消のための記事にはそういう前提で書かれているものが多いと思います。

一方、両方のブランチで同じような変更を行った場合、変更のほとんどがコンフリクトしてしまいます。それらを merge することももちろん可能ですが、同じような変更をわざわざ merge する意味はあまりないと思います。そういう場合は、変更内容を確認した上で、片方のブランチを捨てる(不採用にする)という手もあると思います。

さて、現在のブランチの状況はこのように二つの枝分かれがあります。

+--- f8e15a5 (origin/master) --- d80cf26 (filling-in-leyout) / --- d7a405c + \ +--- b3c1ea4 (master) --- 6b32b95 (filling-in-re-layout)

それぞれのコミットにおける変更内容を確認しましょう。
(f8e15a5 などの代わりに origin/master などで指定することもできます。)

$ git diff d7a405c..f8e15a5 (共通の親から f8e15a5 (origin/master) への変更内容) $ git diff f8e15a5..d80cf26 (f8e15a5 (origin/master) から d80cf26 (filling-in-leyout) への変更内容) $ git diff d7a405c..b3c1ea4 (共通の親から b3c1ea4 (master, HEAD) への変更内容) $ git diff b3c1ea4..6b32b95 (b3c1ea4 (master) から 6b32b95 (filling-in-re-layout) への変更内容)

diff の見方ですが、行の先頭に - がついて赤く表示された行が削除または変更された行、+ がついて緑で表示された行が追加または変更後の行になります。

また、二つのブランチの違いを表示するにはこうします。

$ git diff f8e15a5..b3c1ea4 (f8e15a5 (origin/master) と b3c1ea4 (HEAD -> master) の違い) $ git diff f8e15a5..d80cf26 (d80cf26 (filling-in-leyout) と 6b32b95 (filling-in-re-layout) の違い)

これらがほとんど同じなら、どちらの枝分かれを採用しても良いと思われます。

ここで、現在の master があるブランチ (b3c1ea4, 6b32b95) を不採用にして、origin/master 側 (f8e15a5, d80cf26) を採用するとしましょう。例えば以下のようにします。(git は同じ結果になる方法が複数あるので、これは一例です。)

$ git checkout master (master ブランチを操作するので、master ブランチに切り替えます。) $ git reset --hard HEAD^ (master ブランチの現在位置を b3c1ea4 から d7a405c に移動します。) (なお、--hard オプションは作業ディレクトに内容も d7a405c のものに変更するという意味です。) $ git merge --ff-only origin/master (master ブランチに origin/master の変更内容を取り込みます。) (master ブランチは origin/master の祖先なので、master ブランチが origin/master の位置に移動するはず。) $ git merge --ff-only filling-in-re-layout (master ブランチに filling-in-re-layout の変更内容を取り込みます。) (master ブランチは filling-in-re-layout の祖先なので、master ブランチが filling-in-re-layout の位置に移動するはず。)

git merge は枝分かれした二つのブランチの変更内容をマージするのが本来の使い方ですが、枝分かれしてない場合に先行しているブランチに追いつくためにも使えます。その際、間違って新たにマージコミットを作らないように --ff-only オプションをつけています。
(すでに状況が変わってるようですが、基本的な考え方がわかれば応用できると思います。)

別の方法としては、master ブランチを一旦消して新たな位置に作り直したり、master ブランチを別の名前にして、別のブランチの名前を master に変更こともできますが、危険な香りがする(実際はそれほど危険ではありませんが)ので今回はやめておきます。


また、git branch でブランチを一覧表示できます。自分はよく -avv オプションをつけます。

$ git branch -avv * filling-in-layout b3c1ea4 Add a full_title helper filling-in-leyout d80cf26 Finish layout and routes filling-in-re-layout 6b32b95 Finish layout and routes master b3c1ea4 [origin/master: ahead 1, behind 1] Add a full_title helper rails-flavored-ruby f8e15a5 Add a full_title helper static-pages 592d781 [origin/static-pages: ahead 1] Finish static pages remotes/heroku/master f8e15a5 Add a full_title helper remotes/origin/master f8e15a5 Add a full_title helper remotes/origin/static-pages 82cb5b9 Add a Static Pages controller

remotes/ で始まるブランチはリモートブランチ、それ以外はローカルブランチです。自分が今いるブランチは * がついてます。また、[origin/master: ahead 1, behind 1] はリモートブランチに対応したブランチ、ahead はローカルが先行、behind はリモートが先行していることを意味します。ここで、ahead であれば git push、behind であれば git pull を行えば同期できますが、問題は両方ある場合で、まず git pull してリモートの変更内容を取り込んで(コンフリクトした場合はそれを解消して)から git push することになります。

ブランチは消さない限り残ってますので、不採用にしたブランチでもいつでも内容を確認できますし、チェックアウトして作業を再開することもできます。

投稿2020/02/13 15:12

編集2020/02/13 15:47
hoshi-takanori

総合スコア7895

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

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

helo

2020/02/15 01:17

hoshi-takanori様 ご回答ありがとうございました。記述頂きました方法でやってみました。 一先ず、filling-in-re-layoutのほうになってしまったですが、マージは成功しました。ありがとうございます。 そのあとpushすると以下の表記が出てまた立ち往生してしまいました。。。 $ git push To bitbucket.org:satoshi_toto/sample_app.git ! [rejected] master -> master (non-fast-forward) error: failed to push some refs to 'git@bitbucket.org:satoshi_toto/sample_app.git' hint: Updates were rejected because the tip of your current branch is behind hint: its remote counterpart. Integrate the remote changes (e.g. hint: 'git pull ...') before pushing again. hint: See the 'Note about fast-forwards' in 'git push --help' for details. その後、pullをしたら、以下の表記になりましたので Auto-merging test/controllers/static_pages_controller_test.rb CONFLICT (content): Merge conflict in test/controllers/static_pages_controller_test.rb Auto-merging app/views/static_pages/home.html.erb CONFLICT (content): Merge conflict in app/views/static_pages/home.html.erb Auto-merging app/views/layouts/application.html.erb CONFLICT (content): Merge conflict in app/views/layouts/application.html.erb Automatic merge failed; fix conflicts and then commit the result. コンフリクトを起こしているファイルをツリー上でrmしたのですが エラーが出てしまいました。 $ git pull error: Pulling is not possible because you have unmerged files. hint: Fix them up in the work tree, and then use 'git add/rm <file>' hint: as appropriate to mark resolution and make a commit. fatal: Exiting because of an unresolved conflict. アドバイス頂いたように進んでいるのかも自分自身定かでは無く、行き詰まってしまいました。マージ後で何か間違ったコマンドをやってしまったいるでしょうか・・・。
helo

2020/02/15 02:55

hoshi-takanori様 その後、コンフリクトファイルを何度もaddしてmergeしていき都度、vimで悪戦苦闘しましたが、何とか無事にgit push → herokuへもpushできました。本当にありがとうございました。 今後は、mergeの際のコンフリクトも恐れないでやって行けそうです。 本当に、ご丁寧な解説とアドバイスをいただきまして大変感謝いたします。 またチュートリアルを頑張って参ります。 それでは失礼いたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問