DUICUO

面接官: Git の競合が発生するシナリオを説明してください。どのように解決しますか?

[[418175]]

この記事は、WeChat公式アカウント「JS日语問」(著者:慧慧)からの転載です。転載の許可については、「JS日语問」公式アカウントまでお問い合わせください。

I. それは何ですか?

一般的に、競合が発生するシナリオは次のとおりです。

  • 複数のブランチのコードを1つのブランチにマージする場合
  • 複数のブランチから同じリモートブランチにプッシュする

具体的には、複数のブランチが同じファイルを(どこでも)変更したか、複数のブランチが同じファイルの名前を変更したことを意味します。

2 つのブランチが異なるファイルの一部を変更する場合、競合は発生しないため、単純にマージすることができます。

コマンドの使用において、push、pull、stash、rebaseなどのコマンドで競合が発生する可能性があります。基本的に、これらの競合はマージとパッチのプロセス中に発生します。

II. 分析

ローカル マスター パーティションに a.txt という名前のファイルを作成し、次のように「master commit」でファイルを開始します。

次に、リポジトリに送信します。

  • git で.txt を追加する
  • git commit -m 'マスターの最初のコミット'

新しいブランチ featurel1 を作成し、次のように切り替えます。

  1. git チェックアウト -b featurel1

次に、a.txt ファイルの最初の行を「featurel commit」に変更し、ステージング領域に追加して、リポジトリへのコミットを開始します。

  • git で.txt を追加する
  • git commit -m '機能の最初の変更'

次に、`git checkout master` を使用してマスター ブランチに切り替え、`git merge` を使用してブランチをマージしたところ、競合がないことがわかりました。

この時点で、a.txt ファイルの内容は機能コミットとなり、競合は発生しません。これは、Git が内部的に高速マージを実行したためです。

現在のブランチのすべてのコミットが別のブランチにすでに存在する場合、Git は「早送り」操作を実行します。

Git は新しいコミットを作成せず、現在のブランチをマージされたブランチにポイントするだけです。

この時点で feature1 ブランチに切り替えて、ファイル コンテンツを feature2 コミットに変更し、ローカル リポジトリにコミットすると...

次にメインブランチに切り替えます。この時点でa.txtファイルを再度変更する場合は、「master second commit」に変更し、ローカルリポジトリに再度コミットします。

この時点で、master ブランチと feature1 ブランチの両方に新しいコミットがあり、次の図のようになります。

このような状況では、クイックマージは不可能です。唯一の選択肢は、個々の変更をマージすることですが、このマージによって競合が発生する可能性があります。

次に、以下に示すように、`git merge featurel` を使用してブランチをマージします。

競合情報によると、a.txt には競合があり、コミットする前に手動で競合を解決する必要があります。

`git status` コマンドは競合しているファイルについても知らせてくれます。

a.txt ファイルを開くと、次の内容が表示されます。

Git は、異なるブランチの内容をマークするために <<<<<<<、======、>>>>>>> を使用します。

  • <<<<<<< と ======= の間の領域が変更されたコンテンツです。
  • ======= と >>>>>> の間の領域は、渡されて変更されたコンテンツです。

次のステップは、競合しているファイルに変更を加え、`git add` コマンドを使用して各ファイルを解決済みとしてマークすることです。これらの競合していたファイルがステージングされると、Git はそれらを解決済みとしてマークし、変更をコミットします。

  • git で.txt を追加する
  • git commit -m "競合が修正されました"

この時点で、master ブランチと feature1 ブランチは次の図のようになります。

マージ情報は `git log` コマンドを使用して表示できます。

III. 要約

Git がブランチを自動的にマージできない場合は、まず競合を解決してからコミットしてマージする必要があります。

競合を解決するには、Git でマージに失敗したファイルを目的の内容に手動で編集し、コミットする必要があります。

参考文献

  • https://www.liaoxuefeng.com/wiki/896043488029600/900004111093344
  • https://vue3js.cn/インタビュー