1. ホーム
  2. ギット

[解決済み】Gitでブランチの変更点を取得する方法

2022-04-02 03:08:50

質問

現在のブランチからブランチされた時点以降のブランチのコミットログを取得するのに最適な方法は何でしょうか?今までの私の解決策は

git log $(git merge-base HEAD branch)..branch

のドキュメントは git-diff(ギットディフ とは git diff A...B と同等です。 git diff $(git-merge-base A B) B . 一方 git-rev-parse とは r1...r2 は次のように定義されています。 r1 r2 --not $(git merge-base --all r1 r2) .

これらはなぜ違うのでしょうか?注意してほしいのは git diff HEAD...branch は欲しい差分を与えてくれますが、対応する git log コマンドは欲しい差分以上のものを与えてくれます。

絵で言うと、こうだとします。

         x---y----z---ブランチ
        /
---a---b---c---d---e---HEAD

コミット x, y, z を含むログを取得したいのですが。

  • git diff HEAD...branch はこれらのコミットを与えます。
  • が、しかし。 git log HEAD...branch は、x, y, z, c, d, e を与える。

解き方は?

リビジョンリストのコンテキストで A...B はどのように git-rev-parse はそれを定義しています。git-log はリビジョンリストを受け取ります。 git-diff はリビジョンのリストを受け取りません。1つか2つのリビジョンを受け取り、そのリビジョンに対応した A...B の構文で定義されているような意味になります。 git-diff のマニュアルページを参照してください。もし git-diff が明示的に定義されていない場合は A...B であれば、その構文は無効である。なお git-rev-parse のマニュアルページでは A...B を参照してください。このセクションの内容は、リビジョン範囲が有効な場合(つまり、リビジョンリストが必要な場合)にのみ有効です。

x, y, z だけを含むログを取得するには、次のようにします。 git log HEAD..branch (3つの点ではなく2つの点)。これは git log branch --not HEAD ブランチ上のコミットで、HEAD にないものをすべて意味します。