マージ後のブランチのGit履歴

ロビン

マージ後にgitが履歴を保存する方法について少し混乱しています。

ブランチAをブランチにB正常にマージしました。さて、Bマージの一部であるブランチ内のファイルに移動すると、ブランチのそのファイルのすべての履歴が表示されますが、ブランチの履歴は表示されAませんBブランチ用のそのファイルの履歴はどこにありますBか?

私が合併した方法は通り抜けていたgit merge <branch>ので、この場合、私はブランチにいBて使用しましたgit merge A


例えば、枝にA私は、次のコミットを持っていた:aaaaaa別のファイルに対応します。

支店ではB、私は次のコミットを持っていた:bbbbbb別のファイルに対応します。

私はブランチをマージしたときに今Aの枝にB、すべての私はブランチに表示B git logされているaaaaaa歴史。自分のb歴史がわかりません

本質的には、私がマージするとき、私のマージがリニアになりたいAB、私は歴史が分岐のすべてが欲しいBの歴史を、歴史の上にそれだけでSVNはそれをしないのと同じように発生したことを、マージされます。

私の現在のgitログ履歴は非常に紛らわしいです。

火曜日

TL; DR

歴史は消えていません、Gitはそれを示しいません

Gitでは、履歴一連のコミットです。ファイル履歴はありません!

あなたのようなコマンドを実行するとgit log dir/sub/file.ext、またはそのことについては、git log dir/subまたはgit log .中ながらdir/sub、Gitはなり合成本当の歴史・コミットのセットからいくつかのサブ歴史を抽出することにより、(一時的な)ファイルの履歴を。この合成プロセスは、意図的にいくつかのコミットを削除します。たとえば、質問したファイルに影響を与えないすべてのコミットを削除します。ただし、デフォルトでは、History Simplificationgit log呼ばれるものを介して、それよりもはるかに多くの値がドロップされます

より長いです

すべてのコミットには一意のハッシュIDがあります。git logたとえば、これらは出力に表示されます。ハッシュIDは、実際にはコミットの内容の暗号化チェックサムにすぎません。

各コミットはファイルのスナップショット(のハッシュID)を保存します—Gitはこれをツリーと呼びますこれはマージコミットにも当てはまります。マージコミットには、他のコミットと同様に、ツリーがあります。

各コミットには、名前(作成者とコミッター)、メールアドレス、タイムスタンプも保存されるため、Gitはこれらを表示できます。Gitがそれを表示できるように、ログメッセージを保存します。

Gitがコミットに保存する最後のもの(実際には、直後の2番目のもの)は、一意のハッシュIDによるコミットのtreeリストです

線形履歴は簡単です

通常の非マージコミットを処理する場合、履歴を確認するのは非常に簡単です。ようなブランチ名で識別される最新のコミットから開始し、master逆方向に作業します。ブランチ名には、最後のコミット(ブランチ先端)ハッシュIDが含まれ、ブランチ名はそのコミットを指していると言います

... <--1234567...   <--master

コミットした場合1234567の先端であるmastergit logあなたがコミット表示することができます1234567...とコミット1234567その中のハッシュIDは、それが右来るコミット持って前に 1234567

実際のハッシュIDを1文字に交換すると、作業が簡単になり、次のようになります。

A <-B <-C <-D <-E <-F <-G   <--master

コミットGポイントをコミットF戻します。コミットはを指します。これはE、最初のコミットであるコミットに到達するまで続きAます。このコミットはどこも指していません—それはできません、それは最初のコミットでした。親を持つことはできません。したがって、これは、時間の開始時に履歴が終了する(開始する?)場所です。Gitは呼び出すルートはコミット:なし親にコミットします。A

時間の終わりから始まり、始まりで終わる線形履歴を表示するのは簡単です。Gitは、各コミットを一度に1つずつ選択して表示するだけです。それは何です:

git log master

する:それは、で識別される1つのコミットで始まりmaster、それを表示し、次に1つのコミットの1つの親を表示し、次にその前のコミットを表示します。

Gitにコミットを表示させると、実際には、ほとんどの場合、Gitにスナップショットではなくパッチとして表示させることができますたとえば、git log --patchこれを行います。コミットをパッチとして表示するために、Gitは最初にコミットののツリーを調べ、次にコミットのツリーを調べて、2つを比較します。どちらもスナップショットであるため、親のスナップショットから子のスナップショットに変更されたものはすべて、子をコミットさせた人が実際に行ったものでなければなりません。

非線形の歴史はより難しい

Gitが逆方向に機能することがわかったので、実際のマージコミットを含む履歴を含む、より複雑な履歴を見てみましょう。git merge常にマージされるとは限らないという事実に惑わされないようにしましょう!)

マージコミットは単に少なくとも二つの両親と一緒にコミットです。ほとんどの場合、3人以上の親とのコミットは表示されません。Gitはこれらのタコのマージを呼び出します。通常のマージでは実行できないことは何も行わないため、タコのマージは主にGit-fuを誇示するためのものです。:-)

