[解決済み] gitの「ours」「theirs」の正確な意味を教えてください。
質問
あまりに基本的な質問に聞こえるかもしれませんが、答えを探し、以前よりも混乱しています。
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" と呼んでいるのです!
関連
-
[解決済み] Git で直近のローカルコミットを取り消すには?
-
[解決済み] Gitブランチをローカルやリモートで削除するには?
-
[解決済み] git pull」と「git fetch」の違いは何ですか?
-
[解決済み] 現在のGit作業ツリーからローカル(未追跡)ファイルを削除する方法
-
[解決済み] リモート Git リポジトリの URI (URL) を変更するには?
-
[解決済み] 新しいローカルブランチをリモートの Git リポジトリにプッシュし、それを追跡するにはどうすればよいのでしょうか?
-
[解決済み] ローカルの Git リポジトリが元々クローンされた URL を特定するにはどうすればよいですか。
-
[解決済み] git add -A」と「git add .」の違い。
-
[解決済み] Git で最新のコミットを新しいブランチに移動する
-
[解決済み】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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】未マージファイルがあるため、Gitマージができない
-
[解決済み】gpgがデータの署名に失敗した fatal: failed to write commit object [Git 2.10.0].
-
[解決済み】Git Push Error: リポジトリデータベースにオブジェクトを追加する権限が不足しています。
-
[解決済み] git: fatal: リモートリポジトリから読み取れませんでした。
-
[解決済み] fatal: EOF が早い fatal: インデックスパックが失敗した
-
[解決済み] SourceTree error:1407742E:SSLルーチン:SSL23_GET_SERVER_HELLO:tlsv1警告プロトコルバージョン
-
[解決済み] Git Rebaseの衝突。誰がHEADなのか?
-
[解決済み] Git リポジトリでのマージの衝突を解決するには?
-
[解決済み】Gitの言う「私たち」とは誰のことで、「彼ら」とは誰のことなのか?
-
[解決済み] git rebase、'local' と 'remote' を追跡する