2016-03-25 1 views
0

の舞台、を見て頑丈、私は同じファイルのための3件の結果を見ている(マスターとブランチ間の<code>merge_commits</code>への呼び出し以下)(libgit2)指数を見ると、インデックス

{:path=>"file.txt", :oid=>"c6fdbacd7400805042668f4ccf70fc1ebbdac361", :dev=>0, :ino=>0, :mode=>33188, :gid=>0, :uid=>0, :file_size=>0, :valid=>false, :stage=>1, :ctime=>1969-12-31 19:00:00 -0500, :mtime=>1969-12-31 19:00:00 -0500} 
{:path=>"file.txt", :oid=>"0838a4be16d19278e1e549614ffd2b6759549185", :dev=>0, :ino=>0, :mode=>33188, :gid=>0, :uid=>0, :file_size=>0, :valid=>false, :stage=>2, :ctime=>1969-12-31 19:00:00 -0500, :mtime=>1969-12-31 19:00:00 -0500} 
{:path=>"file.txt", :oid=>"4bd2639f786bef1000dad7d59c6779a4e99fb27c", :dev=>0, :ino=>0, :mode=>33188, :gid=>0, :uid=>0, :file_size=>0, :valid=>false, :stage=>3, :ctime=>1969-12-31 19:00:00 -0500, :mtime=>1969-12-31 19:00:00 -0500} 

私の理解これらのそれぞれの内容は、ステージ3が最も最近の/進歩した変化であるということですが、誰かがこれらのステージの背後にあるコンセプトとナンバリングを説明できますか?このファイルにコミットされていない変更があるため、ステージ0はありませんか?

答えて

3

私はlibgit2に精通していませんが、gitインデックスファイルのゼロ以外の段階はマージの競合を処理するためのものです。

競合が解決されるまでthe gitrevisions documentationに記載されているように、単一のパス名の3つのエントリまでが存在することになる。

任意にステージ番号(0〜3)が続くコロン、およびコロンとそれに続くパスは、指定されたパスのインデックス内のblobオブジェクトに名前を付けます。不足しているステージ番号(およびそれに続くコロン)はステージ0のエントリの名前です。マージの間、ステージ1は共通の祖先であり、ステージ2はターゲットブランチのバージョン(通常は現在のブランチ)であり、ステージ3はマージされるブランチからのバージョンです。

マージ競合(すなわち、ファイルは共通の祖先に存在するが、1つのブランチから欠落していると他のに変更される)ので、削除である場合、一つだけステージ2又は3が存在することになります。それが作成のためであれば(ファイルは共通の祖先には存在しませんが、両方のブランチで作成されました)、ステージ1のエントリはありません。 (ここでは3つ未満のエントリのすべてのケースをカバーしているかどうかはわかりません)

マージを完了してコミットする前に、ゼロ以外のステージエントリを1つのステージ0エントリに置き換える必要があります。

1

マージを行うとき、gitは基本バージョンから各ヒントごとに変更が必要です。インデックスは、ベースバージョンIDと各ヒントバージョンのoidを1(ベース)2( "ours")、3( "theirs")として記録します。コンテンツIDを記録すると、必要に応じてさまざまなオプション(たとえば、3つのdiffの衝突の報告や空白の変更を無視するなど)でdiffを再実行することができます。ステージ0は、解決されたコンテンツのためのものであり、コンテンツは機内でマージされません。

関連する問題