使用Git,显示一个分支中的所有提交,但不显示另一个分支中的所有提交

使用Git,显示一个分支中的所有提交,但不显示另一个分支中的所有提交,git,branch,git-branch,Git,Branch,Git Branch,我有一个旧的分支,我想删除它。但是,在执行此操作之前,我想检查对该分支所做的所有提交是否在某个点合并到其他分支中。因此,我希望看到对我的当前分支所做的所有提交都没有应用到任何其他分支[或者,如果没有一些脚本,这是不可能的,那么如何看到一个分支中所有没有应用到另一个给定分支的提交?)。您可能只是想知道 git branch --contains branch-to-delete 这将列出包含从“要删除的分支”提交的所有分支。 如果报告的不仅仅是“要删除的分支”,则该分支已被合并 你的备选方案实际

我有一个旧的分支,我想删除它。但是,在执行此操作之前,我想检查对该分支所做的所有提交是否在某个点合并到其他分支中。因此,我希望看到对我的当前分支所做的所有提交都没有应用到任何其他分支[或者,如果没有一些脚本,这是不可能的,那么如何看到一个分支中所有没有应用到另一个给定分支的提交?)。

您可能只是想知道

git branch --contains branch-to-delete
这将列出包含从“要删除的分支”提交的所有分支。 如果报告的不仅仅是“要删除的分支”,则该分支已被合并

你的备选方案实际上只是rev-list语法。e、 g.
git记录一个分支..另一个分支
显示一个分支需要拥有另一个分支拥有的一切

您可能还对git show branch感兴趣,以查看其位置。

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

$ git checkout A
$ git branch -d B
git branch-d
具有“分支必须完全合并到头部”的安全性


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

要查看提交在一个分支上而不是另一个分支上的列表,请使用git日志:

git log --no-merges oldbranch ^newbranch
…也就是说,显示oldbranch上所有提交的提交日志,这些提交在newbranch上是而不是。您可以列出要包括和排除的多个分支,例如

git log  --no-merges oldbranch1 oldbranch2 ^newbranch1 ^newbranch2
注意:Windows上的
^
是一个转义键,因此需要使用另一个
^
转义:

git log --no-merges oldbranch ^^newbranch

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

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

可以使用此简单脚本查看未合并的提交

#!/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')
#/bin/bash
#显示仅存在于分支上而不存在于当前分支中的提交
#用法:
#git分支不合并
#
#设置git别名
#git config alias.branch-notmerge[path/to/this/script]

grep-Fvf要在oldbranch中而不是在newbranch中显示提交,请执行以下操作:

git log newbranch..oldbranch
要通过这些提交来显示差异(注意有三个点):

这是带有图表说明的文档

在Windows上不起作用。使用
--not
而不是
^
会有所帮助,如下所示:

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

对于那些仍在寻找简单答案的人,请查看。它比较实际的差异,而不是提交哈希。这意味着它可以容纳已被严格挑选或重定基础的提交

首先签出要删除的分支:

git签出[要删除的分支机构]

然后使用git cherry将其与您的主要开发分支进行比较:

git show @..other-branch
git cherry-pick @..other-branch
git cherry-v master

示例输出:

+ 8a14709d08c99c36e907e47f9c4dacebeff46ecb Commit message
+ b30ccc3fb38d3d64c5fef079a761c7e0a5c7da81 Another commit message
- 85867e38712de930864c5edb7856342e1358b2a0 Yet another message
+ 8a14709d08c99c36e907e47f9c4dacebeff46ecb Commit message
+ b30ccc3fb38d3d64c5fef079a761c7e0a5c7da81 Another commit message
注意:
-v
标志包括提交消息和SHA散列

前面带“+”的行位于要删除的分支中,但不在主分支中。前面有“-”的那些在master中有一个等价的commit

对于不在master中的提交,请将cherry pick与grep结合使用:

git cherry-v master | grep“^\+”

示例输出:

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

只需使用
git cherry
来选择分支
newFeature42
中的所有提交,例如:


git cherry-v master newFeature42

显示提交和来自
其他分支
但不在当前分支中的提交内容:

git show @..other-branch
git cherry-pick @..other-branch
此外,您还可以将来自
其他分支的提交直接应用于当前分支:

git show @..other-branch
git cherry-pick @..other-branch

我还想对提交进行计数,下面是如何做到这一点:

计算当前分支(
HEAD
)上但不在
master
上的提交数:

git日志--oneline^master HEAD | wc-l
wc-l
表示“字数”——计算“l”行的数量

当然,要查看整个日志消息,正如其他答案所给出的:

git日志^master头
…或以浓缩的
--单行
形式:

git日志--oneline^主头
如果您也不想计算合并提交的数量,则可以排除那些具有
--无合并的提交:

git日志--一行--无合并^master HEAD | wc-l

等等。另请参见“如果它报告了某些内容,则分支已合并”这一行可能会被误解:如果
git branch--包含某些分支
仅返回
some branch
,则它确实返回了一些内容,但尚未合并。请注意,
git log foo..bar
将显示bar的最新版本和foo的最新版本之间的提交,但并没有其他的承诺从更久远的时间里消失。要查看bar中的所有内容,而不是foo中的所有内容,应该使用@jimmyorr的解决方案。我在查找两个分支的git compare提交时发现了它。这正是我要查找的。但是,在这里使用
^
作为前缀让我感到困惑。在此上下文中,它意味着排除该分支。使用
^
作为后缀将是对该分支的父提交的相对引用。非常有用,谢谢。我很好奇,为什么不需要合并标志?当然,你也想看到这些提交?想用gitk来做这个吗?只需使用
gitkoldbranch^newbranch--no merges
(使用git1.8.1.1测试)。旁注,对我来说,
^
意味着分支机构
newbranch
的包含性负责人提交。谢谢@jimmyor,作为旁注,在PowerShell中使用PoshGit时,我在windows中不需要^^^。我只需要看看上面。看来这会错过一些旧的承诺?我不知道旧的承诺是什么意思。双点基本上要求Git解析一系列的提交,这些提交可以通过一次提交而不是ar来访问