Gitのブランチで変更を取得する方法


265

現在のブランチからブランチされたときから、ブランチのコミットのログを取得する最良の方法は何ですか?これまでの私の解決策は:

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...branchx、y、z、c、d、eが得られます。

あなたは私が見ることができるものからあなたの目的のために「git log」を間違って使用しています。以下に回答を追加しました。
PlagueHammer

回答:


186

リビジョンリストのコンテキストでは、それをA...Bどのようにgit-rev-parse定義するかです。git-logはリビジョンリストを取得します。git-diffリビジョンのリストを取りません。1つまたは2つのリビジョンを取りA...Bgit-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にないブランチでのすべてのコミットを意味します。


31
うわー、それは混乱しています。「git diff HEAD..branch」を使用すると、すべてのコミット(x、y、z、c、d、e)が表示されますが、「git log HEAD..branch」は、xとyのみを表示します。 、z!これは、「...」を使用するのとは正反対です。
グレッグヒューギル

22
git diff HEAD..branchと同じですgit diff HEAD branch。ここで覚えておくべき重要なことは、ログはリビジョンのリスト/範囲を取得しますが、diffは取得しないことです。そのため、引数の扱い方が異なります。
リリーバラード

4
思われるgit diff HEAD...branch(3つのドット)の出力に対応git log HEAD..branch
jchook

72
git cherry branch [newbranch]

あなたがmasterブランチにいるとき、あなたが求めていることを正確に行います。

私もとても好きです:

git diff --name-status branch [newbranch]

これは正確にはあなたが求めているものではありませんが、同じコンテキストでは依然として非常に役立ちます。


8
'git cherry'はコミットIDのリストを出力します。これらをすべてのコミットのすべての変更を組み合わせた単一の差分に変換できますか?
ジョナサンハートレー

1
git cherry確かに非常に便利です。おかげで:)
jkp '26

2
@JonathanHartley コミットID の最初最後のようなものを取り、それらをgif-diff:にスローしますgit diff x..z、または私自身の例ではgit diff 13bc4d..8eda3a。。
towi 2013年

3
コマンド内でどのコードを置き換える必要があるか、branchまたはnewbranchのいずれがキーワードであり、カスタムブランチ名で置き換える必要があるかを理解するのは難しい
難しい

37

あなたが見たいのは発信コミットのリストです。あなたはこれを行うことができます

git log master..branchName 

または

git log master..branchName --oneline

「branchName」は「master」の追跡ブランチとして作成されたと想定しています。

同様に、受信した変更を確認するには、次を使用できます。

git log branchName..master

1
@ ABB、branchNameが省略されている場合、デフォルトで「head」に設定されます。これは、上の例では事実上branchNameです。
PlagueHammer 2013年

25

これは私が投稿した回答に似ています:Gitプッシュのプレビュー

これらの関数をBashプロファイルにドロップします。

  • gbout-gitブランチ発信
  • gbin-gitブランチ着信

これは次のように使用できます。

  • マスターの場合:gbin branch1 <-これにより、ブランチ1にあり、マスターにないものが表示されます
  • マスターの場合:gbout branch1 <-これにより、ブランチ1にないマスターの内容が表示されます

これはどのブランチでも機能します。

function parse_git_branch {
  git branch --no-color 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/\1/'
}

function gbin {
    echo branch \($1\) has these commits and \($(parse_git_branch)\) does not
    git log ..$1 --no-merges --format='%h | Author:%an | Date:%ad | %s' --date=local
}

function gbout {
    echo branch \($(parse_git_branch)\) has these commits and \($1\) does not
    git log $1.. --no-merges --format='%h | Author:%an | Date:%ad | %s' --date=local
}

16

Alex VやNDavisなどのいくつかの回答に似ていますが、どれもまったく同じではありません。

問題の支店にすでにいるとき

使用:

git diff master...

これはいくつかの機能を兼ね備えています:

  • 超短いです
  • 実際の変化を示します

更新:

これはおそらくになるはずですがgit diff master、これは、指定された質問のコミットではなく、差分を示します。


2
git co master; git pullブランチを作成してからであればgit diff master、指定したブランチでのコミットによってのみ導入された違いを取得するのにあまり役に立ちません。
2017

1
またはブランチを明示的に指定git diff <branch1>...<branch2>するには、によって導入された変更を表示しますbranch2
Alex

10

そこに-pを入れて、いくつかのファイル変更を確認します

git log -p master..branch

いくつかのエイリアスを作成します。

alias gbc="git branch --no-color | sed -e '/^[^\*]/d' -e 's/* \\(.*\\)/\1/'"

alias gbl='git log -p master..\`gbc\`'

ブランチのユニークなコミットを見てください:

gbl

6

マスターからの分岐以降の現在の分岐のログを表示するには:

git log master...

現在マスターにいる場合、マスターから分岐したため、別のブランチのログを表示するには:

git log ...other-branch


4
git log --cherry-mark --oneline from_branch...to_branch

(3ドット)ただし、「=」ではなく「+」と表示されることもあります。


3つのドットはブランチの最初のコミットを2回示していますが、2つはそうではありません。
TJ Biddle

2

見つけた

git diff <branch_with_changes> <branch_to_compare_to>

コミットメッセージだけでなく、差分全体を取得できるため、より便利です。すでに変更を確認したいブランチにいて、(たとえば)マスターの変更内容を確認したい場合は、次を使用できます。

git diff HEAD master
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.