通常、を実行することでマージを取得し、次のgit checkout somebranch; git merge otherbranchように結果のコミットチェーンを描画できます。

...--E--F--G------M   <-- master
         \       /
          H--I--J   <-- feature

ここで、実行するとしますgit log master(注:--patchオプションはありません)。もちろん、GitはM最初にコミットすることを示す必要がありますしかし、Gitは次にどのコミットを表示しますか?J、またはGそれらのいずれかが表示されている場合、その後はどれを表示する必要がありますか?

Gitには、この問題に対する一般的な答えがあります。マージコミットが表示されると、コミットの両方の親を「まだ表示されていないコミット」のキューに追加できます。通常の非マージコミットが表示されると、(単一の)親が同じキューに追加されます。次に、キューをループして、一度に1つずつコミットし、その親をキューに追加することを示します。

履歴が線形の場合、キューには一度に1つのコミットが含まれます。1つのコミットが削除されて表示され、キューに1つの親が含まれるようになり、親が表示されます。

履歴にマージがある場合、キューは1つのコミットで始まり、Gitはコミットをキューからポップして表示し、両方の親をキューに入れます。次に、Gitは両親やショーあなたのうちの1つ選ぶGJ、そしてプットFまたはIキューにします。キューにはまだ2つのコミットがあります。Gitは1つをポップして、そのコミットを示し、もう1つをオンにします。

最終的に、GitはFFがすでにキューにあるときにキューに入れようとします。Gitはこの場合の上映では、その最終的にキューの深さは1に減少し、再びコミットし、それを2回追加避けFED、など。(ここでの詳細は少し複雑です。キューは具体的には優先度キューであり、優先度は追加のgit log並べ替えパラメーターによって決定されるため、これが発生する可能性のあるさまざまな方法があります。)

との接続を表示できます git log --graph

コマンドに追加する--graphgit log、Gitは、子のコミットを親に接続する線を含む、やや大雑把なASCIIアートグラフを描画します。これはgit log、一度に1つのコミットを表示している場合でも、表示しているコミット履歴が線形ではないことを伝えるのに非常に役立ちます(必須であるため)。

マージコミットの表示

上記の-pまたは--patch、親のスナップショット/ツリーを子のスナップショット/ツリーと比較することにより、コミットでgit log何が変更されたかを示します。ただし、マージコミットの場合、2つ(またはそれ以上)の親があります少なくとも2つのがあるため親と子の比較を表示する方法はありません

何をgit log行い、デフォルトでは、完全にあきらめることです。パッチが表示されないだけです。他のコマンドはもっと複雑なことをします、そしてあなたもそれをするように説得git logすることができます、しかしデフォルトがgit logここで諦めることであることに注意しましょう

