git - 识别 merge 到master

标签 git version-control merge

给定 master 分支历史中的提交 X,我想确定该提交包含到 master 中的 merge 。换句话说,我想找到最大的 i 使得 Xmaster~i 的祖先,即 i 第一个父链上 master 的第 th 个祖先。 (这假设 merge 到 master 将以前的 master 作为第一个父级,这通常是 afaik 的情况。)这如何有效地完成?

例子

举个例子,假设我有以下历史:

A - B - C - D - E - F - G - H
     \       \     /   /
      I -[J]- K - L - M
       \         /
        N - O - P

当我想知道什么时候 J git merge 到 master 时(上行),我希望命令返回 F。因为从 H 开始,只有第一个父级的历史是 H - G - F - E - … 并且 J 的祖先F 但不是 E 的祖先。只是在 J..H 范围内寻找最近的 merge 是不够的,因为我不想找到 KL。由于 LF 的第二个父级,因此这两个都不是 H 的仅第一父级历史的一部分。

最佳答案

怎么样:

git log --oneline --merges -1  [<rev range>]

这将列出当前分支的第一个 merge 提交,或者如果您将其作为 rev 范围,则从提交 X 开始。评论git help log变甜并上 table 。


更新以关注已澄清的问题

额外的技术是使用

git merge-base --is-ancestor <commit> <commit>

这将根据祖先返回 true/false(例如 https://stackoverflow.com/a/13526591/717355)。

所以首先在 master 上生成你的第一个父 merge 列表,或者排除相关提交可以到达的提交,或者使用日期和 --since=<commiter_date>选项。然后对于每个顺序(通常是最旧的),检查您的提交是否是给定 merge 提交的祖先。您可以使用以下 bash 脚本:

for merge in $(git rev-list --reverse --first-parent --merges "${commit}"..master)
do if git merge-base --is-ancestor "${commit}" "${merge}"
   then git show -s "${merge}"
        break
   fi
done

关于git - 识别 merge 到master,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39144006/

相关文章:

version-control - 典型的最佳实践 ClearCase 项目结构

merge - 如何正确合并两个 bzr 分支?

r - 向上合并行,同时缺少列单元格中的值

c# - Libgit2Sharp : Get files associated with the initial (first) commit

node.js - 在 Azure 上部署 Hexo.. 不知道我错过了什么

git - 在没有打开编辑器窗口的情况下修改 Mercurial 提交?

version-control - TFS checkin RSS 提要

MYSQL:使用字母数字 Id 在特定值之后选择接下来的 100 行

Git 作为 mercurial 客户端?为什么没有 git-hg?

git - 防止 git 提交者创建某些目录