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

时间:2009-11-10 20:17:15

标签: git branch git-branch

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

12 个答案:

答案 0 :(得分:481)

要查看哪个提交在一个分支上但不在另一个分支上的列表,请使用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

答案 1 :(得分:273)

你可能只想要

git branch --contains branch-to-delete

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

你的替代品实际上只是rev-list语法的东西。例如git log one-branch..another-branch显示one-branch需要拥有another-branch所有内容的所有内容。

您可能也会对git show-branch感兴趣,以了解其中的内容。

答案 2 :(得分:75)

显示oldbranch中的提交但不显示在newbranch中:

git log newbranch..oldbranch

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

git diff newbranch...oldbranch

以下是带有图示https://git-scm.com/book/en/v2/Git-Tools-Revision-Selection#Commit-Ranges

的文档

答案 3 :(得分:49)

虽然这里发布的一些答案有助于找到您所寻求的内容,但 git branch 的以下子命令对您的任务来说是更合适的解决方案。

--merged is used to find all branches which can be safely deleted, since those branches are fully contained by 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

答案 4 :(得分:49)

对于那些仍在寻找简单答案的人,请查看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中有相同的提交。

对于JUST不在master中的提交,将cherry pick与grep:

结合起来

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

示例输出:

+ 8a14709d08c99c36e907e47f9c4dacebeff46ecb Commit message
+ b30ccc3fb38d3d64c5fef079a761c7e0a5c7da81 Another commit message

答案 5 :(得分:15)

jimmyorr's answer无法在Windows上运行。使用--not代替^就像这样:

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

答案 6 :(得分:7)

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

$ git checkout A
$ git branch -d B

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

警告:如果将分支B合并到A中,这实际上会删除分支B.

答案 7 :(得分: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

答案 8 :(得分:0)

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

git cherry -v master newFeature42

答案 9 :(得分:0)

显示不在当前分支中的来自 other-branch 的提交和提交内容:

git show @..other-branch

此外,您可以将来自 other-branch 的提交直接应用到您当前的分支:

git cherry-pick @..other-branch

答案 10 :(得分:0)

我也想计算提交次数,因此方法如下:

计算当前分支 (HEAD) 上有多少提交,但不在 master 上:

git log --oneline ^master HEAD | wc -l

wc -l 的意思是“字数”——计算“行”的数量。

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

git log ^master HEAD

...或以简化的 --oneline 形式:

git log --oneline ^master HEAD

如果你也不想计算合并提交,你可以用 --no-merges 排除那些:

git log --oneline --no-merges ^master HEAD | wc -l

答案 11 :(得分:-3)

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

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

例如,在GitHub上:

  

没有可比较的内容

Can't create a PR for branches that have been merged.

这不会在命令行中使用git,但我经常发现使用其他工具可以使用清晰的心理模型,而不是尝试记住另一个神秘的git命令。