これはあまりにも基本的な質問のように聞こえるかもしれませんが、私は答えを探しましたが、以前よりも混乱しています。
自分のブランチを他のブランチにマージするとき、git で「ours」と「theirs」はどういう意味ですか? 両方のブランチは「ours」です。
マージ競合では、表示される 2 つのバージョンのうち「ours」が常に上位のバージョンになりますか?
「ours」は常に、マージの開始時に HEAD が指していたブランチを指しますか? そうであれば、参照が曖昧な「ours」のような所有代名詞を使用する代わりに (技術的には両方のブランチが ours であるため)、「current branch's」のような明確な所有参照を使用しないのはなぜですか?
それとも、ブランチ名だけを使用しますか (「ours」と言う代わりに、「local master's」などと言うだけですか)?
私にとって最も混乱する部分は、特定のブランチの .gitattributes ファイルで指定する場合です。テスト ブランチに次の .gitattributes ファイルがあるとします。
config.xml merge=ours
ここで、チェックアウトして HEAD をmasterにポイントし、 testにマージします。masterは私たちのものであり、testの .gitattributes はチェックアウトされていないので、効果があるのでしょうか? 効果があるとしたら、master は現在「私たちのもの」なので、何が起こるのでしょうか?
ベストアンサー1
根本的に混乱しているので、ここで混乱しているのではないかと思います。さらに悪いことに、リベースを実行すると、ours/theirs の役割全体が切り替わります (逆になります)。
最終的に、 中、「ours」ブランチは、に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 はマージ元のバージョンです。
リベース中に「ours」と「theirs」の表記が入れ替わる理由は、rebase
リベースが一連のチェリーピックを匿名ブランチ(分離した HEAD モード)に対して実行することによって機能するためです。ターゲット ブランチは匿名ブランチで、マージ元ブランチは元の(リベース前の)ブランチです。つまり、「--ours」はリベースによって構築される匿名ブランチを意味し、「--theirs」は「リベースされる our ブランチ」を意味します。
gitattributes エントリについては、効果がある可能性があります。「ours」は実際には内部的に「ステージ #2 を使用する」ことを意味します。ただし、ご指摘のとおり、その時点では実際には配置されていないため、ここでは効果がないはずです... まあ、開始する前に作業ツリーにコピーしない限りは。
ちなみに、これは ours と theirs のすべての使用に当てはまりますが、一部はファイル全体のレベル (-s ours
マージ戦略の場合、git checkout --ours
マージ競合中) であり、一部は部分ごと (-X ours
またはマージ-X theirs
中-s recursive
) です。これはおそらく混乱の助けにはなりません。
しかし、これより良い名前が思いつきませんでした。そして:VonCの回答別の質問では、git mergetool
これらに「ローカル」と「リモート」というさらに多くの名前が導入されています。