Git & GitHubを使った場合の、コンフリクトが発生した時の対処手順をまとめています。技術者の方の参考になればと思います。ご指摘がありましたらお寄せください。お問合せ | エンジニアズホームページ
●Git Hubのテキストファイルのpullでコンフリクト発生時の対応の手順
●Git Hubのテキストファイルのpushでコンフリクト発生時の対応2つの手順
●Git Hubのバイナリファイルのpullでコンフリクト発生時の対応の手順
●Git Hubのバイナリファイルのpushでコンフリクト発生時の対応の手順
●Git Hubのテキストファイルのpullでコンフリクト発生時の対応の手順。
1.修正したソースをステージング・コミットして、サーバー側でもソース修正あり、不一致がある場合、pullするとコンフリクトが発生する。
2.git status、git logでコンフリクトを確認する。
3.Gitのコンフリクトマーカーに従って、ソースを修正する。
※GUIツールの利用: SourceTree、VS Code の Git 連携機能などの GUI ツールを使用すると、コンフリクト箇所が視覚的に表示され、より簡単に修正できる場合があります。
git mergetool コマンドを実行すると、設定されたマージツールが起動し、対話的にコンフリクトを解消できます。
事前に git config –global merge.tool <ツール名> でツールを設定しておく必要があります。
4.ステージングする。
5.コミットする。
6.pushする。
●Git Hubのテキストファイルのpushでコンフリクト発生時の対応2つの手順。
Ⅰ.効率的な修正
※この方法は、比較的軽微なコンフリクトや、Gitのコンフリクトマーカーを見慣れている場合に迅速にコンフリクトを解消するのに適しています。
1.修正したソースをステージング・コミットして、サーバー側でもソース修正あり不一致がある場合、pushしようとするとコンフリクトが発生する。
2.git status、git logでコンフリクトを確認する。
3.Gitのコンフリクトマーカーに従って、ソースを修正する。
※ここで、サーバーからpullは必要ありません。この時点では通常 pull は明示的には行いません。 コンフリクトが発生するのは、ローカルのコミットとリモートのコミットが矛盾しているためです。pull を行う前にローカルで修正(ステップ2)し、ステージング、コミットすることで、ローカルのコンフリクトを解消した新しいコミットを作成します。その後、push することで、リモートリポジトリにローカルの変更を反映させます。もし、コンフリクト解消前に pull を行うと、さらにコンフリクトが発生する可能性があります。
4.ステージングする。
5.コミットする。
6.pushする。
Ⅱ.一時的なブランチを作成して作業する
※特徴
安全性の向上:元のブランチ(通常は main や develop など)に直接変更を加えることなく、一時的な隔離された環境で作業できます。これにより、誤った操作をしても元のブランチを汚染するリスクを回避できます。コンフリクト解消作業がうまくいかなかった場合でも、一時的なブランチを破棄して元のブランチから再度やり直すことが容易です。
作業の分離:コンフリクトが発生する可能性のある変更を、他の作業と分離して行うことができます。これにより、問題の切り分けがしやすくなります。
1.checkout temp-branchで、テンポラリブランチを作成する。
2.テンポラリブランチで、ソース修正を行う。
3.checkout master。masterブランチよに戻る。
4.masterブランチでpullする。
5.merge temp-branch >>> コンフリクト発生
6.log,statusでコンフリクトの状態を確認する。
7.<<<<<<>>>>>subを元にソース修正する。
※4.でpullしているので、ここでサーバーからpullは必要なし。
8.ステージング(add)する。
9.コミットする。
10.pushする。
●Git Hubのバイナリファイルのpullでコンフリクト発生時の対応の手順
–git pull で Excel ファイルがコンフリクトした場合に、リモートのファイルを優先してワーキングエリアのファイルは後で追加修正する手順は以下の通りです。
基本的な考え方: コンフリクトした状態では、Git はどちらの変更を保持するかを自動的に決定できません。リモートのファイルを優先するということは、コンフリクトしている Excel ファイルに関して、リモートの最新版をローカルのワーキングエリアに採用し、ローカルでの変更は一旦破棄する形になります。その後、必要に応じてローカルでリモートのファイルに追加修正を加えます。
手順:
1.コンフリクトの確認: まず、git status コマンドを実行して、コンフリクトが発生しているファイルを確認します。
git status
「Unmerged paths」のセクションに、コンフリクトしている Excel ファイルが表示されます。
2.リモートの変更を優先してコンフリクトを解消: 以下のコマンドを実行して、コンフリクトしているファイルに対してリモートブランチのバージョンを採用します。<リモートブランチ名> は通常 origin/main や origin/develop などです。
git checkout –theirs <コンフリクトしたExcelファイル名>
このコマンドは、指定されたファイルの「theirs」(リモート側のバージョン)をワーキングエリアに反映させます。
3.コンフリクト解消済みとしてステージング: リモートのファイルを採用したら、それをコンフリクトが解消されたものとして Git に認識させるために、ファイルをステージングします。
git add <コンフリクトしたExcelファイル名>
4.コンフリクト解消のコミット: コンフリクト解消のコミットを行います。
git commit -m “Resolve conflict: Use remote version of “
コミットメッセージには、どのようにコンフリクトを解消したかを記述しておくと良いでしょう。
5.(必要に応じて)ワーキングエリアのファイルを修正: この時点で、ワーキングエリアにはリモートの最新版の Excel ファイルがあります。ローカルで行っていた変更をこのファイルに追加したい場合は、Excel を開いて手動で修正を行います。
6.修正後のファイルをステージング: 必要に応じて修正を加えたら、そのファイルを再度ステージングします。
git add <修正したExcelファイル名>
7.修正内容をコミット (必要に応じて): 追加修正を行った場合は、その変更をコミットします。
git commit -m “Add local modifications to remote Excel file”
8.プッシュ: 最後に、ローカルの変更をリモートリポジトリにプッシュします。
git push
●Git Hub のバイナリファイルのpushでコンフリクトが発生する場合の対応の手順
ローカルでバイナリファイル(例:Excelファイル)を編集・コミットしようとした。
その間に、リモートリポジトリでは同じバイナリファイルが別の変更でコミットされている。
ローカルで git pull をせずに git push しようとした結果、コンフリクトが発生した(または、リモートリポジトリがローカルより進んでいるためプッシュが拒否された)。
対応手順:
1.プッシュの拒否を確認: git push を実行すると、以下のようなエラーメッセージが表示され、プッシュが拒否されます。
To github.com:user/repo.git
! [rejected] local-branch -> remote-branch (fetch first)
error: failed to push some refs to ‘github.com:user/repo.git’
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., ‘git pull …’) before pushing again.
hint: See the ‘Note about fast-forwards’ in ‘git help push’ for details.
リモートの変更を取り込む (git pull): エラーメッセージの指示に従い、まずリモートリポジトリの変更をローカルに取り込みます。
2.git pull origin <リモートブランチ名>
<リモートブランチ名> は、通常 main や develop など、ローカルブランチが追跡しているリモートブランチの名前です。
3.コンフリクトの確認: バイナリファイルの場合、Git は自動的にマージできないため、コンフリクトとして扱われます。git status コマンドを実行すると、「Unmerged paths」のセクションにコンフリクトしている Excel ファイルが表示されます。
git status
4.コンフリクトの解消 (リモート優先の場合): リモートのファイルを優先する場合、以下のコマンドを実行します。
git checkout –theirs <コンフリクトしたExcelファイル名>
5.コンフリクト解消済みとしてステージング:
git add <コンフリクトしたExcelファイル名>
6.コンフリクト解消のコミット:
git commit -m “Resolve conflict: Use remote version of “
7.(必要に応じて)ローカルで修正: リモートのファイルにローカルの変更を追加したい場合は、Excel を開いて手動で修正します。
8.修正後のファイルをステージング:
git add <修正したExcelファイル名>
9.修正内容をコミット (必要に応じて):
git commit -m “Add local modifications to remote Excel file”
10.プッシュ: 最後に、ローカルの変更をリモートリポジトリにプッシュします。
git push
重要なポイント:
バイナリファイルの場合、Git はコンフリクトマーカーを表示して内容を比較・編集することができません。そのため、どちらのバージョンを採用するか(リモート優先、ローカル優先、または両方の手動マージ)を決定する必要があります。
リモート優先にする場合は –theirs オプションを使用し、ローカル優先にする場合は –ours オプションを使用します。
手動でマージする場合は、それぞれのバージョンのファイルを参照しながら、新しい統合されたファイルを作成する必要があります。
git pull を怠って git push しようとすると、リモートリポジトリとの不整合が発生し、プッシュが拒否されるのが一般的な動作です。その際は、まず git pull でリモートの変更を取り込むことが重要になります。
この手順で、git pull を怠ってコミットしようとした(実際にはプッシュしようとした)際に発生したバイナリファイルのコンフリクトに対応し、リモートのファイルを優先してローカルを更新し、最終的にリモートリポジトリにプッシュすることができます。