7

マージの競合がバグの原因であるかどうかを把握しようとしていますが、競合の解決がgit blame.

マスターにファイルがあるとしましょう:

a();
b();
c();

私はマスターでそれを変更します:

a();
d();
c();

しかし、同僚もそうであり、別のブランチで別の方法で変更し、それを master にマージします。

a();
e();
c();

その対立を解決することは責任に影響を与えることができますか? つまり、同僚が私のバージョンを使用して競合を解決した場合:

a();
d();
c();

誰が非難されるgit blamed();ですか:私または私の同僚?

同様に、git が混乱し、1 行目と 2 行目が競合していると考えたとします。

<<<<
a();
d();
====
a();
e();
>>>>

同僚が自分のバージョンとの競合を解決した場合:

a();
e();
c();

そして、私git blameがそのa();行を書いた場合、私 (行の元の作成者) が責任を負うのでしょうか、それとも同僚 (変更していないにもかかわらず、最後に「触れた」人) が責任を負うのでしょうか?

4

1 に答える 1

9

tl;dr

git blameマージされたファイルで実行すると、誰がマージ コミットを行ったかに関係なく、各行の元の作成者が表示されます。これは、同僚があなたのバージョンの回線を使用して競合を解決することを決定した場合、その横にあなたの名前が表示されることを意味します。

ファイルの履歴を再構築する

Git では、各コミットが 2 つの重要な情報を保持しています。

  • コミット時の作業ディレクトリのスナップショットへの参照。
  • その前にあるコミットへの参照、別名その

これら 2 つの事実が与えられると、Git は、特定のコミットからさかのぼってファイルで発生した変更の履歴を再構築し、各ステップでファイルの現在のバージョンとその前のバージョンとの差分を生成できます。

これはまさに何をするかgit blameです。ファイルに対して実行するgit blameと、Git はファイルの履歴をごとに再構築し、各行を導入 (つまり、追加) したコミットの作成者を表示します。

コミットをマージする

マージ コミットは、2 つの親への参照を保持します。

  • マージ先のブランチ(つまり、左側)によって参照されるコミット。
  • マージしたブランチによって参照されるコミット、別名右側

スナップショットには、それぞれの側からのすべての変更が組み合わされて含まれています。

マージ コミットを実行するgit blame、Git は、親コミットごとに 1 行ずつ、2 行の履歴をたどります。スナップショットが特定の行を追加したコミットに Git が到達すると、行の横にそのコミットの作成者が表示されます。

競合の解決時に新しい行を追加する

新しい行(マージのどちらの側にも属さない行) が競合解決の一部として追加された場合、その行はマージ コミット自体によって参照されるスナップショットに属します。その場合git blame、その行のマージ コミットの作成者を報告します。

于 2015-09-25T09:31:20.520 に答える