技術ログ

リベースでのコンフリクトを直そう - GIT

2019年10月25日

やりたいこと

下記のような状態から


(初期のmasterコミットはdevelopもmasterも持っている共通コミット)

         ↑ → develop01
         ↑
master01 → master02

developブランチを下記のようにしたい

 

master02がリベースしたコミット

 

つまり、masterの変更箇所をdevelopにリベースした(mergeと違って歴史が一本道に!)

 

master01 → master02 → develop01

 

ブランチの状態

masterブランチとdevelopブランチがある

$ gb
  develop
* master

コミットの状態

developブランチはmaster commit 02の変更を持っていなくて、masterブランチはdevelop commit 01の変更を持っていないことがわかる。masterブランチとdevelopブランチが共通して持ってるのはmaster commit 01だということがわかる。

develop

 
$ gl
commit 1e77143508f3abea4305f235db800eb45d7a686a
Author: hujisawa-ryosuke <vaaaval@gmail.com>
Date:   Wed Jul 5 13:49:27 2017 +0900

    develop commit 01

commit 3b35a163876cbec3feea6e0d91b61a40993399e7
Author: hujisawa-ryosuke <vaaaval@gmail.com>
Date:   Wed Jul 5 13:46:29 2017 +0900

    master commit 01
 

master

 
$ gl
commit 3b295d44151fdbc5f54d9d591bd2b658f411c312
Author: hujisawa-ryosuke <vaaaval@gmail.com>
Date:   Wed Jul 5 13:48:10 2017 +0900

    master commit 02

commit 3b35a163876cbec3feea6e0d91b61a40993399e7
Author: hujisawa-ryosuke <vaaaval@gmail.com>
Date:   Wed Jul 5 13:46:29 2017 +0900

    master commit 01
 

developとmasterのファイルの状態

masterブランチでの初期コミットを分岐点を界にdevelopとmasterで一回ずつコミットしてあって、コンフリクト状態

develop

 
$ cat sample.tex 
develop commit 01
master commit 01
 

master

 
$ cat sample.tex 
master commit 02
master commit 01
 

説明

masterブランチから分岐したdevelopブランチがあって、developブランチにチェックアウトして一回コミットしたあとにmasterブランチに戻って一回コミットすれば、当然rebaseするとコンフリクトを起こします。

$ gcd
Switched to branch 'develop'

developブランチに移動して、developに対して、masterの差分をリベースします。

 

だから、developブランチのファイルが変わります。

 

masterブランチのファイルは何も変わりません。

 

逆に、masterブランチに移動してmasterブランチに対してdevelopブランチをリベースすると、

 

developブランチの変更がmasterブランチに変更されるから、

 

developブランチは何も変わらず,masterブランチが変わることになります。

$ git rebase master
First, rewinding head to replay your work on top of it...
Applying: develop commit 01
Using index info to reconstruct a base tree...
M    sample.tex
Falling back to patching base and 3-way merge...
Auto-merging sample.tex
CONFLICT (content): Merge conflict in sample.tex
error: Failed to merge in the changes.
Patch failed at 0001 develop commit 01
The copy of the patch that failed is found in: .git/rebase-apply/patch

When you have resolved this problem, run "git rebase --continue".
If you prefer to skip this patch, run "git rebase --skip" instead.
To check out the original branch and stop rebasing, run "git rebase --abort".

コンフリクトの画面

<<<<<<< HEAD
master commit 02
=======
develop commit 01

>>>>>>> develop commit 01
master commit 01
二つのコミットを採用する

master commit 02
develop commit 01
master commit 01

git add

ここ、大切、手順を間違えるとうまくいかない

 

リベースの場合はコンフリクトを直したらaddしてコミットせずにリベースコンテニューする。

 

addしてコンテニュー

 

それからaddを忘れてコンテニューだけしてももうまくいかないし

 

addしたあとにcommitしてもうまくいかない

 

リベースの場合はコンフリクトを直したらaddしてリベースコンテニューする

 

$ git add sample.tex
$ git rebase --continue
Applying: develop commit 01

 

 

これで、masterの変更をdebelopに書き込んだ。今回は、masterとdevelopの変更を二つ採用した。

developの状態

master commit 02 
develop commit 01 
master commit 01

masterの状態

master commit 02 
master commit 01

参考

 

ここら辺の本を読んで、めっちゃ勉強になりました、ブログって簡単にわかるけど、深い部分で基礎が結構抜け落ちてたりするんだよね... 基礎の徹底は、良いエンジニアの基本なので、ここら辺を横着するか否かで将来のエンジニア人生も大きく変わる。なので、こういう本はしっかり読もうと思います。(お勧めなので、是非勝ってみればいいと思います :))

 

Gitで老ける。エンジニアの僕が勧めるGit入門本[2020年]

Pocket
LinkedIn にシェア

エンジニアにおすすめできる本

Card image cap
リーダブルコード

より良いコードを書くためのシンプルで実践的なテクニック

Card image cap
Webを支える技術

HTTP,URI,HTML,そしてREST

Card image cap
誰でもPythonで作れる

儲かるAIとソフトウェアの作り方

Card image cap
プログラマが知るべき97のこと

現場で使える実践哲学のマスターピース

Card image cap
情熱プログラマー

時代を超えて。ソフトウェア開発者の幸せな生き方

Card image cap
アジャイルサムライ

プログラミング達人開発者への道

Card image cap
Rubyを作った男 まつもとゆきひろ

コードの世界 スーパー・プログラマになる14の思考法

ご提供 sponsor
 

Meee!(ミー)は、ビジネスからプライベート利用まで、個人のスキルを気軽に売り買いできるスキルマーケットです。カテゴリや居住地から、検索することが可能です。

 

ランゲージエクスチェンジは、ネイティブスピーカーと気軽にマッチングできる言語交換プラットフォームです。あなたの地元に住む外国人を探したり、留学や海外移住の前に、現地のネイティブスピーカーと繋がることもできます!

宣伝
 

りょすけトークchは、仕事や私生活をより豊にするYouTubeチャンネルです。文献(本、映画、論文)から役に立つ情報をまとめ、生涯にわたり役に立つ哲学をお届けしています。是非、チャンネル登録してみてね

-技術ログ
-, , , ,

Copyright© offブログ! , 2021 All Rights Reserved Powered by AFFINGER5.