ホーム 技術ネタ

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

はじめに

みなさんこんにちわ!offブロのhujisawaです^^

 

Gitっていうのはプログラマーにとって最初に立ちはだかる高い壁になります

 

現場でやらかすとだいぶ微妙な立場に追いやられ

 

かなりしんどいことになります

 

コンフリクトは、普通に慣れてしまえば

 

よくあるよねって感じになってくるのですが

 

最初はまじで焦ります笑 今日はそんなGitでコンフリクトした時の

 

解決方法を書いていきたいと思います

 

参考に使ったGitの本はこちら

 

既にGitは理解してるけど、たまに詰まることあるよねって人へおススメのポケリファ本です

 

デスクの恋人w

Gitポケットリファレンス改訂新版 (Pocket reference) [ 岡本隆史 ]

さて

やりたいこと

下記のような状態から


(初期の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ポケットリファレンス改訂新版 (Pocket reference) [ 岡本隆史 ]

Pocket
LinkedIn にシェア



新規webサービスの開発の依頼ならoffテク⭐️

低コストで、Reactなどモダン言語での新規webサービス開発を承ります

-ホーム, 技術ネタ
-, , , ,

Copyright© off , 2020 All Rights Reserved Powered by AFFINGER5.