[解決済み] git mergeの詳細について教えてください。
2022-05-15 23:59:38
質問
git merge」の背後にある正確なアルゴリズム(またはそれに近いもの)を知りたいのです。少なくともこれらのサブクエスチョンへの回答は役に立つでしょう。
- git はどのように特定の非競合的な変更のコンテキストを検出するのですか?
- git はどのようにして、これらの正確な行に競合があることを発見するのでしょうか?
- gitはどのようなものを自動マージするのですか?
- ブランチをマージするための共通のベースがない場合、git はどのように動作しますか?
- ブランチをマージするための共通のベースが複数ある場合、git はどのように動作しますか?
- 複数のブランチを一度にマージするとどうなりますか?
- マージ戦略の違いは何ですか?
しかし、アルゴリズム全体の記述はもっと良いものになります。
どのように解決するのですか?
3ウェイマージアルゴリズムの記述を探すのが一番いいかもしれません。高レベルの説明は次のようなものです。
-
適切なマージベースを見つける
B
- 新しいバージョンの両方の祖先であるファイルのバージョン (X
とY
の特徴の一つである、さらに遡る必要がある場合もありますが)、通常は最新のそのようなベースです。git
のデフォルトのrecursive
をマージする) -
の diff を実行します。
X
とB
とY
とB
. - 2 つの差分で識別された変更ブロックの中を歩いてください。一方が変更を導入し、もう一方がその領域をそのままにする場合、最終的にその変更を導入します。両方が同じ場所に変更を導入し、それらが一致しない場合、手動で解決するために競合をマークします。
完全なアルゴリズムでは、これをより詳細に扱っており、いくつかの文書もあります (
https://github.com/git/git/blob/master/Documentation/technical/trivial-merge.txt
と共にあります。
git help XXX
のページで、XXX は以下のうちの一つです。
merge-base
,
merge-file
,
merge
,
merge-one-file
といった具合です)。もしそれが十分に深くないのであれば、いつでもソースコードがあります...。
関連
-
[解決済み] Git で直近のローカルコミットを取り消すには?
-
[解決済み] Gitブランチをローカルやリモートで削除するには?
-
[解決済み] git pull」と「git fetch」の違いは何ですか?
-
[解決済み] コミット前に 'git add' を取り消すにはどうすればよいですか?
-
[解決済み] リモートのGitブランチをチェックアウトするには?
-
[解決済み] Git リポジトリを以前のコミットに戻すにはどうすればよいですか?
-
[解決済み] 現在のGit作業ツリーからローカル(未追跡)ファイルを削除する方法
-
[解決済み] Git リポジトリでのマージの衝突を解決するには?
-
[解決済み】"git pull" でローカルファイルを強制的に上書きするには?
-
[解決済み】ローカルのGitブランチの名前を変更するには?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
解决[email protected]。パーミッションが拒否されました (publickey)。リモートリポジトリから読み取れませんでした
-
Gitのエラーについて覚えておく-すべて最新にする
-
git push は最新の解決策を提供します。
-
Git がエラーを報告しました。現在のブランチの先端が遅れているため、更新が拒否されました。
-
git pushで "Updates were rejected because your current branch is behind "というエラーが報告される。
-
git を使用してリモートリポジトリを更新する場合、現在のブランチの先端がエラーの背後にあるため、更新が拒否されました。
-
コミットメッセージが空だったため、コミットを中止する git commit
-
Git: bash: cd: 引数が多すぎる
-
Gitのコミットでfatal: unable to auto-detect email addressのエラーが報告される。
-
[解決済み] シングルブランチクローンを「元に戻す」方法は?