Gitを使用して、1つのブランチにあるが他のブランチにはないすべてのコミットを表示する


465

削除したい古いブランチがあります。ただし、その前に、このブランチに対して行われたすべてのコミットが、ある時点で他のブランチにマージされたことを確認したいと思います。したがって、他のブランチに適用されていない現在のブランチに対して行われたすべてのコミットを見たいと思います[または、スクリプトなしでこれが不可能な場合、適用されていない1つのブランチ内のすべてのコミットをどのように確認しますか?別の与えられたブランチに?]。


2つのブランチ間の欠落しているコミットをリストするには、compare-branches.py bitbucket.org/aakef/compare-git-branchesを
Bernd Schubert

回答:


321

あなたはおそらくただ欲しい

git branch --contains branch-to-delete

これは、「branch-to-delete」からのコミットを含むすべてのブランチをリストします。「ブランチから削除」以上のものを報告する場合、ブランチはマージされています。

あなたの選択肢は、実際には単にrev-list構文のものです。たとえば git log one-branch..another-branch、すべてone-branchを持っている必要があるすべてを示していますanother-branch

git show-branch何がどこにあるかを確認する方法としても興味があるかもしれません。



1
行が誤って解釈される可能性が「それが何かを報告した場合、ブランチがマージされた」:場合git branch --contains some-branchにのみ戻りsome-branch、それはリターン何かをするが、それはしていないマージされて。
混乱

5
git log foo..barは、barの最新とfooの最新の間のコミットを表示しますが、それより前の時点で欠落している他のコミットは表示しないことに注意してください。fooではなくbarですべてを表示するには、@ jimmyorrのソリューションを使用する必要があります。
Paul A Jungwirth

556

あるブランチにあり、別のブランチにないコミットのリストを表示するには、git logを使用します。

git log --no-merges oldbranch ^newbranch

...つまり、newbranchにない oldbranch上のすべてのコミットのコミットログを表示します。複数のブランチをリストして、含めたり除外したりできます。例えば

git log  --no-merges oldbranch1 oldbranch2 ^newbranch1 ^newbranch2

注:Windowsでは^エスケープキーであるため、別のキーでエスケープする必要があります^

git log --no-merges oldbranch ^^newbranch

2
2つのブランチのgit compareコミットを探していることがわかりました。
ユーザー

25
これはまさに私が探していたものです。しかし、^ここで接頭辞として使用すると混乱しました。このコンテキストでは、そのブランチを除外することを意味します。^サフィックスとして使用すると、そのブランチの親コミットへの相対参照になります。
ジョーフリン

4
とても役に立ちました。気になるのですが、なぜ--no-mergesフラグが必要なのですか?確かにそれらのコミットも見たいですか?
Max MacLeod 2013

2
これでgitkを使用しますか?単にgitk oldbranch ^newbranch --no-merges(git 1.8.1.1でテスト済み)を使用します。サイドノート、私にとって^はブランチの包括的なヘッドコミットを意味しnewbranchます。
Matt

2
@NazariiGudzovatyi-はい、あります: "-cherry-pick"。ドキュメンテーションページの
膨大な

91

oldbranchではコミットを表示し、newbranchではコミットを表示しないようにするには:

git log newbranch..oldbranch

これらのコミットで差分を表示するには(3つのドットがあることに注意してください):

git diff newbranch...oldbranch

これは、図のイラスト付きのドキュメントですhttps://git-scm.com/book/en/v2/Git-Tools-Revision-Selection#Commit-Ranges


上記のPaul A Jungwirthのコメントを参照してください。これはいくつかの古いコミットを見逃すようです?
惨めな変数

2
古いコミットの意味がわかりません。二重ドットは基本的に、あるコミットから到達可能であるが別のコミットから到達できない一連のコミットを解決するようにGitに要求します。これはドキュメントのダイグラム図git-scm.com/book/en/v2/…です
Xuan

1
とのどちらnewbrancholdbranchを使用しているgit log ..oldbranch場合は、git log newbranch..それぞれを実行できます
YakovL

jimmyorrの解決策は私にはうまくいきませんでしたが、これ..は、refsの名前の間にある2つのドットのおかげでうまくいきました。また--cherry-pick、両方のブランチに存在するが、ハッシュが異なるコミットを非表示にするオプションを使用しました。これらのコミットは、一方のブランチから他方のブランチに厳選されたためです。
flawyte

58

まだ簡単な答えを探している人は、git cherryをチェックしてください。コミットハッシュの代わりに実際の差分を比較します。つまり、チェリーピックまたはリベースされたコミットに対応します。

まず、削除するブランチをチェックアウトします。

git checkout [branch-to-delete]

次にgit cherryを使用して、メインの開発ブランチと比較します。

