我有一个旧分支,我想删除。 但是,在执行此操作之前,我想检查对此分支所做的所有提交是否在某个时刻合并到其他分支中。 因此,我希望看到所有提交到我当前分支的提交尚未应用于任何其他分支[或者,如果没有一些脚本,这是不可能的,如何看到一个分支中尚未应用的所有提交到另一个给定的分支?]。
#1楼
您可以使用此简单脚本查看未合并的提交
#!/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来显示分支状态
#2楼
你可能只是想要
git branch --contains branch-to-delete
这将列出包含“分支到删除”提交的所有分支。 如果它报告的不仅仅是“分支到删除”,则分支已合并。
你的替代品实际上只是rev-list语法的东西。 如git log one-branch..another-branch
表明一切one-branch
需要拥有的一切another-branch
了。
您可能也对git show-branch
感兴趣,以此来了解其中的内容。
#3楼
如果它是您需要检查的一个(单个)分支,例如,如果您希望该分支“B”完全合并到分支“A”中,您可以简单地执行以下操作:
$ git checkout A
$ git branch -d B
git branch -d <branchname>
具有“分支必须在HEAD中完全合并”的安全性。
注意 :如果将分支B合并到A中,这实际上会删除分支B.
#4楼
要在oldbranch中显示提交但不在newbranch中显示:
git log newbranch..oldbranch
通过这些提交显示差异(请注意有三个点):
git diff newbranch...oldbranch
这是带有图解说明的文档https://git-scm.com/book/en/v2/Git-Tools-Revision-Selection#Commit-Ranges
#5楼
jimmyorr的答案在Windows上不起作用。 它有助于使用--not
而不是^
像这样:
git log oldbranch --not newbranch --no-merges
#6楼
对于那些仍在寻找简单答案的人,请查看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
#7楼
要查看哪个提交在一个分支上但不在另一个分支上的列表,请使用git log:
git log --no-merges oldbranch ^newbranch
...也就是说,显示oldbranch上不在 newbranch上的所有提交的提交日志。 您可以列出多个分支以包含和排除,例如
git log --no-merges oldbranch1 oldbranch2 ^newbranch1 ^newbranch2
注意:在Windows上, ^
是一个转义键,因此需要使用另一个^
进行转义:
git log --no-merges oldbranch ^^newbranch
#8楼
开始通过您正在使用的git托管服务创建Pull请求 。 如果分支已完全合并到基本分支中,您将无法创建新PR。
您不需要实际发出拉取请求,只需使用选择分支的第一步。
例如,在GitHub上:
没有什么可比的
这不会在命令行上使用git,但我经常发现使用其他工具可以使用清晰的心智模型,而不是尝试记住另一个神秘的git命令。
#9楼
虽然这里发布的一些答案有助于找到您所寻求的内容,但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