😽 yumenomatayume.log

GitHub Fork したリポジトリで sync fork しようとしたらコンフリクトする時の解消法

Fork したリポジトリで個人向けの開発をしていた

以前ブログの開設記事を投稿したときに、ソースコードは本家 GitHub リポジトリから Fork していると書きました。

本家の更新(コミット)を自身のリポジトリにも簡単に適用したかったからです。

「簡単に」ということですが、GitHub には sync fork という機能があり、これをクリックするだけで Fork 元の変更を取り入れることができます。

しかしながら、sync fork の実態は自身のリポジトリに本家の更新をマージするという処理が行われているようなので、当然コンフリクトが発生するケースがあります。

コンフリクトが発生すると、sync fork をクリックしたときに以下のような警告画面が出ます。

画像が読み込まれない場合はページを更新してみてください。
Discard commit すると、これまでのコミット履歴が全て消えて、Fork 元のコミットに上書きされるので、気安くクリックしないようにしましょう。

これを知らずに Discard commit してしまいめちゃくちゃ焦りました 💦

結果的に、ローカルリポジトリが残っていたので git push origin main -f を実行して、無理やり GitHub の方を上書きました。(危なかった💦)

コンフリクトした時の対処法
💡
本家リポジトリから自身のリポジトリにプルリクを出す

プルリクを出した後に、コンフリクトした箇所を手作業で修正しましょう。

GitHub 上で行う場合

具体的には、commits behindをクリックすると、本家から取り込まれていないコミット一覧の画面にいきます。

画像が読み込まれない場合はページを更新してみてください。

その画面にある、Create pull request からだと、楽に作成できると思います。

画像が読み込まれない場合はページを更新してみてください。

作成されたプルリクを見てみると、ブラウザ上からはマージできないようです🤣

画像が読み込まれない場合はページを更新してみてください。

基本は上記に表示されたコマンド通りに進めていく流れになりますが、私なりのやり方は以下の通りです。

ローカルリポジトリで行う場合

git remote が適切に設定されていることを確認します。

origin自身のリポジトリ
upstreamFork 元リポジトリ
❯ git remote -v
origin  ssh://git@github.com/ymmmtym/easy-notion-blog.git (fetch)
origin  ssh://git@github.com/ymmmtym/easy-notion-blog.git (push)
upstream        ssh://git@github.com/otoyo/easy-notion-blog.git (fetch)
upstream        ssh://git@github.com/otoyo/easy-notion-blog.git (push)

git pull origin main
git switch -c sync-fork
git pull upstream main

いくつかのコンフリクトが発生しました。

❯ git pull upstream main
Warning: Permanently added 'github.com' (ED25519) to the list of known hosts.
remote: Enumerating objects: 434, done.
remote: Counting objects: 100% (331/331), done.
remote: Compressing objects: 100% (125/125), done.
remote: Total 434 (delta 189), reused 311 (delta 184), pack-reused 103
Receiving objects: 100% (434/434), 97.94 KiB | 301.00 KiB/s, done.
Resolving deltas: 100% (207/207), completed with 21 local objects.
From ssh://github.com/otoyo/easy-notion-blog
 * branch            main       -> FETCH_HEAD
   48add50..60e456c  main       -> upstream/main
CONFLICT (modify/delete): __tests__/pages/__snapshots__/index.test.tsx.snap deleted in 60e456c178cc1f55e9b401d994d2af59b350126a and modified in HEAD.  Version HEAD of __tests__/pages/__snapshots__/index.test.tsx.snap left in tree.
CONFLICT (modify/delete): __tests__/pages/blog/__snapshots__/[slug].test.tsx.snap deleted in 60e456c178cc1f55e9b401d994d2af59b350126a and modified in HEAD.  Version HEAD of __tests__/pages/blog/__snapshots__/[slug].test.tsx.snap left in tree.
CONFLICT (file location): src/components/like-button.tsx added in HEAD inside a directory that was renamed in 60e456c178cc1f55e9b401d994d2af59b350126a, suggesting it should perhaps be moved to components/like-button.tsx.
Auto-merging lib/notion/client.ts
Auto-merging lib/notion/interfaces.ts
Auto-merging next.config.js
CONFLICT (content): Merge conflict in next.config.js
CONFLICT (file location): src/pages/api/feed.ts added in HEAD inside a directory that was renamed in 60e456c178cc1f55e9b401d994d2af59b350126a, suggesting it should perhaps be moved to pages/api/feed.ts.
CONFLICT (file location): src/pages/api/like.ts added in HEAD inside a directory that was renamed in 60e456c178cc1f55e9b401d994d2af59b350126a, suggesting it should perhaps be moved to pages/api/like.ts.
CONFLICT (modify/delete): src/components/document-head.tsx deleted in 60e456c178cc1f55e9b401d994d2af59b350126a and modified in HEAD.  Version HEAD of src/components/document-head.tsx left in tree.
CONFLICT (modify/delete): src/pages/blog/[slug].tsx deleted in 60e456c178cc1f55e9b401d994d2af59b350126a and modified in HEAD.  Version HEAD of src/pages/blog/[slug].tsx left in tree.
CONFLICT (modify/delete): src/pages/index.tsx deleted in 60e456c178cc1f55e9b401d994d2af59b350126a and modified in HEAD.  Version HEAD of src/pages/index.tsx left in tree.
Automatic merge failed; fix conflicts and then commit the result.

これらをローカルでいい感じに編集して、自分のリポジトリの main ブランチに push して更新完了です。

👍