1. ホーム
  2. git

[解決済み] gitの「ours」「theirs」の正確な意味を教えてください。

2022-03-22 19:50:14

質問

あまりに基本的な質問に聞こえるかもしれませんが、答えを探し、以前よりも混乱しています。

gitで自分のブランチを他のブランチにマージするとき、"ours" と "theirs" はどのような意味ですか? どちらのブランチも "ours"です。

マージの競合では、"ours" は常に 2 つのバージョンのうち上位のものが表示されますか?

ours" は常に、マージが始まったときに HEAD が指していたブランチを指しているのでしょうか?もしそうなら、(技術的には両方のブランチが私たちのものなので)参照元が曖昧な "ours"のような所有代名詞を使うのではなく、"current branch's" のような明確な占有参照を使えばいいのではないでしょうか?

それともブランチ名だけでいいのでしょうか("ours" と言う代わりに "local master's" などと言えばいいのでしょうか)?

私が最も混乱したのは、特定のブランチの .gitattributes ファイルで指定する場合です。例えば テストブランチ 以下のような .gitattributes ファイルがあります。

config.xml merge=ours

ここでチェックアウトして、HEADを マスター でマージします。 テスト . このため マスター は私たちのものであり テスト の .gitattributes がチェックアウトされていない場合、その効果はあるのでしょうか?もし効果があるのなら マスター は今、"ours"であり、次に何が起こるのでしょうか?

解決方法は?

ここで混乱しているのは、根本的に混乱しているからではないでしょうか。 さらに悪いことに、リベースを行うと、ours/theirs のすべての役割が切り替わります(逆になってしまいます)。

最終的には git merge ブランチとは、マージ先のブランチを指します。 への :

git checkout merge-into-ours

で、"theirs" ブランチは、マージする (単一の) ブランチを指しています。

git merge from-theirs

そして、ここで "ours" と "theirs" が意味をなすのは、 "theirs" がおそらくあなたのものであっても、 "theirs" があなたがいたものではない、ということです。 を実行したとき git merge .

実際のブランチ名を使うのはとてもクールですが、より複雑なケースでは破綻してしまいます。 例えば、上記の代わりに、次のようにします。

git checkout ours
git merge 1234567

で、生のコミットIDでマージしています。 さらに悪いことに、こんなことまでできてしまいます。

git checkout 7777777    # detach HEAD
git merge 1234567       # do a test merge

この場合 いいえ ブランチ名は関係ない!

ここで少し参考になると思うのですが、実は gitrevisions シンタックス を使用すると、コンフリクトしたマージ中に、インデックス内の個々のパスを番号で参照することができます。

git show :1:README
git show :2:README
git show :3:README

ステージ#1がファイルの共通の祖先、ステージ#2がターゲットブランチのバージョン、ステージ#3がマージ元のバージョンです。


このように、quot;ours" と "theirs" の概念が入れ替わる理由は、次のとおりです。 rebase リベースは、匿名ブランチ (デタッチド HEAD モード) にチェリーピックを何度も行うことで動作します。 つまり、"--ours" はリベースされた匿名ブランチ、"-theirs" はリベースされた私たちのブランチ、という意味です。


gitattributes のエントリについて: それは 可能 は、内部的には "ours" が "use stage #2" を意味します。 しかし、ご指摘の通り、実際にはその時点では設置されていませんので べきではない というのは、事前にワークツリーにコピーしておかないと、効果が出ないからです。

また、ちなみに、これは我々と彼らのすべての使用に適用されますが、いくつかはファイル全体のレベルです( -s ours は、マージ戦略のために git checkout --ours を使用する場合)、また一部はピース・バイ・ピースで使用する場合( -X ours または -X theirs の間に -s recursive をマージします)。 これはおそらく、混乱の解決にはならないでしょう。

これ以上のネーミングは思いつきませんけどね。 そして:参照 VonCの回答 は、別の質問に対して git mergetool は、これらの名称をさらに増やして、"local" と "remote" と呼んでいるのです!