Git で強制上書きとマージ
ほとんどの場合、git push
または git merge
を適用すると、最終的には何らかの競合が発生します。場合によっては、競合をマージするための解決策は、ローカルの変更やリモートまたは他のブランチの変更を破棄するのと同じくらい簡単です。
Git が 2つの競合する変更をマージする方法を理解できない場合、競合リクエストを作成します。競合リクエストは、問題を説明する特別な種類のパッチであり、競合する変更の両側(私たちとその変更)とマージ試行の結果が含まれています。
チームの 2 人のメンバーが同じファイルで作業していて、そのファイルで競合が発生しているときに、Git はその競合を作業ファイルに適用します。その後、結果のファイルを編集でき、Git が変更を記録します。競合する変更が発生した場合、Git はファイルを競合状態としてマークします。その特定のブランチの競合を解決するためのいくつかのコマンドがあります。
競合は、2 人以上が同じリポジトリ内の同じファイルで作業している場合に最も一般的です。ただし、ファイル内で競合が見つかった場合、Git はそれを非常に優れた方法で解決する方法について非常に賢くインテリジェントです。Git は競合マーカーを使用して、ファイルのどの部分が競合しているかを示します。競合マーカーは、ファイルの競合セクションの両側に配置される小さなハッシュです。
プルは単独では使用されません。これは、リモートサーバーからデータをフェッチし、ローカルリポジトリの変更とのマージを適用することで使用されます。必要に応じて、以下の 2つの操作を実行できます。
git fetch
git merge origin/$CURRENT_BRANCH
上記の origin/$CURRENT_BRANCH
は以下を意味します。
- Git はマージオプションを適用し、リモートリポジトリからの変更、つまり
origin
を適用します。 - そしてそれが
$CURRENT_BRANCH
に追加されます - 現在、ローカルのチェックアウトブランチには存在しません
git pull
が推奨されるだけでなく、git fetch
の後に git merge
を実行するだけです。3つのマージを実行します。これにより、Git は 3つのフェッチ操作を実行します。必要なのは 1つのフェッチだけです。
git fetch origin # it will update all our origin/* remote-tracking branches
git checkout new branch
git merge origin/new branch
git checkout master
git merge origin/master
git merge -X theirs new branch
git push origin master
上記のコマンドは、マージ元のブランチで異なる変更を事実上無視し、マージ先のブランチで新しいコミットを開発します。ここで、コミットはすべてマージされます。
また、通常のマージで --ours
を使用して、マージ元のブランチ内のすべての変更をマージし、マージ先のブランチに存在するファイルをスキップして、2つの間で 3 方向のマージを効果的に実行することもできます。ブランチしてから、マージ先のブランチのファイルを使用します。
git merge --ours
を使用してファイルをマージしてから、git rebase -i
を使用して、マージ元のブランチからの変更を手動で再適用する方がはるかに簡単であることがわかりました。
上記のコマンドは、競合のあるファイルでは機能しませんが、次のコマンドで競合を解決できることがわかりました。
git checkout file_with_conflict
git merge --ours --no-commit file_from_branch_with_conflict
git reset --hard git add file_with_conflict git commit -m
Abdul is a software engineer with an architect background and a passion for full-stack web development with eight years of professional experience in analysis, design, development, implementation, performance tuning, and implementation of business applications.
LinkedIn