我有一个旧分支,想要删除它。但在这样做之前,我想要检查所有提交到该分支的提交是否曾经合并到其他分支中。因此,我想要查看所有提交到当前分支的提交,且这些提交没有被应用到任何其他分支中[或者,如果没有脚本,如何查看一个分支中所有没有应用到另一个指定分支的提交?]。
我有一个旧分支,想要删除它。但在这样做之前,我想要检查所有提交到该分支的提交是否曾经合并到其他分支中。因此,我想要查看所有提交到当前分支的提交,且这些提交没有被应用到任何其他分支中[或者,如果没有脚本,如何查看一个分支中所有没有应用到另一个指定分支的提交?]。
要查看一个分支上有哪些提交而另一个分支上没有的提交,请使用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
^
作为前缀让我感到困惑。在这个上下文中,它的意思是排除那个分支。使用 ^
作为后缀则表示相对于该分支的父提交。 - Joe Flynn你可能只是想要
git branch --contains branch-to-delete
这将列出包含“要删除的分支”提交的所有分支。如果它报告的不仅仅是“要删除的分支”,则该分支已合并。git log one-branch..another-branch
显示了需要一切another-branch
具有的一切one-branch
的内容。git show-branch
感兴趣,这是一种查看各个分支的方法。git log foo..bar
会显示在bar最新版本和foo最新版本之间的提交记录,但不包括较早时间段中缺失的其他提交记录。要查看bar中存在而foo中不存在的所有内容,您应该使用@jimmyorr的解决方法。 - Paul A Jungwirthgit branch --merged
,它会显示所有已合并到当前分支的分支(可以安全删除它们)。显然,在进行变基/压缩操作时,这两种方法都会失败。 - undefined展示旧分支中存在但新分支中不存在的提交记录:
git log newbranch..oldbranch
展示这些提交之间的差异(请注意有三个点):
git diff newbranch...oldbranch
这里是带有图示的文档https://git-scm.com/book/zh/v2/Git-工具-修订版本选择#commit-ranges
newbranch
或 oldbranch
中的任意一个,我们可以分别执行 git log ..oldbranch
或 git log newbranch..
。 - YakovL如果您仍在寻找简单的答案,请查看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散列一起包括在内。git cherry -v master | grep "^\+"
示例输出:+ 8a14709d08c99c36e907e47f9c4dacebeff46ecb Commit message
+ b30ccc3fb38d3d64c5fef079a761c7e0a5c7da81 Another commit message
diff
实用程序来比较各个文件。或者,您可以创建一个临时分支,并将所有提交压缩到其中,类似于原始分支所做的操作,然后使用此方法,我认为会起作用。 - Tim Sgit 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中,另外一个转义符就是 ^
:git log oldbranch ^^newbranch --no-merges
。 - VonC如果您只需要检查一个分支,例如如果您想要将分支'B'完全合并到分支'A'中,您可以简单地执行以下操作:
$ git checkout A
$ git branch -d B
git branch -d <branchname>
带有“必须完全合并到HEAD中的分支”的安全性。
注意:如果分支B已经合并到A中,该命令将实际删除该分支。
我也想要计算提交次数,以下是如何实现:
统计当前分支 (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
etc.
#!/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')
other-branch
的提交和提交内容,这些内容不在您当前的分支中:git show @..other-branch
此外,您可以直接将other-branch
的提交应用到当前分支:
git cherry-pick @..other-branch