GitHub上でのコンフリクト解消時に起こりがちなミス!

2024.02.15

こんにちは、稲葉です。

突然ですが、皆さんはGitHubを利用していますか?おそらく、この記事を読んでくださっているほとんどの方が利用されていると思います。

GitHubは、開発者達にとって欠かせないツールであり、多くのプロジェクトでコードのバージョン管理と共同作業のために使用されています。しかし、複数の開発者が同時にコードベースに変更を加えていると、コンフリクト(衝突)が起きることは避けられません。これを解消する過程で、特に初心者や慣れていない開発者(自分のような)は、しばしば避けられたはずのミスを犯してしまいます。

そこで、これらの問題を共有し、他の開発者さんが同じミスをしないように、この記事を書くことにしました。この記事で少しでも貢献できればと考えています。

前提

この記事を読み進めていただくために、まず前提となる状況を共有したいと思います。

今回は以下の状況での話をします。

develop」から新機能を開発するための「feature」ブランチを作成し、そこで作業を進めているという状況です。その作業中に、「develop」ブランチに更新が入りました。「feature」ブランチに「develop」ブランチの最新の変更を取り込む必要が出てきたため、プルリクエスト(PR)を作成したと言う状況です。

出てくるファイル

  • test1ファイル:developfeature両方に存在するTextファイル
  • test2ファイル:featureにのみ存在するTextファイル

developブランチの状況

test1ファイル中身(更新前):

mainの修正

developの修正

test1ファイル中身(更新後):

mainの修正

developの修正
新しいdevelopの修正

featureブランチの状況

test1ファイル中身:

mainの修正

developの修正

feat/testの修正

test2ファイル中身:

コミット1
コミット2
コミット3

コンフリクト解消時のミス

上記の更新後のdevelopブランチからfeatureブランチ(ここではfeat/test)に対して、PRを作成します。

そうすると以下のように、コンフリクトをtest1ファイルで起こします。

「Resolve conflicts」を押すと、具体的なコンフリクト箇所を教えてくれると同時にGitHub上で解消することができます。

今回は「新しいdevelopの修正」と「feat/testの修正」両方を取り込みたいので、以下のようにしてresolvedしました。

mainの修正

developの修正

新しいdevelopの修正

feat/testの修正

resolved後、「Merge branch 'feat/test' into develop」と言うコミットが追加されました。

 

ここでミスをしました。(ここでのミスは自分の意図とは異なる結果が生じてしまった事を指します) feat/testブランチの修正も取り込むと言うことは、developブランチにこの修正を取り込むと言うことになります。 ここまでは意図した結果です。

ただ、私はコンフリクトを解消したファイルの変更分だけを取り込むと誤解していました。

先ほどのコミットを取り込むとdevelopブランチに本来取り込みたくないfeat/testブランチ全てのコミットを取り込みます!

結果、developブランチは以下のような状態になりました。(意図していない結果)

(*test2ファイルfeat/testブランチにのみ存在していたファイルです)

まとめ

この記事では、GitHubを用いた開発プロセス中によく遭遇するコンフリクト解消の状況と、その際に発生したミスについて書きました。 知識が足りずに意図しない結果になってしまいましたが、知っていれば回避できた問題でした。

この問題に関しては、当たり前ですがどうような動作をするか知っている事解決策の1つになると思いました。

そのため、この記事が、同様のミスを減らすきっかけになれば幸いです。

最後まで、読んでくださりありがとうございました。