我有一个旧分支,我想删除它。但是,在这样做之前,我想检查对这个分支所做的所有提交是否在某个时候合并到了另一个分支中。因此,我想查看对我当前分支所做的所有提交,这些提交尚未应用于任何其他分支[或者,如果没有一些脚本就不可能,那么如何查看一个分支中尚未应用的所有提交到另一个给定的分支?]。
11 回答
要查看哪些提交在一个分支上但不在另一个分支上的列表,请使用 git log:
git log --no-merges oldbranch ^newbranch
...也就是说,显示旧分支上所有不在新分支上的提交的提交日志。您可以列出要包含和排除的多个分支,例如
git log --no-merges oldbranch1 oldbranch2 ^newbranch1 ^newbranch2
注意:在 Windows 命令提示符(不是 Powershell)^
上是一个转义键,所以它需要用另一个转义^
:
git log --no-merges oldbranch ^^newbranch
你可能只是想要
git branch --contains branch-to-delete
这将列出所有包含“分支到删除”提交的分支。如果它报告的不仅仅是“分支到删除”,则该分支已被合并。
您的替代方案实际上只是 rev-list 语法的东西。例如 git log one-branch..another-branch
显示one-branch
需要拥有的一切another-branch
。
您可能也有兴趣git show-branch
作为查看在哪里的一种方式。
要在 oldbranch 中而不是在 newbranch 中显示提交:
git log newbranch..oldbranch
要显示这些提交的差异(注意有三个点):
git diff newbranch...oldbranch
这是带有图表插图的文档https://git-scm.com/book/en/v2/Git-Tools-Revision-Selection#Commit-Ranges
对于那些仍在寻找简单答案的人,请查看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 中具有等效的提交。
对于不在 master 中的提交,将cherry pick 与 grep 结合起来:
git cherry -v master | grep "^\+"
示例输出:
+ 8a14709d08c99c36e907e47f9c4dacebeff46ecb Commit message
+ b30ccc3fb38d3d64c5fef079a761c7e0a5c7da81 Another commit message
虽然此处发布的一些答案将帮助您找到所需的内容,但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
jimmyorr 的答案在 Windows 上不起作用。它有助于使用--not
而不是^
像这样:
git log oldbranch --not newbranch --no-merges
如果您需要检查的是一个(单个)分支,例如,如果您希望分支“B”完全合并到分支“A”中,则只需执行以下操作:
$ git checkout A
$ git branch -d B
git branch -d <branchname>
具有“分支必须完全合并到 HEAD 中”的安全性。
注意:如果分支 B 合并到 A 中,这实际上会删除分支 B。
您可以使用这个简单的脚本来查看未合并的提交
#!/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来显示分支的状态
我也想计算提交,所以这里是如何做到这一点:
计算当前分支 ( ) 上有多少提交HEAD
,但不在master
:
git log --oneline ^master HEAD | wc -l
wc -l
意思是“字数”——计算'l'ines的数量。
当然要查看整个日志消息,正如其他答案给出的那样:
git log ^master HEAD
...或以浓缩--oneline
形式:
git log --oneline ^master HEAD
如果您也不想计算合并提交,则可以使用以下内容排除那些--no-merges
:
git log --oneline --no-merges ^master HEAD | wc -l
等等
显示other-branch
不在您当前分支中的提交和提交内容:
git show @..other-branch
此外,您可以将提交other-branch
直接应用到当前分支:
git cherry-pick @..other-branch
只需用于git cherry
选择分支中的所有提交,newFeature42
例如:
git cherry -v master newFeature42