我在本地分支中有一个提交xyz,我想检查它是否包含在远程发布存储库中;我能以一些简单的方式做到吗?我可以克隆远程仓库,但我希望有一个更好的+更快的方式。 git ls-remote
似乎很有希望,但在那里找不到任何有价值的东西。谢谢!
答案 0 :(得分:77)
假设引用远程存储库的远程调用origin
。在这种情况下,首先使用以下命令更新所有远程跟踪分支
git fetch origin
现在,您可以使用有用的--contains
选项git branch
来查找哪些远程分支包含该提交:
git branch -r --contains xyz
(-r
表示仅显示远程跟踪分支。)如果提交xyz
包含在一个或多个远程跟踪分支中,您将看到如下输出:
origin/test-suite
origin/HEAD -> origin/master
origin/master
如果它包含在您的本地存储库中,但不包含其中一个远程跟踪分支,则输出将为空。但是,如果您的存储库中根本不知道该提交,您将收到错误malformed object name
和使用消息 - 如果您不期望它,可能会有点混乱。 ..
答案 1 :(得分:10)
git branch -a --contains commitish
但是,请注意包含樱桃挑选/重新定位/合并版本的提交的分支。
这可以派上用场
git log --cherry-pick --left-right <commitish> ^remote/branchname
如果在远程分支中不存在(作为cherrypick),它将列出提交 ONLY 。有关--cherry-pick如何识别等效提交的说明,请参阅日志手册页
当然,无法像这样自动检测出具有冲突解决方案或南瓜的合并/重组
答案 2 :(得分:1)
现有答案要求将整个远程存储库下载到本地。如果远程有许多尚未本地克隆的提交,则可能需要很长时间。一个例子是类似linux-stable的存储库,它具有许多从未合并的独立分支。跟踪 a 稳定内核的人可能只克隆该内核的单个分支。需要为每个稳定系列内核获取所有分支,以查看提交是否存在,这将需要下载更多数据。
在没有获取整个远程仓库的情况下,似乎不是一个好方法。该功能基于git fetch-pack
和git send-pack
的工作方式而存在,但似乎没有一种以期望的方式使用它的方式。
将分支推送到远程存储库不会上传远程已具有的提交,而无需先下载整个远程存储库即可完成。尝试获取远程提交并不需要下载整个远程存储库即可确定所请求的提交是否存在。
在某些情况下,后者可用于实现要求的功能。
git fetch origin <commit ID>
如果遥控器没有该提交,则失败。无需在本地克隆远程存储库即可。如果远程确实具有提交,则它将获取它。别无选择,只能查看获取是否可以工作,而不能获取任何东西。当然,如果提交已经在本地可用,则不需要获取任何内容,这不是一项昂贵的操作。
某些远程存储库不允许请求不是分支头或标记头的内容。在这种情况下,这将行不通。