使用Git,显示一个分支中的所有提交,而不显示其他分支中的所有提交


463

我有一个旧的分支,我想删除它。但是,在执行此操作之前,我想检查一下对该分支所做的所有提交是否都已合并到其他分支中。因此,我想查看对当前分支所做的所有提交,这些提交尚未应用到任何其他分支[或者,如果没有一些脚本无法实现,那么如何查看一个分支中尚未应用的所有提交?到另一个给定的分支?]。


要列出两个分支之间的缺失提交,您可以使用compare-branches.py bitbucket.org/aakef/compare-git-branches
Bernd Schubert,

Answers:


319

你可能只想

git branch --contains 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,那么它的回报的东西,但它没有被合并。
混乱2012年

5
请注意,这git log foo..bar将显示bar的最新和foo的最新之间的提交,但不会显示更远的其他提交。要查看bar中的所有内容,但不查看foo中的所有内容,则应使用@jimmyorr的解决方案。
Paul A Jungwirth,2014年

555

要查看哪些提交在一个分支上但不在另一个分支上的列表,请使用git log:

git log --no-merges oldbranch ^newbranch

...也就是说,显示旧分支上所有不在新分支上的提交的提交日志。您可以列出要包含和排除的多个分支,例如

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

注意:在Windows上^是转义键,因此需要使用另一个转义键^

git log --no-merges oldbranch ^^newbranch

2
我发现它正在寻找两个分支的git compare提交。
用户

25
这正是我想要的。但是,^这里使用前缀作为使我感到困惑。在这种情况下,它意味着排除该分支。使用^作为后缀将是一个相对引用到母体提交该分支的。
乔·弗林

4
非常有用的感谢。我很好奇,为什么--no-merger标志是必需的?当然有人也想看看那些承诺吗?
Max MacLeod

2
想与此一起使用gitk吗?只需使用gitk oldbranch ^newbranch --no-merges(经git 1.8.1.1测试)。旁注,对我而言,^意味着branch的HEAD提交newbranch
马特

2
@NazariiGudzovatyi-是的,有:“-pick”。文档页面
romeara

91

要在旧分支而不是新分支中显示提交:

git log newbranch..oldbranch

要通过这些提交显示差异(请注意有三个点):

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 ..oldbranchgit log newbranch..分别
YakovL

jimmyorr的解决方案对我不起作用,但是这个感谢..了裁判名字之间的两个点。我还使用了该--cherry-pick选项来隐藏两个分支上都存在但具有不同哈希值的提交,因为它们是从一个分支到另一个分支的精心挑选的。
6

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哈希。

在要删除的分支中,最前面带有“ +”的行,但不在主分支中。那些前面带有“-”的名称在master中具有等效的提交。

对于只是不在母版中的提交,请结合使用Cherry Pick和grep:

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

输出示例:

+ 8a14709d08c99c36e907e47f9c4dacebeff46ecb Commit message
+ b30ccc3fb38d3d64c5fef079a761c7e0a5c7da81 Another commit message

我已经尝试过了,但是它仍然报告说fb(功能分支)中有很多提交,而mb(主分支)中没有。但是,如果我在fb中执行git diff mb,则看不到任何区别。我确实使用了rebase并压缩了所有内容。我几乎可以肯定这就是为什么,但是我只是想确定一下。如果是这种情况,那么我将尽可能避免挤压。我在“不丢失信息营地”。我想知道是否有可能添加一种日志显示模式,该模式可以显示合并,就好像合并是重新设置基准一样,以保持历史记录的清洁,并且不会丢失任何信息。
Outis Von Nemo

1
在这里不确定您的确切情况,但是如果您将多个提交压缩在一起,并且将其与单独提交的另一个分支进行比较,那么这绝对是行不通的。在这种情况下,您可能只想使用unix diff实用程序来比较各种文件。或者,您可以创建一个临时分支并以与原始分支类似的方式压缩所有提交,然后使用它,我认为这是可行的。
Tim S

50

虽然此处发布的一些答案将帮助您找到所需的内容,但git branch的以下子命令是更适合您任务的解决方案。

--merged用于查找可以安全删除的所有分支,因为这些分支完全由HEAD包含。

虽然master可以运行命令来枚举分支,但是可以安全地删除分支,如下所示:

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

3
具体来说,它确实可以在Windows中的Powershell控制台中工作,但在CMD中需要额外的“ ^”。
2015年

7

如果您需要检查的是一个(单个)分支,例如,如果您希望该分支“ B”完全合并到分支“ A”中,则只需执行以下操作:

$ git checkout A
$ git branch -d B

git branch -d <branchname> 具有“必须在HEAD中完全合并分支”的安全性。

注意:如果分支B合并到A中,则实际上会删除它。


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 master newFeature42


-5

开始创建拉取请求通过您正在使用的git托管服务。如果分支已完全合并到基础分支中,则将无法创建新的PR。

您实际上不需要发出拉取请求,只需使用选择分支的第一步即可。

例如,在GitHub上:

没有什么可比较的

无法为已合并的分支创建PR。

这并没有在命令行上使用git,但是我经常发现使用清晰可见的思维模型使用其他工具很有帮助,而不是尝试记住另一个神秘的git命令。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.