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

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

269268 次浏览

你可能只是想

git branch --contains branch-to-delete
这将列出所有包含从“branch-to-delete”提交的分支。 如果它报告了不止"branch-to-delete",则该分支已被合并

你的替代方案实际上只是rev-list语法的东西。例:git log one-branch..another-branch显示了one-branch需要的所有东西,another-branch拥有的东西。

您可能还对git show-branch感兴趣,以便了解在哪里有什么。

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

$ git checkout A
$ git branch -d B

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

谨慎:这实际上删除了分支B,如果它合并到A。

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

git log --no-merges oldbranch ^newbranch

...也就是说,显示oldbranch上所有在newbranch上为的提交日志。您可以列出多个分支来包括和排除,例如。

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

注意:在Windows命令提示符(不是Powershell)中,^是一个转义键,所以需要用另一个^来转义:

git log --no-merges oldbranch ^^newbranch

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

#!/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来显示分支的状态

要显示oldbranch中的提交,而不是newbranch中的提交:

git log newbranch..oldbranch

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

git diff newbranch...oldbranch

下面是带有图表说明的文档https://git-scm.com/book/en/v2/Git-Tools-Revision-Selection#Commit-Ranges

jimmyorr的回答不能在Windows上工作。它有助于使用--not而不是^,就像这样:

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

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

首先签出你想要删除的分支:

# EYZ0

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

# EYZ0

示例输出:

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

注意:-v标志将包含提交消息和SHA散列。

前面带“+”的行在要删除的分支中,但不在主分支中。前面有'-'的在master中有相同的commit。

对于不在master中的JUST提交,将cherry pick和grep结合起来:

# EYZ0

示例输出:

+ 8a14709d08c99c36e907e47f9c4dacebeff46ecb Commit message
+ b30ccc3fb38d3d64c5fef079a761c7e0a5c7da81 Another commit message

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

git cherry -v master newFeature42

显示从other-branch提交并提交不在当前分支中的内容:

git show @..other-branch

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

git cherry-pick @..other-branch

我想要的提交,所以这里是如何做到这一点:

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

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

wc -l的意思是“字数”——数“l”的个数。

当然,还可以看到整个日志消息,正如其他答案所给出的:

git log ^master HEAD

...或以--oneline的压缩形式:

git log --oneline ^master HEAD

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

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

等。