履歴の簡略化(これはgit logドキュメントへのクリック可能なリンクです

を実行するとgit log file.ext、Gitは、(親と子を比較して取得した)差分が接触しない非マージコミットを意図的にスキップしますfile.extそれは十分に自然なことです:あなたが次のようなチェーンを持っているなら:

A--B--C--D--E   <-- master

file.extコミットを行ったときに変更した(または最初に作成した)AE、これら2つのコミットだけを表示したいとします。Gitは、D-vs-のパッチを見つけEて、それがfile.ext変更されたことを確認し(したがって、表示さ れるはずですE)、に移動することでこれを行うことができますDC-vs-D比較ショーへの変更なしfile.ext、Gitはしていないだろう示しD、それが置かれますCプライオリティキューにと訪問に行きますCそれもファイルに変更がないため、Gitは最終的ににB移動しAます。これは変更がなく、Gitはに移動します。比較のために、のすべてのファイルAは常に新しいものです。これがルートコミットのルールです。すべてのファイルが追加されるため、Gitに表示されますA 同様に。

ただし、デフォルトでgit logは、マージのパッチを計算することを好まないことがわかりました。難しすぎる!したがって、git log通常、ここではマージは表示されません。ただし、コミットグラフの任意の部分を単純化しようとします。ドキュメントに記載されているように、デフォルトモードは次のとおりです。

最終結果が同じである場合、いくつかの側枝を剪定します...

コミットがマージであり、[ファイルがと同じ] 1つの親である場合は、その親のみをフォローします。...それ以外の場合は、すべての親に従ってください。

したがってM、グラフのようなマージコミットでは、Gitは高速チェックを実行ます。file.extと同じです。その場合は、キューに追加します。そうでない場合、それは同じであるのようにその場合は、キューに追加します。それ以外の場合、すなわち、で異なっているよりも、両方の両方を-addおよびキューに。MGGMJJfile.extM G JGJ

履歴の簡略化には他にもモード​​があり、さまざまなフラグで選択できます。この回答はすでに長すぎるので、ドキュメントに任せます(上記のリンクを参照)。

結論

Gitが実行する履歴の単純化のため、表示内容からあまり多くの推論を引き出すことはできませんすべてを表示したい場合は代わりに実行することを検討してくださいこのオプションは、目的のために各マージを分割し(これはオプションに適用されます)、Gitに常にすべての親をフォローするように強制します。git log -- pathgit log --full-history -m -p -- path-mgit diff-p--full-history

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

マージ後のブランチの履歴の保持

分類Dev

gitマージ後、ブランチのコミット履歴をgitロググラフに保持します

分類Dev

コミット履歴のないGitマージ機能ブランチ

分類Dev

ブランチの履歴を書き換えた後のGitリポジトリのサイズ

分類Dev

孤立した履歴に追加せずに、メインブランチから孤立したブランチへの変更をgitマージする方法は?

分類Dev

リセット後にリモートブランチのgit履歴を見つける方法は?

分類Dev

ブランチからコミットを選択し、後でブランチ全体をマージすると、git履歴はどうなりますか?

分類Dev

Gitブランチの作成と削除の履歴

分類Dev

Gitのブランチ履歴をクリーンアップする

分類Dev

ブランチ間のマージの競合を回避しながらコミット履歴を操作する

分類Dev

git履歴からマルチマージ機能ブランチを削除する

分類Dev

Git-履歴のないブランチをコピーする

分類Dev

マージはブランチのコミット履歴を変更できますか?

分類Dev

マージ後の2つのブランチの違い:GIT

分類Dev

gitマージ後の2つのブランチの同期

分類Dev

Mercurialのマージされたサブリポジトリからの複数のブランチのマージ履歴

分類Dev

GIT:QAブランチをマスターで上書きし、QAブランチの履歴を保持する方法は?

分類Dev

git:ブランチをマージしますが、コミット履歴は保持します

分類Dev

ブランチ履歴を保持しながら、以前にマージされたブランチからの過去のコミットを修正します

分類Dev

単一のブランチ履歴を多数の小さなマージされたブランチに変換します

分類Dev

1つをリベースした後、2つのgitブランチ(共通の履歴を持つ)を互いにコヒーレントにする方法は?

分類Dev

以前の共通の履歴を持つ2つのブランチをマスターするためにマージ

分類Dev

git:特定のブランチをプルし、最新のツリーのみを保持します(履歴なし)

分類Dev

Git-ブランチのマージ

分類Dev

履歴のあるGitブランチを新しいリポジトリに移動する

分類Dev

gitサブツリーエラー「致命的:無関係な履歴のマージを拒否しました」

分類Dev

マスターブランチのリモートアップストリームとコミット履歴を同一にする方法をGit

分類Dev

Git-ブランチの履歴からファイルを削除する

分類Dev

Gitは私がいたブランチの履歴を取得します

Related 関連記事

  1. 1

    マージ後のブランチの履歴の保持

  2. 2

    gitマージ後、ブランチのコミット履歴をgitロググラフに保持します

  3. 3

    コミット履歴のないGitマージ機能ブランチ

  4. 4

    ブランチの履歴を書き換えた後のGitリポジトリのサイズ

  5. 5

    孤立した履歴に追加せずに、メインブランチから孤立したブランチへの変更をgitマージする方法は?

  6. 6

    リセット後にリモートブランチのgit履歴を見つける方法は?

  7. 7

    ブランチからコミットを選択し、後でブランチ全体をマージすると、git履歴はどうなりますか?

  8. 8

    Gitブランチの作成と削除の履歴

  9. 9

    Gitのブランチ履歴をクリーンアップする

  10. 10

    ブランチ間のマージの競合を回避しながらコミット履歴を操作する

  11. 11

    git履歴からマルチマージ機能ブランチを削除する

  12. 12

    Git-履歴のないブランチをコピーする

  13. 13

    マージはブランチのコミット履歴を変更できますか?

  14. 14

    マージ後の2つのブランチの違い:GIT

  15. 15

    gitマージ後の2つのブランチの同期

  16. 16

    Mercurialのマージされたサブリポジトリからの複数のブランチのマージ履歴

  17. 17

    GIT:QAブランチをマスターで上書きし、QAブランチの履歴を保持する方法は?

  18. 18

    git:ブランチをマージしますが、コミット履歴は保持します

  19. 19

    ブランチ履歴を保持しながら、以前にマージされたブランチからの過去のコミットを修正します

  20. 20

    単一のブランチ履歴を多数の小さなマージされたブランチに変換します

  21. 21

    1つをリベースした後、2つのgitブランチ(共通の履歴を持つ)を互いにコヒーレントにする方法は?

  22. 22

    以前の共通の履歴を持つ2つのブランチをマスターするためにマージ

  23. 23

    git:特定のブランチをプルし、最新のツリーのみを保持します(履歴なし)

  24. 24

    Git-ブランチのマージ

  25. 25

    履歴のあるGitブランチを新しいリポジトリに移動する

  26. 26

    gitサブツリーエラー「致命的:無関係な履歴のマージを拒否しました」

  27. 27

    マスターブランチのリモートアップストリームとコミット履歴を同一にする方法をGit

  28. 28

    Git-ブランチの履歴からファイルを削除する

  29. 29

    Gitは私がいたブランチの履歴を取得します

ホットタグ

アーカイブ