カクカクしかじか

技術的なアレコレ

git rebaseでコンフリクトした際の対処法

経緯

毎回コンフリクトする度に調べているので、いい加減覚えようと...

rebase

※ 使用中のシェルによってブランチの表示が異なるので注意:自分は fishシェル を使用
※ fishシェルが気になる方は brew install fish を実行し、fishというコマンドをターミナルに打つと起動するのでお試しあれ!(Macの場合)

rebase の説明

指定したブランチを現在の作業ブランチのコミットの下にして、
現在のブランチのコミットをその上に積むコマンド
(実行後は元のコミット番号が変わってしまうので複数人で同じブランチをいじる際は注意が必要)

# この場合はmasterブランチを作業ブランチの下に敷き直す

~/アプリディレクトリ名 (ブランチ名|✔︎) $ git rebase master



コンフリクト発生



git diffでコンフリクトしている部分を確認

~/アプリディレクトリ名 (ブランチ名|REBASE 153/239|●611) $ git diff

# 下にコンフリクトした差分が表示される
# ++<< HEADというところから >>>の部分までが修正差分が競合している箇所

diff --cc app/views/hoge/hoge.html.erb
index 28666ad881,235c56e9bf..0000000000
--- a/app/views/hoge/hoge.html.erb
+++ b/app/views/hoge/hoge.html.erb
@@@ -250,7 -250,7 +250,11 @@@
              </dl>
            </div>
            <p class="hoge">
++<<<<<<< HEAD   # 上が自分の環境の変更
 +            <a href="https://hogefuga.com/jc/ja/search?query=FUGABAR" target="_blank">もっと見る</a>
++======= # 下がrebaseしようとしたブランチ側の変更
+             <a href="https://hogefuga.com/jc/ja/search?query=HOGEBAR" target="_blank">もっと見る</a>
++>>>>>>> リンク先を変更
            </p>
          </section>
コンフリクト部分の修正手順

「コンフリクトが発生する」 → 「コンフリクトを修正する」→「git add .」 → 「git rebase --continue」を繰り返す

git add .

git rebase --continue

# 差分がない表示になれば、rebase成功
~/アプリディレクトリ名 (ブランチ名|✔︎) $ 

おまけ

cherry-pick

cherry-pick の説明

特定のブランチのコミットだけを切り出して、
別のブランチのコミットにすることが出来るコマンド

# コミットを抜き取りたいブランチで取得したいコミットのコミット番号確認
~/アプリディレクトリ名 (ブランチA |✔︎) $ git log

コミット番号やコミットメッセージなどが出力される(省略)

# 抜き出したコミットを反映したいブランチに移動する
~/アプリディレクトリ名 (ブランチA |✔︎) $ git checkout ブランチB

# コミットログで見たコミット番号を指定する
~/アプリディレクトリ名 (ブランチB |✔︎) $ git cherry-pick d0e0112cedab680f408cfc63449494d0ec52f682

# fishシェル上だと ↑1 と表示されるので、コミットが1つ積まれたことが確認出来ます
~/アプリディレクトリ名 (ブランチB1 |✔︎)