git cherry -v master

出力例:

+ 8a14709d08c99c36e907e47f9c4dacebeff46ecb Commit message
+ b30ccc3fb38d3d64c5fef079a761c7e0a5c7da81 Another commit message
- 85867e38712de930864c5edb7856342e1358b2a0 Yet another message

注: -vフラグは、SHAハッシュとともにコミットメッセージを含めることです。

「+」が前にある行は削除するブランチにありますが、マスターブランチにはありません。前に「-」が付いているものは、マスターで同等のコミットがあります。

マスターにないコミットだけのために、チェリーピックとgrepを組み合わせます:

git cherry -v master | grep "^\+"

出力例:

+ 8a14709d08c99c36e907e47f9c4dacebeff46ecb Commit message
+ b30ccc3fb38d3d64c5fef079a761c7e0a5c7da81 Another commit message

私はこれを試しましたが、それでもmb(メインブランチ)にない多くのコミットがfb(機能ブランチ)にあると報告しています。ただし、fbでgit diff mbを実行しても、違いはありません。私はリベースを使用し、すべてを押しつぶしました。これが理由だと私はほぼ確信していますが、私は確信したいだけです。これが事実である場合、私は可能な限りつぶしを避けるつもりです。私は「失われた情報キャンプ」にいます。マージをリベースのように表示して、履歴をクリーンに保ち、情報を失うことのないログ表示モードを追加することは可能でしょうか。
Outis Von Nemo

1
ここでの正確なシナリオはわかりませんが、複数のコミットを1つにまとめ、それをコミットが別々の別のブランチと比較している場合、これは確実に機能しません。その場合、unix diffユーティリティを使用してさまざまなファイルを比較することもできます。または、一時的なブランチを作成して、元のブランチで行ったのと同じように、すべてのコミットを押しつぶして、これを使用することもできます。
Tim S

50

ここに投稿された回答のいくつかはあなたが探しているものを見つけるのに役立ちますが、gitブランチの次のサブコマンドは、あなたのタスクにより適したソリューションです。

--mergedは、HEADに完全に含まれているため、安全に削除できるすべてのブランチを見つけるために使用されます。

滞在中master1 1が安全にそうように、取り外し可能性が枝を列挙するためにコマンドを実行できます。

git branch --merged
  develop
  fpg_download_links
* master
  master_merge_static

# Delete local and remote tracking branches you don't want
git branch -d fpg_download_links
git push origin :fpg_download_links
git branch -d master_merge_static
git push origin :master_merge_static

# There is also a flag to specify remote branches in the output
git branch --remotes --merged

16

jimmyorrの回答はWindowsでは機能しません。そうでは--notなく代わりに使用すると役立ちます^

git log oldbranch --not newbranch --no-merges

4
正解です、+ 1。ただし、これ^はWindowsでサポートされていますが、エスケープする必要があることに注意してください。これは、Windowsでは(別の)^ですgit log oldbranch ^^newbranch --no-merges
VonC、2015年

3
具体的には、PowershellコンソールのWindowsで機能しますが、CMDに追加の「^」が必要です。
Rod

7

確認する必要がある1つの(単一の)ブランチである場合、たとえば、ブランチ 'B'がブランチ 'A'に完全にマージされるようにする場合は、次のようにするだけです。

$ git checkout A
$ git branch -d B

git branch -d <branchname> 「ブランチをHEADに完全にマージする必要がある」という安全性があります。

注意:これは、ブランチBがAにマージされた場合、実際にはブランチBを削除します。


3

この簡単なスクリプトを使用して、マージされていないコミットを確認できます

#!/bin/bash
# Show commits that exists only on branch and not in current
# Usage:
#   git branch-notmerge <branchname>
#
# Setup git alias
#   git config alias.branch-notmerge [path/to/this/script]
grep -Fvf <(git log --pretty=format:'%H - %s') <(git log $1 --pretty=format:'%H - %s')

ブランチの状態を表示するツールgit-wtfも使用できます


0

たとえばgit cherry、ブランチ内のすべてのコミットを選択するために使用するだけnewFeature42です:

git cherry -vマスターnewFeature42


-5

使用しているgitホスティングサービスを介してプルリクエストの作成を開始します。ブランチがベースブランチに完全にマージされている場合、新しいPRを作成することはできません。

実際にプルリクエストを行う必要はありません。ブランチを選択する最初のステップを使用してください。

たとえば、GitHubの場合:

比較するものはありません

マージされたブランチのPRを作成できません。

これはコマンドラインでgitを使用していませんが、別の難解なgitコマンドを覚えるのではなく、明確なメンタルモデルで自由に使用できる他のツールを使用すると役立つことがよくあります。

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