使用Git,显示所有提交在一个分支,但不是其他(S)

我有一个老分支,我想删除它。 但是,在这样做之前,我想检查一下对这个分支所做的所有提交是否在某个点被合并到了另一个分支。 因此,我希望看到对当前分支所做的所有未提交给其他分支的提交[或者,如果没有某个脚本,这是不可能的,那么如何看一个分支中所有未提交的提交到另一个给定的分支?]。

你可能只是想要

git branch --contains branch-to-delete 

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

你的select真的只是rev-list语法的东西。 例如git log one-branch..another-branch显示one-branch需要拥有another-branch具有的一切。

你也可能对git show-branch感兴趣,以此来看看在哪里。

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

 git log oldbranch ^newbranch --no-merges 

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

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

注意:在Windows上^是一个转义键,所以它需要与另一个^转义:

 git log oldbranch ^^newbranch --no-merges 

虽然在这里发布的一些答案将有助于find你所寻找的,下面的git分支的子命令是一个更适合你的任务的解决scheme。

–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 

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

 git log newbranch..oldbranch 

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

 git diff newbranch...oldbranch 

这是带图示的文档https://git-scm.com/book/en/v2/Git-Tools-Revision-Selection#Commit-Ranges

对于那些仍然在寻找一个简单的答案,看看git樱桃 。 它比较实际差异而不是提交哈希。 这意味着它可以容纳樱桃挑选或重新挑选的提交。

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

git checkout [branch-to-delete]

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

git cherry -v master

示例输出:

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

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

前面带有“+”的行在分支删除中,但不在主分支中。 那些在前面加“ – ”的人在主文件中有相同的提交。

对于不是主人的提交,将cherry pick和grep结合起来:

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

示例输出:

 + 8a14709d08c99c36e907e47f9c4dacebeff46ecb Commit message + b30ccc3fb38d3d64c5fef079a761c7e0a5c7da81 Another commit message 

jimmyorr的答案不适用于Windows。 它有助于使用 – 而不是^像这样:

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

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

 $ git checkout A $ git branch -d B 

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

请注意 ,这实际上是删除分支,如果它合并在,

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

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

要列出两个分支之间缺less的提交,可以使用compare-branches.py

https://bitbucket.org/aakef/compare-git-branches

通过您使用的git托pipe服务创build合并请求 。 如果分支已经完全合并到基本分支中,您将无法创build新的PR。

例如,在GitHub上:

没有什么可比较的

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

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