使用Git,显示一个分支中的所有提交,但不显示其他分支中的所有提交

sir*_*ton 430 git branch git-branch

我有一个旧分支,我想删除.但是,在执行此操作之前,我想检查对此分支所做的所有提交是否在某个时刻合并到其他分支中.因此,我希望看到所有提交到我当前分支的提交尚未应用于任何其他分支[或者,如果没有一些脚本,这是不可能的,如何看到一个分支中尚未应用的所有提交到另一个给定的分支?].

jim*_*orr 518

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

git log --no-merges oldbranch ^newbranch
Run Code Online (Sandbox Code Playgroud)

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

git log  --no-merges oldbranch1 oldbranch2 ^newbranch1 ^newbranch2
Run Code Online (Sandbox Code Playgroud)

注意:在Windows上^是一个转义键,因此需要使用另一个转义^:

git log --no-merges oldbranch ^^newbranch
Run Code Online (Sandbox Code Playgroud)

  • 这正是我所寻找的.但是,使用`^`作为前缀让我很困惑.在这种情况下,它意味着排除该分支.使用`^`作为后缀将是对该分支的父提交的相对引用. (23认同)
  • 非常有用的谢谢.我很好奇,为什么--no-merges标志是必要的?当然有人想看到这些提交吗? (4认同)
  • 我发现它正在寻找两个分支的git比较提交. (2认同)
  • 想用这个gitk吗?只需使用`gitk oldbranch ^ newbranch --no-merges`(使用git 1.8.1.1测试).旁注,对我来说`^`表示分支`newbranch`的包含HEAD提交. (2认同)
  • @NazariiGudzovatyi - 是的,有:"-cherry-pick".登录[文档页面]有很多选项(http://git-scm.com/docs/git-log) (2认同)
  • 谢谢@jimmyor,作为一个侧面说明,在PowerShell中使用PoshGit时,我不需要Windows中的^^。我只需要^ (2认同)
  • 这是一个很好的答案,但是`oldbranch`和`newbranch`对我来说有点令人困惑.我建议使用`branch_withcommits`和`branch_missingcommits`之类的东西,即使它有点冗长,因为它会立即清楚命令正在寻找什么.我自己编辑,但这是一个非常重要的改变,以先发制人的方式.你介意我做这个改变(或者你能自己做)吗? (2认同)
  • 或者,为了澄清`^`的含义,我们可以用`^ excludebranch`替换`^ newbranch`. (2认同)

Dus*_*tin 295

你可能只是想要

git branch --contains branch-to-delete
Run Code Online (Sandbox Code Playgroud)

这将列出包含"分支到删除"提交的所有分支.如果它报告的不仅仅是"分支到删除",则分支已合并.

你的替代品实际上只是rev-list语法的东西.例如, git log one-branch..another-branch显示one-branch需要拥有一切的所有东西another-branch.

您可能也有兴趣git show-branch了解哪里是什么.

  • 请注意,`git log foo..bar`将显示bar的最新和foo最新之间的提交,但不会显示其他提交的更新时间.要查看bar中的所有内容而不是foo中的内容,您应该使用@jimmyorr的解决方案. (3认同)
  • +1.另见http://stackoverflow.com/questions/850607/difference-in-git-log-origin-master-vs-git-log-origin-master (2认同)

Xua*_*uan 86

要在oldbranch中显示提交但不在newbranch中显示:

git log newbranch..oldbranch
Run Code Online (Sandbox Code Playgroud)

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

git diff newbranch...oldbranch
Run Code Online (Sandbox Code Playgroud)

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

  • 我不确定旧提交的含义。双点基本上要求Git解决一个提交可以到达但另一个提交不能到达的提交范围。这是带有图例说明的文档http://git-scm.com/book/en/v2/Git-Tools-Revision-Selection#Commit-Ranges (2认同)

Tim*_*m S 52

对于那些仍在寻找简单答案的人,请查看git cherry.它比较实际差异而不是提交哈希值.这意味着它可以容纳已被挑选或重新定位的提交.

首先签出要删除的分支:

git checkout [branch-to-delete]

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

git cherry -v master

示例输出:

+ 8a14709d08c99c36e907e47f9c4dacebeff46ecb Commit message
+ b30ccc3fb38d3d64c5fef079a761c7e0a5c7da81 Another commit message
- 85867e38712de930864c5edb7856342e1358b2a0 Yet another message
Run Code Online (Sandbox Code Playgroud)

注意:该-v标志包括提交消息以及SHA哈希.

前面带有"+"的行在分支到删除中,但不在主分支中.前面带有' - '的人在master中有相同的提交.

对于JUST不在master中的提交,将cherry pick与grep结合起来:

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

示例输出:

+ 8a14709d08c99c36e907e47f9c4dacebeff46ecb Commit message
+ b30ccc3fb38d3d64c5fef079a761c7e0a5c7da81 Another commit message
Run Code Online (Sandbox Code Playgroud)

  • 不确定您在这里的确切情况,但是如果您将多个提交合并为一个,并将其与提交分开的另一个分支进行比较,这肯定行不通。在这种情况下,您可能只想使用 unix `diff` 实用程序来比较各种文件。或者,您可以创建一个临时分支并压缩所有提交,类似于您对原始分支所做的操作,然后使用它,我认为这会起作用。 (2认同)

Fre*_*die 50

虽然这里发布的一些答案有助于找到您所寻求的内容,但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
Run Code Online (Sandbox Code Playgroud)


seb*_*eck 15

jimmyorr的答案在Windows上不起作用.它有助于使用--not而不是^像这样:

git log oldbranch --not newbranch --no-merges
Run Code Online (Sandbox Code Playgroud)

  • 这是正确的,+ 1.请注意,虽然在Windows上支持`^`,但需要进行转义,在Windows中,它是(另一个)`^`:`git log oldbranch ^^ newbranch --no-merges`. (4认同)
  • 具体来说,它在Powershell控制台的Windows中可以正常工作,但在CMD中需要额外的"^". (3认同)

Jak*_*ski 7

如果它是您需要检查的一个(单个)分支,例如,如果您希望该分支"B"完全合并到分支"A"中,您可以简单地执行以下操作:

$ git checkout A
$ git branch -d B
Run Code Online (Sandbox Code Playgroud)

git branch -d <branchname> 具有"分支必须在HEAD中完全合并"的安全性.

注意:如果将分支B合并到A中,这实际上会删除分支B.