はじめに
git merge
コマンドは、寄稿者がブランチからプロジェクトに追加するのに役立ちます。この概念は、共同プログラミングの中心的なアイデアの1つであり、複数の人が競合することなくコードの一部で作業できるようにします。
複数の寄稿者がコードの同じ部分で作業したり、多数のブランチで作業したりすると、マージの競合が必ず発生します。 git merge
の主な目標 解決または警告することです これらの競合について自動的に。
このガイドでは、マージの競合とは何かを説明し、自動的に解決されない場合の解決策を提供します。この記事では、Gitマージの競合を防ぐための役立つヒントも提供しています。
前提条件
- Gitがインストールおよび構成されている(Windows、Mac、Ubuntuの場合)。
- ローカルブランチとリモートブランチ間のgitマージの競合。
- 端末またはコマンドラインへのアクセス
- チュートリアル用のVimエディター(Vimをインストールするには、ガイドの1つに従ってください:Ubuntu18.04にVim8.2をインストールする方法またはCentOS7にVim8.2をインストールする方法)
Gitマージの競合とは何ですか?
Gitなどのバージョン管理システムを使用する場合、ほとんどのマージの競合は自動的に解決されます。ただし、 git merge
の状況があります 問題を解決できません。
マージの競合の例は次のとおりです。
- ファイル内の同じコード行を変更する。
- 別の場所で変更が行われている間のファイルの削除。
問題はローカルで発生し、残りのプロジェクトメンバーは問題に気付いていないため、競合の解決は優先度が高く、早急な修正が必要です。
Gitマージの競合の種類
マージの競合の一般的なタイプは、問題がいつ発生するかによって異なります。競合は次のいずれかで発生します:
- マージする前 、最新ではないローカルの変更があることを示します。問題を回避するために、マージが開始される前に競合エラーメッセージが表示されます。
- マージ中 、上書きの問題を示します。エラーメッセージが表示され、変更が上書きされないようにマージプロセスが停止します。
Gitでのマージの競合を解決する方法
3つの方法があります Gitでのマージの競合を解決するには:
1.ローカルバージョンを受け入れる 。ローカルバージョンからのファイルに対するすべての変更を受け入れるには、次のコマンドを実行します。
git checkout --ours <file name>
または、すべてのローカルバージョンを受け入れる 競合するファイルについては、以下を使用してください:
git merge --strategy-option ours
2.リモートバージョンを受け入れる 。リモートブランチからファイルの変更を更新するには、次のコマンドを実行します。
git checkout --theirs <file name>
すべてのリモートバージョンを受け入れる 競合するファイル:
git merge --strategy-option theirs
3.変更を個別に確認する 。最後のオプションは、各変更を個別に確認することです。このオプションは、特に複数のファイルやユーザーを操作する場合に最適な方法でもあります。この仕事をより管理しやすくするために、特別なツールを使用して、個々の対立を確認するのに役立ててください。
最終的に、コードのどの部分を残し、どの部分を残さないかの選択は、現在のプロジェクトに対する開発者の決定に依存します。
Gitでのマージ競合の取得
コマンドgit merge
の場合、Gitでのマージの競合が発生します エラーをスローします。
エラーメッセージは、競合が存在する場所に関する情報を出力します。エラーメッセージからファイルを確認し、マージの競合が発生した内容を確認します。
Gitは、競合するコード行の横に3つのインジケーターを自動的に追加します。
- <<<<<<< (7つの「未満」の文字)の後に HEAD が続きます 、これは現在のブランチのエイリアスです。記号は、このセクション内の編集の開始を示します。
- ======= (7つの「等号」文字)。これは、現在のブランチ内のリビジョンの終わりと、新しいブランチ内の編集の始まりを示します。
- >>>>>>> (7つの「より大きい」文字)その後に、マージの試行が行われたブランチが続きます。追加された記号は、競合するブランチ内の編集の終了を示します。
追加された構文は、コードを検索してマージの競合の場所を見つけるのに役立ちます。ただし、はるかに簡単なアプローチは、差分/マージツールを使用して問題を発見し、変更を追跡することです。
Gitでのデフォルトの差分ツールの設定
git mergetool
のデフォルトの差分ツールを設定するには :
1.ターミナルで次の行を実行します:
git mergetool --tool-help
出力には、現在のセットアップでサポートされているすべての差分ツールが出力されます。
選択したエディターに基づいて、さまざまなツールを使用できます。例:
- Emacs 差分ツール:Ediffまたはemerge
- Vim 差分ツール:vimdiff、vimdiff2またはvimdiff3
以降の手順では、 vimdiffを設定する方法の例を示します。 Vim用のツール。
2. git config
を変更します デフォルトのマージツールを設定するには:
git config merge.tool <tool name>
たとえば、Vimを使用している場合は、次のコマンドを実行します。
git config merge.tool vimdiff
3. diffツールを設定して、両方のファイルの共通の祖先を表示します。これは、編集前のバージョンです。
git config merge.conflictstyle diff3
4.実行する前にプロンプトを表示しないオプションを設定します:
git config mergetool.prompt false
Gitの差分ツールのセットアップが完了しました。
Mergetoolを使用して違いを確認する
mergetool
を使用するには 違いを確認して、実行します:
git mergetool
出力には、4つのビューを持つウィンドウが表示されます。
1.ローカル 現在のブランチのファイルバージョンを表します。
2.ベース 変更前のファイルの外観です。
3.リモート は、競合する情報があるリモートブランチでファイルがどのように表示されるかを示しています。
4.マージ 最終的なマージファイルがあります。この結果は、リポジトリに保存される内容を表しています。
これらのウィンドウ間の主なナビゲーションコマンドは次のとおりです。
- CTRL + WW ウィンドウ間を移動します。
- CTLR + WJ MERGEDウィンドウビューにジャンプします。
- CTRL + WX ウィンドウの場所を切り替えるには。
高度なナビゲーションについては、コマンド :help window-moving
で情報を利用できます。 。
マージ競合の更新と解決
MERGEDファイルを更新して、競合を解決します。 MERGEDバージョンを更新するためのいくつかのショートカットは次のとおりです。
- :diffg LOCAL をローカルバージョンに更新します。
- :diffg BASE BASEバージョンへの更新。
- :diffg REMOTE REMOTEバージョンへの更新。
情報が更新されたら、保存して :wqa
で終了します 。
コミットとクリーンアップ
最後のステップは、余分なファイルをコミットしてクリーンアップすることです。次を実行して、更新されたバージョンをコミットします:
git commit -m "<your message>"
差分ツールは、バージョンを比較するためにプロジェクトに追加のファイルを作成します。それらをクリーンアップします:
git clean -f
マージの競合を防ぐ方法に関するヒント
マージの競合は、コンピューターが問題を自動的に解決できない場合にのみ発生します。
マージの競合を防ぐためのヒントを次に示します。
- 可能な限り、既存のファイルの代わりに新しいファイルを使用してください。
- ファイルの最後に変更を追加しないでください。
- 変更をできるだけ頻繁にプッシュおよびプルします。
- コードを美化したり、インポートを自分で整理したりしないでください。
- 同じコードで作業している他の人のことを念頭に置いて、ソロプログラマーの考え方を避けてください。