我有一个旧的分支,我想删除它。但是,在执行此操作之前,我想检查一下对该分支所做的所有提交是否都已合并到其他分支中。因此,我想查看对当前分支所做的所有提交,这些提交尚未应用到任何其他分支[或者,如果没有一些脚本无法实现,那么如何查看一个分支中尚未应用的所有提交?到另一个给定的分支?]。
我有一个旧的分支,我想删除它。但是,在执行此操作之前,我想检查一下对该分支所做的所有提交是否都已合并到其他分支中。因此,我想查看对当前分支所做的所有提交,这些提交尚未应用到任何其他分支[或者,如果没有一些脚本无法实现,那么如何查看一个分支中尚未应用的所有提交?到另一个给定的分支?]。
Answers:
你可能只想
git branch --contains branch-to-delete
这将列出所有包含“分支到删除”中的提交的分支。如果报告的不只是“分支删除”,则分支已合并。
您的选择实际上只是rev-list语法。例如, git log one-branch..another-branch
显示one-branch
需要拥有的一切another-branch
。
您可能也很感兴趣,git show-branch
可以看到什么在哪里。
git branch --contains some-branch
只回报some-branch
,那么它的回报的东西,但它没有被合并。
git log foo..bar
将显示bar的最新和foo的最新之间的提交,但不会显示更远的其他提交。要查看bar中的所有内容,但不查看foo中的所有内容,则应使用@jimmyorr的解决方案。
要查看哪些提交在一个分支上但不在另一个分支上的列表,请使用git log:
git log --no-merges oldbranch ^newbranch
...也就是说,显示旧分支上所有不在新分支上的提交的提交日志。您可以列出要包含和排除的多个分支,例如
git log --no-merges oldbranch1 oldbranch2 ^newbranch1 ^newbranch2
注意:在Windows上^
是转义键,因此需要使用另一个转义键^
:
git log --no-merges oldbranch ^^newbranch
^
这里使用前缀作为使我感到困惑。在这种情况下,它意味着排除该分支。使用^
作为后缀将是一个相对引用到母体提交该分支的。
gitk oldbranch ^newbranch --no-merges
(经git 1.8.1.1测试)。旁注,对我而言,^
意味着branch的HEAD提交newbranch
。
要在旧分支而不是新分支中显示提交:
git log newbranch..oldbranch
要通过这些提交显示差异(请注意有三个点):
git diff newbranch...oldbranch
这是带有图解说明的文档https://git-scm.com/book/en/v2/Git-Tools-Revision-Selection#Commit-Ranges
newbranch
或oldbranch
,我们可以做git log ..oldbranch
或git log newbranch..
分别
..
了裁判名字之间的两个点。我还使用了该--cherry-pick
选项来隐藏两个分支上都存在但具有不同哈希值的提交,因为它们是从一个分支到另一个分支的精心挑选的。
对于那些仍在寻找简单答案的人,请查看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中具有等效的提交。
对于只是不在母版中的提交,请结合使用Cherry Pick和grep:
git cherry -v master | grep "^\+"
输出示例:
+ 8a14709d08c99c36e907e47f9c4dacebeff46ecb Commit message
+ b30ccc3fb38d3d64c5fef079a761c7e0a5c7da81 Another commit message
diff
实用程序来比较各种文件。或者,您可以创建一个临时分支并以与原始分支类似的方式压缩所有提交,然后使用它,我认为这是可行的。
虽然此处发布的一些答案将帮助您找到所需的内容,但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
^
Windows支持该功能,但需要对其进行转义,而在Windows中则是^
:git log oldbranch ^^newbranch --no-merges
。
如果您需要检查的是一个(单个)分支,例如,如果您希望该分支“ B”完全合并到分支“ A”中,则只需执行以下操作:
$ git checkout A
$ git branch -d B
git branch -d <branchname>
具有“必须在HEAD中完全合并分支”的安全性。
注意:如果分支B合并到A中,则实际上会删除它。
您可以使用这个简单的脚本来查看未合并的提交
#!/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来显示分支的状态